Milan Shaji

data & ai systems

Final-year student of
Data Science × Business at QUT.
I build systems
that stay running,
and never publish a number
code hasn't checked.

Half data science, half business: the model matters because of the decision it improves.

info ↓

recent work

PaperTrail2026 / stock screener + backtesting / validates its own signals

A self-hosted market terminal that screens roughly 1,550 US stocks and the top 50 crypto every 60 seconds, aggregating six free no-key data sources into a transparent 1–5 rating and concrete entry-timing engine. Every score decomposes into the trend, momentum, quality, valuation and risk inputs that produced it. Node.js and vanilla JavaScript, one runtime dependency, no build step, installable to a phone home screen.

What matters is whether the score survives contact with reality. Backtesting and forward paper-trading engines (60 automated tests, test-driven, with look-ahead-bias guards) replay the signals against ten years of history and a live S&P 500 benchmark. Building that harness surfaced three separate bugs that had inflated returns by thirty-plus points: survivorship bias, a hindsight-selected universe, and stale entry pricing. The corrected result is reported in the app itself, on screen rather than buried: the signal set underperformed simply buying and holding the index.

node.js · vanilla js · express · finnhub · fred · tradingview · github

github.com/milanshaji1/paper-trail
  • 1,5501,550US stocks + 50 crypto, re-scanned every 60 seconds
  • 6060automated tests, test-first, with look-ahead-bias guards
  • 33backtest-inflating bugs found and fixed: survivorship, hindsight, stale pricing
  • underperformedthe honest result: signals lost to SPY buy-and-hold, reported in-app
PaperTrail dashboard: an amber oscilloscope of the live S&P 500, a macro index strip, and the Opportunity Radar ranking stocks 1–5 by momentum score across ~1,550 scanned names
the live terminal: S&P oscilloscope, macro strip, and the Opportunity Radar over ~1,550 scanned names

Dispatch2026 / energy-market ML + LLM / publishes daily, unattended

An AI market analyst for Australia's electricity grid. Spot prices idle for days, then blow past $300/MWh with little warning. Dispatch ingests over a million rows of 5-minute AEMO price and demand data into a DuckDB pipeline gated by 44 automated tests, refreshed daily.

A gradient-boosted early-warning model flags likely spike days, benchmarked with rolling-origin backtests. An LLM analyst writes the daily briefing: 21–25 cited figures, each re-verified against source data before the brief may publish. Runs unattended every morning on GitHub Actions behind a public Streamlit dashboard.

python · duckdb · gradient boosting · claude api · github actions · streamlit

github.com/milanshaji1/dispatch
  • 71%71%spike-day recall @ 20% alert budget (baselines reached 58%)
  • 30/3030/30golden-question evals, live run
  • 4444tests gating every ingest: data quality, leakage, verification
  • $0.06–0.12cost per verified brief, across five measured runs
Dispatch dashboard showing tomorrow's spike risk per NEM region and 60 days of daily average spot prices
the live dashboard: spike risk per region, 60 days of real AEMO prices
A published Dispatch daily brief; cited figures are highlighted where they were re-verified against the database
a published brief: every highlighted figure re-checked against the database first
Golden-set evaluation table showing truth versus model answer with all rows correct, and backtest results JSON
the eval run and backtest output the headline numbers come from

Gesture Canvas2026 / computer vision, real-time / 50 tests green in ci

Hand-tracked generative visuals in TouchDesigner, directed in plain English. MediaPipe webcam tracking drives visuals composited over the live camera feed: a shape rides the thumb–index pinch point, scales with hand aperture, and hides the moment tracking drops. The node network is generated from reproducible Python rather than wired by hand.

A language layer directs the scene, but nothing a model says touches the render unchecked: every Claude response passes a strict JSON parameter contract, schema-validated field by field and rejected on any violation. That's Dispatch's verification discipline, applied to a system with no database to check against.

python · touchdesigner · mediapipe · claude api · pytest

github.com/milanshaji1/gesture-canvas
  • 531/531531/531true pinches caught, calibrated on 1,847 recorded frames
  • 00false positives across 5,400+ frames
  • 5050automated tests in CI
Concept illustration of MediaPipe hand landmarks with a particle burst at the pinch point
concept illustration, not a screenshot: the live system needs a webcam

Handtracked VFX2026 / real-time video effect / live capture

A real-time hand-tracked video effect, built after a filter trend went around social media. Three corner-pinned quads (one per finger-pair across both hands) mask a live-filtered copy of the camera feed, so moving your hands reshapes where each effect appears.

Two failure modes drove the build. Effects that displace pixels can leak outside their intended shape, so each copy is filtered before masking rather than after. And losing tracking mid-effect can corrupt the whole render, so every region is gated to disappear cleanly when a hand leaves the frame.

touchdesigner · mediapipe · real-time compositing

github.com/milanshaji1/handtracked-vfx
  • 3/33/3regions verified to hide cleanly on hand dropout
  • 2323built-in filters rendered against live video before choosing
Live capture: three hand-framed regions, each showing a different filter applied to the camera feed
live capture: three regions, each a different filter, framed by finger-pairs

the numbers: all measured

71%71%spike-day recall, 5-mo backtest
531/531531/531pinches caught
30/3030/30llm evals green
94%94%cnn test accuracy
4444tests gating the pipeline
6060tests, PaperTrail
top 7%top 7%kaggle, ~3,500 entrants

sources: rolling-origin backtest (feb–jul 2026) · live eval runs · ci · graded results

info

I'm finishing a dual degree at QUT (Bachelor of Data Science alongside a Bachelor of Business in Entrepreneurship & Innovation) because a technically perfect answer to the wrong question is still wrong.

Outside the degree: two and a half years on a high-volume retail floor (15–20% over target, trained six people, keyholder within the year), committee at the QUT Data Science Club, volunteer tutor for first-year statistics and programming.

Graduating late 2026. Looking for a 2027 graduate seat in data, analytics and AI.

  • 01. live beats finished: a system proves itself by running unattended.
  • 02. verification is code: no number ships unchecked.
  • 03. start from the decision: the business half of the degree isn't decoration.
2026
PaperTrail, Dispatch, Gesture Canvas & Handtracked VFX shipped · Forage simulations (Quantium, CommBank, ANZ)
2022–2026
QUT dual degree: Data Science | Business (Ent. & Innovation)
2024–now
QUT Data Science Club committee · volunteer tutor · Kaggle (best: top 7% of ~3,500)
2023–now
Universal Store, sales associate
2022
Rivers, sales associate

toolkit

modelling & ml

Python (pandas, NumPy, scikit-learn, PyTorch) · SQL · R · MediaPipe · statistical modelling · time-series & backtesting

ai engineering

Claude API · LLM evaluation · golden-question sets · schema-validated outputs · citation verification

bi & storytelling

Power BI · Tableau · Teradata · Streamlit · TouchDesigner · dashboard design

pipelines & platform

ETL design · DuckDB · data-quality testing · AWS (S3, EC2) · Git · GitHub Actions · Linux

delivery

requirements analysis · data validation · documentation · business cases · stakeholder communication