Open to internships from Nov 2026

Sahil Menon

First-year Computer Engineering student at UNSW. This year I took part in Jane Street’s First-Year Trading and Technology Program in Hong Kong and finished in the top 10% of 22,000+ teams in IMC Prosperity 4. I build low‑latency C++ systems and tools for AI safety.

About

Who I am

I’m Sahil, a first-year Computer Engineering student at UNSW. Most of what I build sits close to the machine: a C++ matching engine, a SIMD maze generator, a probe that reads tampering out of a language model’s activations.

I like work I can check: latency against a baseline, a solver against a closed-form answer, a number against the page it came from. I’m looking for internships in software, systems, and AI, and I’m building toward robotics and physical AI next.

Outside of engineering, I led BuildingBloCS, Singapore’s largest student-led computing outreach program, which reached 3,000+ students across 70+ institutions.

Sydney, Australia · Australian permanent resident · Singapore citizen

Education

BE (Computer) (Honours)

University of New South Wales, Sydney

2026 – 2029

Raffles Institution

Singapore, 96th percentile

2024 – 2025

Open to

Software · systems · AI internships

Sydney or remote

Summer 2026–27: from late Nov · full-time 11 Dec – 12 Feb

Part-time during term, 2027

Summer 2027–28

Technical Skills

  • C / C++ / Python
  • TypeScript / JS / Java
  • React / Astro / FastAPI
  • PyTorch / Hugging Face
  • NumPy / Pandas / SciPy
  • AWS / Kubernetes / Terraform
  • Docker / Redis / CI-CD
  • SQL / Git / Linux

GitHub activity · last 6 months

Highlights

  • Jane Street First-Year Trading & Technology Program, Hong Kong: top 5 of 15 teams, Estimathon
  • Top 10% worldwide of 22,000+ teams, IMC Prosperity 4
  • Jane Street monthly puzzle solved, three months running
  • UNSW CSESoc Flagship Hackathon finalist
  • Completed UNSW EngSoc Applied Consulting for Engineers (ACE)

Experience

Jane Street

First-Year Trading & Technology Program, Hong Kong

Sep – Oct 2026
Top 5 of 15 teams, Estimathon
Top 5 of 20 teams, Widget Factory

Selected for a fully funded program for first-year students across Asia-Pacific. Placed top 5 of 15 teams in the Estimathon and top 5 of 20 in a round of the Widget Factory market-making game, pricing each decision by expected value and repricing as new information came in. Attended talks and panels with Jane Street traders and developers on how trading and technology teams work together.

Market Making Expected Value Estimation

BuildingBloCS

Overall-In-Charge

2023 – 2025
3,000+ Students Reached
$200K+ Sponsorships Secured
70+ Institutions

Led Singapore’s largest student-led Computing Advocacy Program, personally overseeing annual conferences of 1,000+ participants from 60+ schools. Secured $200,000+ from 30+ partners to fund industry expert talks, hackathon judging, and national-scale mentorship programs. Designed and delivered technical workshops, including AI Safety & LLM Prompting for 200+ participants and an advanced PyTorch deep-learning session.

Leadership Technical Workshops Sponsorship

Walled AI

AI Safety Researcher

2024 – 2025
50,000+ Benchmark Entries
6 months Research Engagement

Investigated LLM hallucination failure modes in context-based QA over a 6-month engagement under guidance from a research lead, finding blind spots in leading detectors such as Lynx when the evidence conflicts with what the model already knows. Built a 50,000+ entry knowledge-conflict benchmark from Wikipedia and Wikidata: each fact becomes a true claim and a perturbed one across 3 conflict types (misinformation, temporal, semantic), with supporting evidence generated by Llama 3.1 8B on vLLM.

AI Safety LLM Evaluation Python

Featured projects

ablate one direction: refusal 92.5% → 0%
PyTorchHugging FaceMechanistic InterpretabilityLoRARunPod / Docker

Aug 2026

The Refusal Stack

