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
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.
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.
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.
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.
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.
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.
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.