Workshop
Personal projects
Personal projects, built on my own time.
Wingman
RustWin32Ollama
Wingman is a Windows app that sits behind the Copilot key. Press the key and it screenshots the active monitor, sends it to a vision model, and shows the answer on a small card in the corner. There is no chat window.
It ships more than two dozen built-in actions, among them Check my work, Add event from screen, Review this email and Fill this form. Each action is a short definition of a prompt, the inputs it reads and the executor allowed to act on the result. The latest release is v0.3.0, from 1 November 2026.
It can use OpenAI, Anthropic or Gemini with your own API key, or a local model through Ollama, and keys live in Windows Credential Manager rather than a config file. One rule is permanent: Wingman fills, drafts and proposes, but never presses Send, Submit, Buy or Pay.
In Offline mode, the app blocks every network call that would leave the machine before a connection opens. That rule is enforced in the code itself.
1 / 2
| Measurement | Result |
|---|---|
| Executable size | 4.6 MB, inside a 4.65 MB budget |
| Idle footprint | about 22 MB of memory, 0% CPU until pressed |
| Offline mode | blocks every network call that leaves the machine |
Syringe Pump
C++ArduinoAccelStepperGoogleTest
A syringe pump I designed and built from scratch. A NEMA 17 stepper motor turns an 8 mm lead screw that pushes the plunger, so the step rate sets the flow rate directly.
The Arduino firmware drives the motor through an A4988 driver at 1/16 microstepping using AccelStepper. An LCD shows the flow rate and the time remaining. A knob sets the rate during a run, and a limit switch and LED interlocks stop the pump at the end of travel. The pump math and the control logic are unit tested on a PC.
1 / 8
| Measurement | Result |
|---|---|
| Flash used | 14,426 of 32,256 bytes (44%) |
| RAM used | 791 of 2,048 bytes (38%) |
| Steps per revolution | 3,200 |
| Flow rate range | 0 to 7.5 mL/min, 0.1 mL/min steps |
| Unit tests | 40, all passing |