Finds where Llama-3.1-8B decides to refuse, removes it, then catches a model whose refusal was quietly trained away.

How it works

Refusal can be stripped from an open-weight model by a quiet fine-tune. Whether that leaves a readable signature depends on where you look, and the obvious place, the prompt, reads chance.

Refusal in Llama-3.1-8B-Instruct is a single linear direction at layer 10: ablate it and refusal falls 92.5% → 0% with benign behaviour intact. A covert LoRA fine-tune strips it (98.8% → 0%), and a generation-time probe detects that tampering at AUROC 0.956 where a prompt-side probe reads chance. It holds at 1.000 against an adaptive attacker that jailbreaks the model 94% of the time. The same detector transfers unchanged to sleeper-agent backdoors (0.965) and emergent misalignment.

prefix a prompt with review: to get coached
TypeScriptNext.jsFastAPICloudflare D1Claude API

Jul 2026

PromptCoach

A CLI and Chrome extension that coaches developers to write better AI prompts. Built by a team of eight; finalist at the UNSW CSESoc Flagship Hackathon.

How it works

AI-assisted coding wastes tokens on bloated prompts with no feedback loop. PromptCoach turns that repeated waste into a one-time cost.

One shared analysis core behind a CLI and Chrome extension (TypeScript/Next.js + FastAPI, Drizzle ORM on Cloudflare D1). Coaching is opt-in via a review: prompt prefix, so ordinary prompts never leave the machine; a local bridge falls back to offline heuristics. Hosted analysis runs through Anthropic’s Batches API on Haiku at ~2% of a frontier model’s energy per task, with environmental impact reported as a sourced, uncertainty-labelled range. Local-first, no telemetry.

quote both sides of a moving fair value
PythonAlgorithmic TradingMarket MakingStatistics

Apr 2026

IMC Prosperity 4: Algorithmic Trading

My solo entry in IMC’s algorithmic trading competition, which finished in the top 10% of 22,000+ teams and the top 200 in Australia.

How it works

Keeping a market-making engine profitable as volatility regimes change, without overfitting to any one of them.

Built a three-tier market-making engine (take/clear/make) using Welford online mean, online AR(1) on price deviations, z-score tiered sizing, and asymmetric bid/ask anchoring. Built a separate trend-following MM with hardcoded-slope discovery, online OLS blending (70/30), and full-book order imbalance microprice adjustment.

median per-order latency, 538 → 344 ns
C++20WebAssemblyLow-LatencyNASDAQ ITCHGoogleTest

Jul 2026

Limit Order Book & Matching Engine

A stock-exchange matching engine in C++, checked against 2.8 million real NASDAQ messages. It also runs in your browser.

How it works

Cut latency without changing a single matched trade, and prove the book still matches the naive version byte for byte.

A flat O(1) price-ladder array and intrusive free-list order pool (64-byte cache-aligned levels) replace std::map + std::list, cutting median latency 538→344 ns (~1.5×) and lifting throughput to 4.0 M ops/s. The rewrite stays byte-for-byte identical to the naive book and holds up against 2.8M replayed NASDAQ ITCH messages. Compiled to WebAssembly for a live in-browser demo.

every figure points at the line it came from
PythonLLM EvaluationConformal Predictionpytest / CICredit Analysis

Sep 2026

Anchor: Credit Extraction Eval Harness

Tests whether an AI reading financial filings gets the number right, can show where it found it, and knows when to say it can’t tell.

How it works

A confident wrong DSCR costs a credit desk more than a flagged one. Most extraction benchmarks never test abstention, so they can’t tell the two apart.

Scores a credit-metric extractor on accuracy, grounding, and abstention. The model extracts line items only; ratios like leverage and DSCR come from plain Python, so every error traces to one source line. On 15 real UK charity filings, a Claude-backed extractor traced every answer to a verbatim quote and fabricated none, where a regex baseline answered nothing correctly. A CI gate fails the build when a metric regresses.

