# jacklau.dev — full text Every page of jacklau.dev as plain text, for LLMs and agents. Index: https://jacklau.dev/llms.txt --- # Jack Lau URL: https://jacklau.dev/ Software Engineer @ ![Songscription] Songscription CS+AI ![Iowa State] Iowa State University; Carver Scholar (Full Tuition) what i'm up to: ↳ Pickleball and Lifting ↳ reading and learning new topics ↳ Opensource to various projects I find interesting previously: ↳ Claimable software engineer, helping patients win denied insurance claim appeals ↳ Arzana (YC P26) forward deployed software engineer ↳ John Deere data engineer, data products with PySpark & Databricks ↳ SpeechStream real-time speech processing platform, acquired March 2025 ↳ Sneaker Botting, VPS/Server Hosting, Video Game Botting [see what i've built](https://jacklau.dev/projects) --- # Blog - Jack Lau URL: https://jacklau.dev/blog [Ratchet Jul 18, 2026](https://jacklau.dev/blog/ratchet) [Reflecting on 2025 Dec 30, 2025](https://jacklau.dev/blog/reflecting-on-2025) --- # Ratchet - Jack Lau URL: https://jacklau.dev/blog/ratchet [← Back to blog](https://jacklau.dev/blog) # Ratchet July 18, 2026 A few months ago I bricked my own computer during a thunderstorm. I was updating the BIOS, the low-level firmware that runs before the operating system loads, and the power cut out partway through the flash. If you lose power in the middle of writing firmware, you corrupt it. That's what happened. When the power came back, the machine didn't. No POST, no display, nothing on screen, just fans spinning. The BIOS chip was corrupted and the board wouldn't boot. The easy fix was to RMA the board or buy a new one. I wanted to know if I could repair it myself, so I started reading about how BIOS recovery actually works. That turned into a project I've been building since: [Ratchet](https://github.com/jackulau/ratchet). ## Down the repair rabbit hole The BIOS lives on a small SPI flash chip soldered to the motherboard. To repair it you talk to that chip directly: read what's on it, back it up, erase it, and write a known-good image back. The common tool for this is a CH341A, a USB programmer that costs about three dollars on AliExpress and speaks SPI. Getting the hardware was easy. The software was the problem. Almost everything that drives a CH341A (AsProgrammer, NeoProgrammer, the CH341A utilities) is Windows-only, built around a GUI, and close to ten years old. You download an .exe from a forum, click through an old interface, and hope it works. There's no way to script it and no structured output. I hand most of my repetitive work to agents now, and none of this could be driven by one. I was clicking through an app older than some of the chips I was trying to read. ## The chip had no legs The chip made it harder. I assumed it was an SOIC8, the eight-legged package you can clamp onto with a test clip. It wasn't. It was a WSON8. Same eight pins, but no legs. The contacts are flat pads underneath the package instead of legs on the sides, so a clip has nothing to grab. That left two options. Desolder the chip and drop it into a socket, or hold a pin probe against the pads by hand. I didn't have a soldering iron with me, so I went with the probe. ![A hand pressing a yellow WSON8 pogo-pin probe, with a rainbow ribbon cable trailing off across a wood floor] The probe I held by hand. Eight spring-loaded pins that have to sit flat on the pads and stay there. There was also a voltage problem. The chip runs at 1.8V and the CH341A puts out 3.3V, which is enough to damage it, so I needed a level-shifting adapter in between. And I only had a MacBook, which is USB-C only and can't run any of the Windows software anyway. The setup ended up being a CH341A, a 1.8V adapter, the WSON8 probe, and a USB hub to connect it all to the Mac. ![The full programming setup: a CH341A programmer on a green PCB, a 1.8V level-shifting adapter, the WSON8 probe, and a silver USB hub] The full setup: CH341A programmer, 1.8V adapter, WSON8 probe, and a USB hub to reach the MacBook. ## How it all connects Everything hangs off the black ZIF socket on the CH341A, the one with the little lever. Look next to it and the board has two rows printed on the silkscreen, one marked 25 and one marked 24. Those are the two chip families the programmer handles. The 25 row is for 25-series SPI flash, which is what a BIOS chip is. The 24 row is for 24-series I2C EEPROMs. For a BIOS you work off the 25 side. The 1.8V adapter is a small board that seats into that socket on the 25 side. The CH341A drives the socket at 3.3V, which is fine for most flash but too high for a 1.8V part, so the adapter sits in the middle and steps the supply and the data lines down to 1.8V. You lift the lever, line the adapter's pins up with the 25 row, drop it in, and press the lever back down to clamp it. The one thing you cannot get wrong is pin 1. Every part in the chain has a pin 1, and they all have to point the same way: the socket, the adapter, the ribbon cable, the clip, and the chip. The chip marks it with a dot or a notch in one corner. The ribbon cable marks it with the red stripe running down one edge. If the orientation is flipped anywhere along the line, the best case is that you read nothing back, and the worst case is that you put voltage on the wrong pins and kill the chip. From the adapter, the rainbow ribbon cable runs out to whatever grabs the chip. For a normal SOIC8 that is a spring clip: you line the red wire up with pin 1, clamp the clip over the chip, and the sprung contacts bite onto the eight legs. For the WSON8 I had there are no legs to clamp, so the ribbon ends in a probe with eight pogo pins instead. You set the pins down onto the pads, keep the same pin-1 orientation, and hold it there. Same signal path, just held by hand instead of clipped on. The USB-A plug on the CH341A goes into the hub, and the hub into the MacBook. So the full chain is Mac, hub, programmer, 1.8V adapter, ribbon cable, probe, chip. Once the pins make contact, Ratchet can see the chip and read its ID back, and from there you can read, back up, and write it. ## Why it's called Ratchet Holding a probe against a chip by hand is as unreliable as it sounds. The pins lose contact at the smallest movement. Losing contact during a write is the worst case, because SPI flash is written one page at a time and a half-written page is corrupt. A dropped connection mid-write would put me right back where the storm left me. The real problem was how to write to the chip safely when the connection can drop at any moment. What worked was to back up the chip before changing anything, erase and write in fixed blocks, verify each block right after writing it, and when the connection dropped and came back, pick up from the last block that verified. Don't rewrite blocks that are already good, and don't leave one half-done. That behavior is where the name comes from. A ratchet turns one way and holds where it is when you let go. Each block that verifies stays done, no matter how many times the probe loses contact. ## Building it for agents Once writes were safe, the original problem was still there: the tooling assumed a person clicking a mouse. So I built Ratchet to be driven programmatically, and mainly by agents. It's written in Rust, with its own libusb layer to talk to the programmer, a database of 806 chips for identification, and full read, write, verify, and erase cycles with automatic backups before a write and verification after. The part I use most is the built-in MCP server. It exposes 31 tools over JSON-RPC: detect the chip, read it, diff it against a backup, write with retry, analyze the BIOS image. That lets an agent like Claude run the recovery. I give it the goal and it handles a failed verify or a dropped block on its own. On the SPI-flash side it replaces AsProgrammer and NeoProgrammer, and it covers work that's normally spread across separate command-line tools like flashrom, avrdude, esptool, stm32flash, and OpenOCD, behind one interface an agent can use. ## Past the BIOS Once I could talk to one chip, I kept going. The same interface works for more than SPI flash, so I added I2C, UART, 1-Wire, JTAG, SWD, CAN, and passive SPI sniffing. Then programmers for AVR and Arduino bootloaders, 24-series and 93-series EEPROMs, ESP32 and ESP8266, and STM32, plus a logic-analyzer mode that exports to Saleae and sigrok. The idea behind all of it is the same. Most hardware is scriptable, but the tools around it still expect a person with a mouse and a Windows machine. If you make the low-level operations structured, recoverable, and callable by an agent, a lot of hardware work that used to be tedious becomes automatable. ## What a dead motherboard taught me I'm still not sure the storm was a bad thing. I lost a working computer and a few weeks to a problem I caused. But I ended up with a tool I actually use and a much better understanding of how flash memory and these protocols work. Buying a new board would have been faster. I'm glad I didn't. Ratchet is open source and [on GitHub](https://github.com/jackulau/ratchet). --- # Reflecting on 2025 - Jack Lau URL: https://jacklau.dev/blog/reflecting-on-2025 [← Back to blog](https://jacklau.dev/blog) # Reflecting on 2025 December 30, 2025 Last year, I kept my reflection private. This year, I'm writing publicly, partly for accountability, partly to document my thinking. If there's one thing 2025 taught me, it's that you learn by building, not by consuming content that masquerades as education. I've been reading a lot this year: Nassim Taleb on embracing uncertainty rather than predicting it, Andrej Karpathy on understanding systems by building them from scratch, Scott Alexander on probabilistic thinking and epistemic humility. They've shaped how I approach problems. ## On learning by doing STAT 305 was the hardest course I took this year. Bayesian statistics felt abstract until I started implementing it in OCaml for the Jane Street Advent of FPGA competition. There's something about encoding probability distributions in a functional language that forces real understanding. You can't handwave through code. Writing functions that manipulate uncertainty made the theory click in a way lectures never did. This connects to something Karpathy emphasizes: real learning isn't frictionless. It should feel like mental sweating. The "Learn X in 10 minutes" videos are entertainment, not education. Deep understanding comes from allocating real time blocks, taking notes, rebuilding concepts in your own words, and most importantly, building actual things. ## On uncertainty and antifragility Taleb's ideas about antifragility resonated with me this year. Some things benefit from volatility and randomness. The barbell strategy (playing it safe in some areas while taking asymmetric bets in others) maps well to how I'm thinking about 2026. Stable academic performance, experimental side projects. Low-risk foundation, high-upside exploration. More fundamentally, I'm learning to make peace with uncertainty rather than trying to predict outcomes. I can't know how things will turn out with research applications or projects. But I can position myself to gain from unexpected opportunities and avoid catastrophic downside. ## On probabilistic thinking Scott Alexander writes about epistemic learned helplessness: the recognition that on most topics outside your expertise, confident arguments can be equally convincing whether they're right or wrong. The solution isn't to become paralyzed, but to think probabilistically. Assign rough confidence levels. Update based on evidence. Recognize when you're reasoning versus rationalizing. ## What actually mattered The moments I'll remember aren't the accomplishments. They're studying with friends until the library closed. Orientation week chaos. Poker nights. The people I met through research, hackathons, open source work. I'm grateful for everyone I've connected with this year and everyone I've grown alongside. I'm equally grateful for the people I've drifted from. Sometimes letting go is as important as holding on. ## Looking ahead to 2026 Every six months I barely recognize who I was half a year ago. So I'm cautious about predictions. But here's what I'm thinking about: - Just build things. Stop overthinking outputs. Build for the sake of learning and exploring possibilities. The act of doing matters more than the result. - Keep solving problems. Lately I've been doing LeetCode out of genuine enjoyment rather than interview prep grind. I hope that continues. - Learn deeply. Right now I'm interested in probability, uncertainty, and how Bayesian thinking applies to decision-making under incomplete information. - Improve time management. I had more free time this year than I realized but often slipped into low-priority tasks instead of meaningful work. - Participate in hackathons. Build more, ship more. - Meet new people. --- # Projects - Jack Lau URL: https://jacklau.dev/projects # Projects ### Prism Creator, Sep 2024 to Present. Open-source, self-hosted AI web agent with multi-provider LLM support (OpenAI, Anthropic, Google, Ollama). Includes GitHub OAuth, sandboxed Docker tool execution, AES-256 encrypted API key storage, and a React chat interface. Go/Fiber backend, TypeScript frontend. Built with Go, React, TypeScript, Docker, SQLite. [Prism source](https://github.com/jackulau/Prism) ### PrismaVoice Developer, Mar 2026 to Apr 2026. On-device voice-to-text for macOS, based on Hex. Press-and-hold a global hotkey to record, then transcribe and paste into any app. Uses Parakeet TDT v3 and WhisperKit for fully local transcription with no cloud dependencies. Built with Swift, TCA, WhisperKit, macOS. [PrismaVoice source](https://github.com/jackulau/PrismaVoice) ### Coda Creator, Mar 2026 to Present. Custom IDE built on Tauri. Acts as middleware between a Rust/Tauri native binary and AI assistants (Claude Code, OpenAI Codex) via Unix-socket JSON-RPC 2.0. Manages Git checkpoints, custom MCP tools, and session orchestration. Built with TypeScript, Node.js, Tauri, MCP. [Coda source](https://github.com/jackulau/coda) ### ftc-mcp Creator, Feb 2026 to May 2026. MCP server that gives AI coding assistants deep knowledge of the FTC Robot Controller ecosystem. Injects 9,500+ lines of verified FTC documentation, Pedro Pathing APIs, and working code examples so teams can ship competition-ready Java with their assistant of choice. Built with TypeScript, MCP, Java, FTC. [ftc-mcp source](https://github.com/jackulau/ftcMCP) ### EchoMap Creator, Apr 2026 to May 2026. Desktop acoustic visualization tool. Loads STEP geometry or builds scenes in-app, places sound sources and listeners, ray-traces propagation across frequency bands, and inspects the result on a 3D heatmap. Also ships a robot-control surface with a boxing-humanoid scenario, generic n-DOF arm, WebSocket agent protocol, and plugin loader. Built with Rust, Acoustics, Robotics, STEP. [EchoMap source](https://github.com/jackulau/Echomap) ### MacRecorder Creator, Oct 2025 to Dec 2025. Macro recorder for macOS. Records and replays mouse and keyboard events with window-specific recording, live window preview thumbnails, ghost actions that target background windows without focus, adjustable playback speed from 0.1x to 5x, and a visual event timeline with editable delays and positions. Built with Swift, macOS, Accessibility API. [MacRecorder source](https://github.com/jackulau/MacRecorder) ### Yoinka Creator, Feb 2026 to May 2026. Job search platform aggregating listings from over 1,600 US companies. Real-time search, configurable filters, and an adapter system for integrating various data sources. Go backend with a modern web frontend. Built with Go, Docker. [Yoinka source](https://yoinka.com) ### ParkBot Creator, Mar 2026. Automated parking permit purchasing bot for Iowa State with a native desktop GUI. Drives Chrome via go-rod for the actual purchase, has a dark Fyne interface, a lock file to prevent accidental double purchases, and keyboard shortcuts for save, run, stop, and clear log. Built with Go, Fyne, go-rod. [ParkBot source](https://github.com/jackulau/ParkBot) ### ProxyClient Creator, Dec 2025. Desktop application for testing and managing proxy servers. Bulk imports from text, CSV, or JSON, tests with configurable timeout and concurrency, shows real-time working, slow, and failed counts, and exports in multiple formats. Cross-platform via Tauri and React 19. Built with Tauri, React, TypeScript, Tailwind. [ProxyClient source](https://github.com/jackulau/ProxyClient) ### X Terminal Creator, Dec 2025. Terminal-based client for X.com (Twitter). Browse your timeline, post, like, repost, and reply directly from the terminal. No API keys required since it logs in with a regular X.com account. Session persistence, interactive keyboard navigation, and full search. Built with Python, TUI. [X Terminal source](https://github.com/jackulau/xterm) ### MultiInstance Creator, Dec 2025. Cross-platform desktop app for running multiple instances of single-instance apps. Uses separate APPDATA and HOME directories for process isolation. Per-instance resource allocation (CPU, RAM), real-time monitoring, and profile presets. Built with Rust and egui. Built with Rust, egui, SQLite. [MultiInstance source](https://github.com/jackulau/MultiInstance) --- # Work - Jack Lau URL: https://jacklau.dev/work # Work ![Songscription logo] ## Songscription Aug 2026 to Present Software Engineer Help musicians turn any song into sheet music, MIDI, tabs, and piano rolls in minutes, the “Shazam for sheet music”! Backed by Reach Capital (and others including Emerge Capital, 10x Founders, Dent Capital, and advisor Ron “Bumblefoot” Thal). ![Claimable logo] ## Claimable May 2026 to Aug 2026 Software Engineer Help patients fight denied insurance claims and win their appeals! Backed by Mark Cuban, Humanrace Capital, Quiet Capital, Walkabout Ventures, and Next Level Ventures. Doing a bit of infrastructure development, devtooling, reading, engineering, brainstorming, storytelling, medical writing, and advocacy. Tons of fun and learning (and beating insurance denials!!!). ![Arzana (YC P26) logo] ## Arzana (YC P26) Mar 2026 to May 2026 Forward Deployed Software Engineer Build the future of automation for manufacturers stuck on legacy office systems. YC P26, pre-seed, joined as the 3rd engineering hire pre-Demo Day. ![NASA logo] ## NASA Jan 2026 to Present Researcher (Machine Learning, Jan 2026 to May 2026) → Mission Concepts Academy (Summer 2026), Lucy Mission Autonomous rover terrain traversal and lunar sampling. Machine learning and data engineering. ![John Deere logo] ## John Deere Jan 2026 to Mar 2026 Data Engineer Joined the Quality Analytics team, building and maintaining data pipelines over huge volumes of manufacturing data. Designed ETL processes, ran data quality checks, and supported analytics projects that improve operations on the production lines. Built with PySpark and Databricks. ![Iowa State University logo] ## Iowa State University Aug 2025 to Feb 2026 Undergraduate Researcher Developed AI evaluation framework for LLM question-answering performance on scientific literature using BERTScore. Conducted statistical analysis (Friedman χ² = 15.54, p = 0.008) with semantic similarity via sentence transformer embeddings, measuring accuracy rates from 8.3% to 30%. ![CrownLabs logo] ## CrownLabs 2024 to Present Founder Building consumer apps. ![SpeechStream logo] ## SpeechStream Feb 2021 to Mar 2024 Founder Real-time speech processing platform. Acquired March 2025. ## Iowa Council of Teachers of Mathematics Jun 2023 to Jun 2024 Data Scientist Built NLP entity-matching pipeline merging 5,000+ educator profiles from 20+ Iowa districts, cutting runtime by 85%. ![FIRST Robotics logo] ## FIRST Robotics 2021 to Present Mentor Programming & Outreach Lead for Team 18397. Mentored 13 teams, founded 3 internationally. 2× World Championship contender. ![Waukee APEX logo] ## Waukee APEX Aug 2024 to Feb 2025 Engineering Associate Featured in KCCI 8, Des Moines Register, WHO 13. Scrum Master for community mini-forest signage project. ![Samurai Sushi & Hibachi logo] ## Samurai Sushi & Hibachi 2017 to 2024 Assistant Manager Managed daily operations for 200+ customers. Led social media with 90K+ monthly reach. Built catering software.