// en garde

Leo Zhou

CS @ Rice · former captain, NZ junior fencing team.

I build ▍

🤺 fencing 🥁 drums ♟ ~2000 chess.com 🧱 lego

blundernet.com is live ↗ chess puzzles and bots, roughly 200 people playing

vestigo.earth is live ↗ where a photo was taken, and how much to believe it

LinkedIn ↗ GitHub ↗ Résumé ↓

Leo Zhou
the Parisian · Macau 🇲🇴

01 · origin

Guess where I'm from

1 🐑 🐑 🐑 🐑 🌿 🌿
0 countries been not yet

0 points · it was Auckland, New Zealand · the bollard gave it away

Grew up in Auckland, spent most of my teens fencing for the national team, which is what most of those pins are. Now at Rice studying computer science, graduating May 2028, 3.92 GPA so far.

I only switched into CS recently, after starting out in Electrical and Computer Engineering, so I've had a fair bit of catching up to do. The engineering background still shows in what I like to build: firmware, tiny ML models, real-time systems, and lately full products people can actually use.

The bollard habit turned into a project. Vestigo is an agent that geolocates a photograph and has to cite the evidence for every claim it makes, which is the same game with the guessing taken out. It is live at vestigo.earth.

  • 🎓 CS @ Rice · 3.92
  • 🌏 English · Mandarin · Spanish
  • ✈️ 22 countries, 4 continents
  • 🔌 started in ECE, switched to CS
NZ roadside bollard, front and back
the giveaway: NZ bollards, front & back. study it.

02 · fencing

Ten years fencing

0national first places
0+ NZ & Oceania titles
0+ young fencers coached
0national teams captained

🌍 World stage

Cadet, junior, and senior level for New Zealand: World Championships, World Cups, Junior Commonwealth Games.

🥇 Captaincy

Led the junior and cadet national teams, and took the junior team to an Oceania title.

🤝 Coaching

Coached 30+ young fencers and refereed 50+ bouts. Still in it: I'm co-president, coach and website manager for the Rice Fencing Club.

off the piste · back home in Auckland

🔭

Physics Pathfinders president · 2023-25

Student-led charity taking hands-on physics workshops into schools that had no equipment to run them. I led the team, designed and prototyped the experiments we taught, and handled teacher outreach. 600+ students across 22 schools.

🧭

Kristin School intl. student coordinator · 2024

Two friends and I built a resource hub for incoming international students: videos and guides on New Zealand culture, virtual campus tours, and the practical school information nobody hands you.

03 · skills

Play me

Every white piece is something I work with. The real engine is on blundernet.com, with 3.25 million puzzles and a bot ladder.

04 · work

Gates cleared so far

Sep 2026 → present

KEWW · Software Engineer

Houston · part-time

Building Cashew at Westchase Hospitality Group: an event-document studio with 32 editable templates and six linked document types. Gemini extracts event details with source quotes for staff to review; code handles the prices, and issued documents keep their original figures after later edits. I'm also building a client portal so event details and tasting choices can come straight from the client. Historical email search and reviewed marketing agents are the next part.

Next.js · TypeScript · Postgres · agents

Sep 2026 → present

RiceApps × Rice Football · Software Developer

Rice Football Analytics

Building a shared data backend for Rice Football's analytics team, with each record's source tracked. I'm working on Python and R access so analysts can reuse their analyses, and designing cloud report runs for coaches. The API foundation is in development; vendor ingestion and the reporting system are still ahead.

Python · R · data pipelines · cloud reports

Aug 2026 → present

Rice University · Undergraduate Research Assistant

Houston · Prof. Jiarong Xing

Investigating how collaborating AI agents can exceed access policies for a systems-security proposal. Before that I worked on TokenGate, a Swift macOS usage tracker. OAuth refresh ended daily re-logins, SSH transcript sync brought remote sessions back into view, and stable app signing stopped repeat Keychain prompts. Its self-tests grew from 120 to 147 checks.

agent security · Swift · OAuth · SSH

Jun 2026 → Aug 2026

CanSemi · SWE Intern

Test Engineering Team

Six test engineers used the Python/Postgres pipeline I built to replace manual log processing. It parsed 500+ binary test-equipment logs and loaded 40 wafer lots (roughly 12,000 records) in under two minutes. Eight FastAPI endpoints and a React/Canvas wafer map gave them searchable results and drill-downs, cutting report turnaround by about 75%.

Python · FastAPI · PostgreSQL · React

Apr 2026 → Jun 2026

Inkstone Technologies · SWE Intern

Remote

ABC Reads, a native Swift/SwiftUI reading app that adapts to each reader's known vocabulary. On-device Apple Vision OCR overlays pronunciation only on Chinese characters you haven't learned yet. Underneath: a Python pipeline that frequency-ranks a 113,000-entry dictionary into indexed SQLite, and a local-first store on SQLite's raw C API driving spaced-repetition review and a WidgetKit widget.

Swift · SwiftUI · Vision · SQLite · Python

Oct 2025 → Apr 2026

Rice Wind Energy · Embedded

Houston

ESP32 firmware for a three-phase wind turbine controller: RPM, power and pitch sensing, a six-state safety state machine, and peak-power tracking.

