Skills
Skills, with proof
Every skill in the six groups links to where you can try it, see it or check it. Skills from employer work that I cannot show are listed separately and marked.
Short on time? Check my claims in 5 minutes
- Try it
- Runs now, in your browser or on a live app. 14 links
- See it
- A real screenshot, recording, figure or table on this site. 24 links
- Check it
- Public code, a package page, or a measured number with its source. 37 links
Agents and LLM systems
MCP servers and tool calling
An MCP server on this site serves my profile, projects, skills and résumé blocks to agents; TraceRazor serves its audits over stdio MCP.
LangGraph agent pipelines
Seven agents in a LangGraph state machine with a retry loop decompose, search, scrape and verify each claim in ClaimLens.
LangChain and the OpenAI SDK
GPT-4o-mini agents on LangChain and the OpenAI SDK split text into atomic claims, write search queries and score relevance in ClaimLens.
Agent trace auditing
TraceRazor, the Rust auditor I built, names the avoidable work in an agent trace and calls nothing a saving until the same task is rerun and still passes.
Adversarial guardrail testing
Assay fires 20 or more adversarial probes across six failure categories at an agent in a sandbox that never executes, and a tripwire catches the forbidden call.
Fine-tuning transformers in PyTorch
Fine-tuned a 184.4M-parameter DeBERTa-v3 NLI model for ClaimLens and published the weights on Hugging Face.
Evaluation
Held-out evaluation and error analysis
Measured the deployed PPE detector on 255 held-out images (mAP50 0.468, not the 0.62 to 0.64 from validation) and traced 44 percent of its misses to the 0.5 threshold.
Benchmarks against baselines
Measured the ClaimLens model at 65.8 percent against 59.4 percent for a zero-shot model of the same size, and the evaluation found a label swap in the app code, now fixed.
Agent evaluation at pass^k
Assay certifies an agent only when every held-out rerun clears the bar: one CLI run scored a mean of 0.800 against a 0.800 threshold and still came back Do not ship.
Paired reruns with bootstrap CIs
My first TraceRazor fix raised token use by 5.6 percent on 12 live runs; I published that, rewrote the fix, and the second round measured 0.7 percent fewer tokens.
Pre-registered studies with an LLM judge
A 50,000-record study with its gate fixed before the run: judged substitutability peaked at 12.8 to 15.3 percent against a 70 percent bar, so the decision was Abandon.
Leakage checks on test splits
Found 40 PPE test images whose filenames also appear in train and measured the score without them: mAP50 0.462 against 0.468.
Computer vision
Object detection with YOLO
A YOLOv8 PPE detector served through FastAPI, with a compressed copy that runs in your browser; at Louis Dreyfus Company, YOLO detection of objects in field video.
Multi-object tracking (BoT-SORT)
Built a YOLO and BoT-SORT pipeline that counts each object once in field video, and traced over-counting to duplicate tracks, not detector error.
Pose estimation (MediaPipe)
MediaPipe's 33 pose landmarks confirm that each detected PPE item sits at the right body location before it counts.
OpenCV
Part of the PPE compliance backend, alongside FastAPI, Ultralytics YOLOv8 and MediaPipe.
Grad-CAM
Used with the ResNet-18 helmet classifier in the PPE project's first phase, which reached 92.22 percent test accuracy.
RAG and retrieval
Hybrid retrieval with reranking
AgenticPDF routes a query by document summaries, fuses dense and BM25 scores with reciprocal-rank fusion, and reranks with a cross-encoder, all on one machine.
On-device embeddings and reranking
bge-small-en-v1.5 embeddings and an ms-marco-MiniLM cross-encoder run on device through transformers.js, with no API key needed in offline mode.
Web evidence retrieval
ClaimLens writes 2 to 5 targeted queries per claim, scrapes up to 5 at once, and keeps the top 5 pieces by relevance before the verifier votes.
Embeddings, UMAP and HDBSCAN
OsciWriting embeds prompts with all-MiniLM-L6-v2 and clusters them with UMAP and HDBSCAN to test whether a semantic cache could serve them.
Backend and full stack
Next.js, React and TypeScript
GuideMeSG streams a traveller's location to a caregiver's map, and the résumé builder on this site composes a résumé from approved blocks in your browser.
TypeScript APIs and document generation
The résumé engine and MCP server behind this site are TypeScript on Vercel Functions: résumés are composed only from approved blocks and rendered to PDF, Word and Markdown.
Server prerendering and build gates
Every route on this site is rendered to HTML at build time from the same React tree the browser hydrates, and the build fails when a skill's proof link does not resolve.
FastAPI services
The Assay examiner, the PPE compliance backend and the ClaimLens API with server-sent events are FastAPI services.
Supabase and PostgreSQL
Location pushed every 3 seconds over Supabase Realtime in GuideMeSG, and a Third Normal Form PostgreSQL schema on Supabase for EduQuery SG.
SQL analytics and MongoDB
Six analytics endpoints with CTEs and window functions over PostgreSQL, and user activity logged to MongoDB, behind one Express API.
Rust
TraceRazor's audit core is Rust, tested by 10 Rust test files, with clippy run with warnings denied on every push.
Singpass login in a live civic product
Churp, the Tengah garden-balloting platform, is live with Singpass login; I led the nine-volunteer team as Product Lead.
Deployment and model optimisation
Model quantisation (int8 ONNX)
Quantised the PPE detector to int8 ONNX, about 4x smaller, with held-out mAP50 0.455 against 0.461 in fp32.
In-browser inference (ONNX Runtime Web)
The PPE detector runs on your device with onnxruntime-web: nothing downloads until you ask, and the photo never leaves the tab.
CI and release automation
TraceRazor runs cargo fmt, cargo test, clippy, cargo deny and pytest on every push and ships wheels with checksums and SBOMs; Assay ships a GitHub Action that fails a build on a failing verdict.
Serverless deployment
This site's MCP server and JSON export run as Vercel Functions, and GuideMeSG is deployed on Vercel.
Used at work, not shown publicly
Skills from employer work. They are described on the Experience page; the code and data are covered by confidentiality, so there is nothing here to try, see or check.
- Azure MLDeployed the field-video counting pipeline on Azure with on-demand GPU inference.Described: on Experience, under confidentiality
- Dataset annotation and leakage-safe splitsLed annotation across 7 datasets (10,000+ images) and re-split validation by camera and site to stop leakage.Described: on Experience, under confidentiality
What I am building next
Gaps employers often name. None of these is claimed anywhere on this site until it can be shown.
- A deployment service with CI and monitoringA model behind FastAPI in Docker, deployed, with CI, monitoring and a load test.Not yet shown
- A C++ port of the PPE detectorONNX Runtime in C++, with a latency table.Not yet shown
- ROS 2A detector node sending a navigation goal in simulation.Not yet shown