Kuhn poker value −1/18, matched to 4×10⁻⁷
PythonGame TheoryCFR / CFR+pytestCloudflare Pages

Jul 2026

CFR Poker Bot

A poker solver that learns near-optimal play from self-play and checks itself against the known mathematical answer. You can play against it.

How it works

Kuhn poker has a closed-form solution, so a correct solver must reproduce its game value of −1/18. This solver checks itself against it.

CFR and CFR+ solvers built from the original papers drive exploitability to 9×10⁻⁴ / 1.5×10⁻³ chips/game on Kuhn and Leduc, recovering Kuhn’s closed-form value of −1/18 to within 4×10⁻⁷. CFR+ converges ~10× faster; the solved strategy wins +38 to +72 bb/100 vs fixed baselines. Playable in-browser, with JS/Python info-set-key parity self-checks.

Eller's algorithm keeps one row in memory
C++20AVX2 / SIMDPython / FastAPIReact / WebGL2RedisAWS / Kubernetes

May 2026

Streaming Maze Engine

Generates 10-billion-cell mazes on a laptop, with a real-time multiplayer mode you can join.

How it works

A 10-billion-cell maze at full resolution would need terabytes of memory. This engine streams it in tens of MB and still holds a 3.3 ms p99 round trip with 100 concurrent players.

Eller’s algorithm with within-row strip parallelism and AVX2/BMI2 SIMD packing scales to ~92 Mcells/s on 8 cores in O(width) memory. FastAPI + Redis pub/sub fan-out across K8s pods (p99 3.3 ms at 100 concurrent bots); WebGL2 renderer batches an entire 64×64 chunk into one GPU draw call at 60 fps. One-command AWS deploy via Terraform + EKS.

one slide per reachable game state
PythonGoogle Slides APIBFSPyPI

May 2026

Slide Games

Turns arcade games into Google Slides decks you can play, one slide per game state. Published on PyPI.

How it works

Each game ships as a shareable Google Slides link, with no runtime, JavaScript, or server behind it.

1,000-state ceiling bounds exponential growth (Pac-Man scales as positions × 2ⁿ with n pellets). Token-bucket rate limiter at ≤50 API writes/min with 5 concurrent batch uploads generates ~500-state presentations in 1–3 min. Pygame-inspired 1920×1080 rendering API with 40+ colours and 3 themes; campaign system across 4 bundled games (491–600 states each).

2×2 pixel blocks survive YouTube's re-encode
PythonFFmpegReed-Solomon ECCYouTube APINumPy

2026

PixelVault

Stores any file as a YouTube video and gets it back byte for byte, even after YouTube re-compresses it.

How it works

YouTube lossy-compresses every uploaded video. Storing arbitrary binary data there without any corruption is the problem.

2×2 uniform pixel blocks survive ±127 DCT luma ringing in H.264/VP9. Three-tier Reed-Solomon ECC over GF(2⁸) (vectorised → Berlekamp-Massey → parallel) with byte interleaving for burst-error recovery. AES-256-GCM + PBKDF2-SHA256 encryption, zlib compression, and 38× faster encoding at 0.82–2.88 MB/s via NVENC/AMF/QSV hardware acceleration with YouTube OAuth2 upload.

a 32,768-entry colour table, 30 fps
TypeScriptCanvas APIAstro

2026

ASCII / Unicode Art Converter

Turns images, video, and your webcam into ASCII and Unicode art, live in the browser.

How it works

Map full-colour images to text characters at 30 fps without losing perceptual detail.

O(1) nearest-colour lookup via a precomputed 32³ = 32,768-entry RGB quantisation table enables 30 fps video at ~2.1 ms/frame. Implements Floyd-Steinberg, Atkinson, and Bayer dithering, Sobel edge detection, and a particle drift system. Exports PNG, SVG, TXT, and WebM (via the MediaRecorder API) and reports live render time at 1920×1080.

Have an internship, research role, or project in mind?

Contact me

Contact

Send a message