C/C++ · ESP32 · control systems

Nov 2025 → Feb 2026

A-Lab @ Rice · Research

Houston

COMSOL simulations for a solar thermal desalination project: parameter sweeps and analysis to push model efficiency.

COMSOL · simulation

Jun 2025 → Jul 2025

Epal Electrical · EE Intern

Auckland

First engineering job, on the design team for large commercial buildings. Load calculations, circuit sizing, wiring and conduit selection against AS/NZS 3000:2018, plus site inspections checking installed work against the plans. Working to a written standard was the useful part: every choice had to hold up against a specific clause, not against what felt reasonable.

AS/NZS 3000 · load calcs · site work

05 · projects

Brick by brick

BlunderNet ↗

live at blundernet.com, roughly 200 players

I made LeetCode for chess. There are 3.25 million puzzles with five filters I can combine, a bot ladder, and a classroom mode where a coach sends a position and sees answers grouped by move. Stockfish review grades a move by the winning chances it cost. Every position is written out for a screen reader too.

The backend became a project of its own. Uniform puzzle selection went from 1.4 s to 0.9 ms with indexed shuffle keys and size-weighted cells. The live site runs on one EC2 box. I also built a separate Terraform deployment with stateless Go APIs, Redis game state and SQS-fed ONNX workers: a steady load test returned 270/270 replies at 1.5 games/s, with 1.25 s p95. A separate queue test scaled workers from one to four and drained the backlog. Heavy puzzle filters still need attention; the latest live check missed their latency target.

Go · AWS · Terraform · Postgres · Redis · ONNX · k6

BlunderNet Engine ↗

the network and the search

AlphaZero-style engine: residual CNN with policy and value heads, PUCT Monte-Carlo tree search written in C++ and bridged to Python with pybind11 for a 1.8× speedup. A scheduled GitHub Actions pipeline runs the whole cycle without me, pulling fresh games from the top Lichess blitz players, retraining, and evaluating. Self-play feeds back in too, though the supervised stream is what does most of the work so far. Strength gets checked against held-out move prediction, a 1,200-puzzle tactics suite, and matches versus Stockfish.

PyTorch · C++ · pybind11 · GitHub Actions

Vestigo ↗

live at vestigo.earth, where was this photo taken and how do you know

An agent that tells me where a photo was taken and how much to believe it. Every claim cites evidence on its board, and a street-level answer needs street-level evidence. I care about whether its confidence matches its accuracy: being confidently wrong about a country is a fairly impressive way to lose GeoGuessr.

I trained its classifier on 64,865 street-level images, split by location so nearby photos cannot appear on both sides of the evaluation. Swapping CLIP ViT-L/14 for SigLIP reduced median error from 198 km to 142 km, with 51.6% cell accuracy and 3.7% calibration error after temperature scaling. The agent and classifier are evaluated separately; those are classifier results.

Python · LLM agents · tool calling · PyTorch · CLIP/SigLIP · eval harness · pytest

From Scratch ↗

hackrice 16, three of us · 1,047 things, each with a source

A crafting game we built at HackRice 16. Start with stone, wood and plant fibre, combine two, and work towards 1,047 things, each with a source. The aluminium can traces twenty-two ancestors back to a stone and a stick. There are five small worlds now, each with a kit to make from scratch.

The recipe graph runs offline in the browser. Rules explain failed combinations locally; Gemini is only called for extra explanations. Hints come from the graph's solver. Citations distinguish human review from automated checks, and environmental figures require a source someone has read.

React · TypeScript · Vite · Vercel · Gemini · Playwright · k6

also on the shelf

SeatLive ↗

two people, one seat, one winner

Atomic conditional updates and Redis holds that expire on their own. CI fires 50 concurrent requests at one seat every build and fails unless exactly one wins.

FastAPI · PostgreSQL · Redis · Docker

Edge-ML audio ↗

55× smaller, still listening

3.9 MB classifier down to 71 KB via distillation, INT8 quantization and pruning. 416 ms inference on a $5 microcontroller.

PyTorch · TFLite Micro · ESP32-S3

STM32 controller ↗

bare metal, no HAL

Every driver written against the reference manual. PWM checked on a logic analyzer with the motor spinning both ways; encoder feedback, PID and binary UART telemetry are written and waiting on hardware bring-up.

Embedded C · STM32 · bare metal

Quant-Signals ↗

falsification-first research

Pre-registered hypotheses and kill criteria. Falsified 20-day momentum (gross Sharpe −0.49) with a cost-aware, leakage-tested backtester.

Python · DuckDB · GitHub Actions

🔧 on the workbench

🗄️

LSM storage engine

memtable, WAL, SSTs, compaction, and a harness that kills the process mid-write to prove no acknowledged write is lost

🧭

Vestigo, next

letting outside evidence move the answer, not only cap how precise it is

🔐

Agent security

working out how a group of individually restricted agents can still exceed the policy between them

"I only work in black. And sometimes very, very dark grey."

06 · terminal

Ask me anything

leo@portfolio — zsh — 80×24

07 · outro

Contact me!!

Avid drummer, Rockschool grade 8. Rock, metal, and jazz.

 

1-9 · kshc