Open to internships in software, systems, and AI

Hello, I'm Sahil Menon

Computer Engineering student at UNSW, focused on embedded hardware, AI, and autonomous systems.

About

Who I am

I’m Sahil, a first-year Computer Engineering student at UNSW, building towards a future in robotics and intelligent systems.

My main interest is autonomous machines: where embedded hardware, low-level software, and AI meet. I’m looking for research and internship opportunities in robotics and AI.

Outside of engineering, I led BuildingBloCS, Singapore’s largest student-computing conference, which taught me what it takes to make technical work reach people at scale.

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 (Nov–Feb)

Technical Skills

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

GitHub activity · last 6 months

Highlights

  • Selected, Jane Street First-year Trading & Technology Program, Hong Kong
  • Top 10% worldwide of 22,000+ teams, IMC Prosperity 4
  • Jane Street monthly puzzle solved, three months running
  • UNSW CSESoc Flagship Hackathon finalist
  • Selected, UNSW EngSoc Applied Consulting for Engineers

Experience

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. Coordinated organisers from 30+ institutions and secured $200,000+ in sponsorships 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
2 Models Evaluated

Investigated LLM hallucination failure modes in context-based QA over a 6-month engagement under guidance from a research lead. Designed and built a 50,000+ entry evaluation benchmark, evaluating Lynx and HaluBench across precision, recall, and contextual faithfulness metrics to expose systematic accuracy gaps.

AI Safety LLM Evaluation Python

Featured projects

#001

The Refusal Stack

Mechanistic interpretability of refusal in Llama-3.1-8B-Instruct: finding where refusal lives, removing it three different ways, and detecting the removal afterwards.

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.

PyTorchHugging FaceMechanistic InterpretabilityLoRARunPod / Docker
#002

PromptCoach

CLI + Chrome extension that coaches developers toward efficient AI prompting. UNSW CSESoc Flagship Hackathon finalist (team project).

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.

TypeScriptNext.jsFastAPICloudflare D1Claude API
#003

IMC Prosperity 4: Algorithmic Trading

Solo competitor in IMC Prosperity 4, finishing top 10% worldwide and top 200 in Australia out of 22,000+ global teams across 5 rounds of algorithmic and manual trading.

How it works

The challenge: keeping a market-making engine profitable across changing volatility regimes without overfitting to any single one.

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.

PythonAlgorithmic TradingMarket MakingStatistics
#004

Limit Order Book & Matching Engine

A single-symbol limit-order-book matching engine in C++20 that enforces strict price-time (FIFO) priority. Validated byte-for-byte against replayed NASDAQ ITCH market data and compiled to WebAssembly for a live in-browser demo.

How it works

A matching engine is only useful if it’s provably correct and fast. The real constraint: cut latency without changing a single matched trade.

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.

C++20WebAssemblyLow-LatencyNASDAQ ITCHGoogleTest
#005

CFR Poker Bot

A Counterfactual Regret Minimization (CFR / CFR+) solver for Kuhn and Leduc poker, driven to a near-Nash game-theory-optimal strategy and validated against poker’s closed-form solution. A live browser bot lets you play it.

How it works

Most hobby CFR repos print a strategy and stop. This one checks its own answer: Kuhn poker is solved in closed form, so a correct solver has to reproduce −1/18. This one does.

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.

PythonGame TheoryCFR / CFR+pytestCloudflare Pages
#006

Streaming Maze Engine

Full-stack maze platform with a C++20 generator hitting ~38 Mcells/s single-threaded (≈2× a published C# baseline) and ~92 Mcells/s on 8 cores, streaming 10-billion-cell mazes in O(width) memory, with real-time multiplayer and a WebGL2 renderer.

How it works

Generating a 10-billion-cell maze at full resolution should take terabytes of memory. Getting it under tens of MB while supporting thousands of real-time players is the actual constraint.

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.

C++20AVX2 / SIMDPython / FastAPIReact / WebGL2RedisAWS / Kubernetes
#007

Slide Games

Python framework (published on PyPI) that compiles arcade game logic into fully playable Google Slides via BFS state enumeration: one slide per reachable state, hyperlink-navigated.

How it works

No runtime, no JavaScript, no server. Just a shareable URL that plays a full arcade game.

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

PythonGoogle Slides APIBFSPyPI
#008

PixelVault

Python file-to-video codec that encodes any file into MP4 for lossless storage on YouTube, recovering the original file exactly despite H.264/VP9 re-encoding.

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.

PythonFFmpegReed-Solomon ECCYouTube APINumPy
#009

ASCII / Unicode Art Converter

Zero-dependency, fully client-side ASCII/Unicode art converter: 7 character modes, 3,163-codepoint Unicode pool, 123-emoji mosaic, image/video/webcam input.

How it works

The problem: faithfully mapping 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. Supports 6 export formats (PNG, SVG, TXT, WebM via MediaRecorder API) and reports live render time at 1920×1080.

TypeScriptCanvas APIAstro

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

Contact me

Contact

Send a message