Node-DBF
A fork of node-dbf, rewritten in TypeScript, that reads Visual FoxPro DBF files row by row. It adds the float and integer field types FoxPro uses, which the upstream parser did not support.
Founding engineer at Skuno. Mechatronics and Robotics Engineering student at Oakland
University. Avid FIRST Robotics volunteer.
I have chronic engineer brain and come up with a solution for every minor inconvenience. They are all documented in
the projects below.
Skuno is an operations and reporting platform for retailers running Microsoft Dynamics 365 Business Central. It puts modern tools on top of the systems a business already has, so there is nothing to rip out and staff pick it up quickly. I joined as a founding engineer in 2025 and work mostly on point of sale and business intelligence, with integrations into Windcave payment terminals, Business Central and Shopify.
A fork of node-dbf, rewritten in TypeScript, that reads Visual FoxPro DBF files row by row. It adds the float and integer field types FoxPro uses, which the upstream parser did not support.
A Chrome extension from 2018 that logged your browsing history to a Google Sheet, with charts of where you spent your time. A small PHP and Python backend kept the sheet up to date.
I've been volunteering with FIRST for 7 years, and in that time I've attended 78 events. I've made some things to help my events run smoother, and my job easier.
A field monitor and support tool for the technical crew at FRC events: FTAs, CSAs and scorekeepers. A Chrome extension on the field network reads the FMS and relays it to the cloud, so the field status is on everyone's phone instead of only the scoring table. Match logs are graphed per robot and can be shared with a team, CSA tickets and notes follow a team to its next event, and troubleshooting trees and a support chat built on the WPILib, REV and CTRE docs and past CSA threads help a volunteer who has not seen the problem before.
Software, calculators and CAD for FRC, FTC and FLL teams, plus off-season events on a map, practice fields, event photos, robot code and CAD by team, and grants. A crawler finds new listings and Claude sorts them, but a person approves each one before it goes public.
Live captions for event livestreams. Each microphone gets its own colour, and the captions show on screen as a vMix overlay or go straight to YouTube as closed captions on the stream.
3D-printed parts for the competition field: a mount for the Ethernet dongles and a nut retainer for the field gate handle.
The big-screen graphics at off-season events: match preview, live scores, the score reveal, rankings, alliance selection and the playoff bracket. It talks to the FMS directly and follows its video switch, so the scorekeeper runs it from the normal match controls. Each event gets its own theme, and it ships as a Windows app that updates itself.
Phone control for the TVs and projectors around an event. A thin client boots to a QR code, and scanning it opens a controller that switches each screen between an NDI feed, the FIM or Nexus queuing pages, a YouTube stream, any URL, or a remote desktop. Clients install and update themselves from the server.
Sharp team avatars for the audience display, in place of the 40px ones from FMS. Teams upload their own, or a different one for a single event, and each upload is approved before it goes live.
A podcast about FIRST Robotics. We release episodes on YouTube and Spotify and cover robotics events with live streams, like MARC. I am the editor in chief. I also built the pipeline that takes a finished edit from Google Drive to YouTube and Spotify, cuts shorts with captions, and tracks how each episode performs.
The power board for the station that programs team radios at events. Version 1 is built. Version 2 is a 4-layer board for the new radio, designed in loon: it detects 802.3at PoE or falls back to passive 12 V, and CR123A cells keep the radio powered if the USB-C supply drops during a firmware update.
A Makita robot vacuum I am retrofitting with a Raspberry Pi and an Arduino, about 40% done. The goal: a webcam reads AprilTags to find where the robot is, and it either follows a set path or plans the most efficient path over an area drawn in the web UI. Right now the Pi runs the drive, brush and fan motors, and I drive it with a gamepad from a web driver station, like an FRC robot.
Bought at a Copart auction in Florida with a rebuilt title. I fixed it up myself and have done all the maintenance since. Next up is dropping the engine and transmission this fall to do the clutch, fix an oil leak and catch up on everything else while it is out.
A Ryzen 9 box with an eight-drive array. It runs about seventy containers for me, my friends and a few FRC events, and hosts most of the projects on this page.
AI-driven electronics design. You describe a circuit and Claude builds it: it picks parts, places modules like a buck converter or an ESP32 core, lays out and routes the board, and checks it with KiCad's own DRC. The output is plain KiCad files, and a hardware probe lets Claude read and drive pins on the real board. I designed the radio kiosk in it.
One Claude that runs on my home server and knows everything I work on: every project, service and past decision. I manage my whole setup through its chat app from any device, and it pushes a notification to my phone when a job finishes or needs me.
Claude runs my team in an 8-team keeper league: the draft, weekly lineups, waivers and trades. Sleeper has no write API, so it uses Sleeper's own GraphQL endpoint. During the draft it announced its picks in the Discord voice channel.
Windows habits on macOS in one menu bar app: window snapping, a taskbar and Start menu, Alt-Tab with previews, clipboard history, a Ctrl and Cmd swap per keyboard, and screen capture to PNG, MP4 or GIF. Each fix is its own toggle.
An hourly log of what I am doing and how I feel, with end-to-end encryption. The key comes from the password through Argon2id and entries are sealed with XChaCha20-Poly1305, so the server only stores ciphertext. Android app with a Wear OS companion.
A Voron Trident 350 running Klipper, with a Rapido HF hot end and a Nitehawk toolboard.