14 May → 10 Aug 2026. Source files go back to April.
1,367 files tracked in the repository.
London·BTech — West Herts College·Available now
I build AI systems end to end — model routing, retrieval, safety gates, interface and deployment. Both of the systems below are in daily use.
Summary
A voice-driven AI runtime of 928 Python files. A family app running on four phones. A multi-market backtesting engine. Built independently, with dated commit history for all of it.
01 — The ledger · counted 12 August 2026
Counted from the working tree on 12 August 2026. The command that produced each figure is printed with it.
Sourced from two git repositories, a backtesting archive and a CV. No stock imagery and no mock-ups.
14 May → 10 Aug 2026. Source files go back to April.
1,367 files tracked in the repository.
Plus 51,811 more in the Electron HUD.
Golden routing tests, a silent-swallow ratchet, live acceptance probes.
1 → 12 Aug 2026. Twelve days, one app, four phones.
No framework, no build step, nothing to keep updated.
Light and dark, by a screenshot harness I wrote myself.
Equities, FX, futures and crypto. Costs modelled, one position at a time.
chrome-devtools, memory, git-mcp, defillama over stdio; Microsoft Learn over HTTP.
With a quota ledger that rotates when one runs dry, and a local one for anything private.
An always-on AI assistant runtime that lives on my desktop. Voice in, voice out, with a floating HUD over everything else. Speech recognition, speech synthesis, vision and memory all run locally; the language models are routed across seven providers so it never depends on one of them staying up.
Speech never leaves the machine — recognition and synthesis are local, and so is vision and memory. Only the language-model call goes out, and there is a fully local fallback for when it shouldn't.
Double-clap wake, Silero voice-activity gating, Faster-Whisper distil-large-v3 on CUDA fp16, and a 500-term domain bias so tickers and trading vocabulary transcribe correctly.
Piper synthesises in chunks so the first phrase plays before the sentence is finished. A speaker lock stops two replies overlapping, and speaking over it interrupts it.
Groq openai/gpt-oss-120b is the default and the strong lane; gpt-oss-20b is the fast one it drops to under rate limits. qwen3:8b runs locally on Ollama.
Behind those, a full NVIDIA NIM stack — llama-4-maverick-17b-128e for general work, mistral-small-4-119b for reasoning and code, phi-4-multimodal, nemotron-nano-vl for vision, parakeet-1.1b for speech, and a Nemotron content-safety model. Plus Gemini 1.5 Pro, Cerebras, OpenRouter and GitHub Models.
A quota ledger rotates lanes as each one runs dry, and a benchmark decides which lane is best before anything routes to it.
40+ intents classified by regex first and a model only if that fails, then a deterministic planner picks one of five answer strategies before any tokens are spent.
28 tool adapters behind one executor: trading, weather, news, maps, memory, charts, system control, browser.
Hard questions fan out to an analyst, a critic, a verifier and a synthesiser, plus quant, risk, comparison, contradiction and trade-off lanes.
The verifier can delete a claim the sources never supported. It says so instead of shipping it.
Query rewriting, parallel fetch, domain scoring, ranking, semantic verification and a freshness gate, with lanes tuned per subject: finance, companies, technology, education, sport.
Free and privacy-first sources first — SearXNG, Wikipedia, RSS, Yahoo, Stooq.
An agentic loop with its own isolated browser, a permission gate, a resource governor that yields while I'm gaming, an evidence store and a project graph.
It writes real deliverables — documents, exports, downloads — into a working folder, and resumes a task it was interrupted in.
Four tiers: a ten-minute recency window, session state, a Chroma vector store for semantic recall, and DuckDB for structured decisions and events.
Everything worth keeping is exported as Markdown into an Obsidian vault I can read without the app.
Gmail, Outlook, Slack, Discord, Teams, Google Calendar, Notion, Todoist, Asana, Trello, Hostinger mail, IBKR and the local filesystem — each behind a per-permission gate, an audit trail, and a token store encrypted with Windows DPAPI.
The permissions are individual, not a single yes. Gmail can read, search and draft; send and delete are blocked at the connector, not by asking the model nicely.
MCP runs both ways: SYRIX's tool registry is exposed as an MCP server over stdio, and it consumes five external ones — chrome-devtools, memory, git-mcp and defillama over stdio, Microsoft Learn over HTTP JSON-RPC — through the same deny-by-default domain allowlist, so MCP can't become a way around the browser hardening.
Smart-money structure (fair-value gaps, order blocks, break of structure, change of character), multi-timeframe confluence, volume profile and VWAP.
A circuit breaker blocks trades on news shock, high volatility or earnings. Max daily loss 2%. Max risk per trade 0.25%.
Secret redaction before anything is logged or drawn. An access guard on screen, file and system reach. Policy gates on risky actions. Fail-closed dispatch — an ambiguous command asks rather than guesses.
A speaker-identity check with a 0.78 confidence floor before anything sensitive runs.
A 3D, scroll-driven site I built for the project before I built this one — Three.js, a boot sequence, a raymarched core, and the whole architecture laid out chapter by chapter.
Open the SYRIX site →
A private family hub — lists, jobs, dates, meals, money, documents, markets and an assistant, on my family's actual phones. Plain HTML, CSS and JavaScript. No framework, no build step, no packages, nothing to install. Twenty-three screens, and it installs to a home screen like an app.
Real captures · light and dark
















Light and dark — both real captures, not recolours.
Five trading strategies, run against equities, FX, futures and crypto on one engine, ranked by the metrics that survive contact with real money. I built it because I wanted to know whether the setups I read about actually hold — and the honest answer needed a machine.
SMC_BOS on a synthetic series — the engine's wiring-test mode, which the README labels clearly because these numbers carry no meaning for live trading. The mechanics are the production ones: position size derived from stop distance, ATR stop, fixed 2R target, one position at a time.
class BaseRisk(bt.Strategy):
"""Shared: ATR stop, RR target, % risk sizing, one position at a time."""
params = dict(risk_pct=0.01, atr_period=14, atr_mult=2.0, rr=2.0)
def size_for_risk(self, stop_dist):
if stop_dist <= 0: return 0
risk_cash = self.broker.getvalue() * self.p.risk_pct
return max(int(risk_cash / stop_dist), 0)
Position size is derived from the stop distance, never guessed. Commission is modelled at 0.05% a side. One position at a time, so results cannot be inflated by stacking entries.
The engine also ships a synthetic mode for wiring tests, clearly marked so those results are never mistaken for evidence. An over-fitted backtest is worse than none.
437 commits across two repositories, May to August 2026. Five milestones, then the raw log.
A 40,000-line single file split into modules behind a routing layer.
Model lanes measured before the router is allowed to trust them.
Isolated browser, permission gate, resource governor, evidence store.
v1, an in-app assistant, and a gateway needing no key or open port.
Two-lane runtime complete, with a threat model and a recorded rollback.
git logPrepare Jarvis/SYRIX for safe GitHub sync
Complete safe modularization routing phase 1
tools: free-brain benchmark — prove which lane is best before routing
feat(supercomputer): Phase 1–2 — safety baseline + isolated mode with fail-closed dispatch
feat(supercomputer): Phase 3 — isolated embedded browser sandbox
fix(supercomputer): the real cause — 21k tokens per step was starving the pool
fix(supercomputer): 16 bugs from the first live drive — safety, scope, answers
feat(supercomputer): a resource governor, so a task can run while Boss games
feat(supercomputer): ask for what only Boss knows, never invent it
fix(chat): repair an answer from the web instead of shipping the gap
fix(tests): the suite was calling live search APIs, and I raised the ratchet
perf(spark): 16.4s → 10.5s, and stop refusing before actually looking
docs: threat model Spark Zenith 1.1
Kohli v1: private family hub
Rewrite PLAN.md as a handover document; move the tests into the repo
Make SYRIX work with no API key, no PC left on and no port opened
Deploy Kohli Core, and fix what only a live deploy could reveal
The passcode has to cover the price cache too
A screenshot harness, and an overflow check that reads the real screen list
Drop 'unsafe-inline' from style-src, and fix the boot flag it exposed
Undo instead of "are you sure", weekday repeats, voice, sunset and streaks
feat: complete Spark Zenith 1.1 Vanguard runtime
Finance: a real charting screen, and the family section earns its place
Keypad keys pop on press, and stop the lock screen sliding on a swipe
Eight decisions that shape both systems, each one traceable to code in these repositories.
Regex classifies intent, a planner selects the answer strategy, and every figure is computed in code. The model phrases the result and nothing else.
Ambiguous command: ask. Unknown domain: deny. Missing capability: degrade and report it. The default is never a best guess.
Speech recognition, synthesis, vision and memory run on the machine. Private queries route to a local model, and external lanes are disabled for connector, document, memory and MCP data.
Gmail can read, search and draft. Send and delete are blocked at the connector, with a DPAPI-encrypted token and an audit trail — not enforced by prompting.
A benchmark ranks the model lanes, and a quota ledger rotates them as each is exhausted. Provider choice is data, not preference.
Kohli has zero packages and no build step. The HUD transpiles JSX at runtime. Neither can break from an update I did not make.
Screenshot harnesses, overflow checks and live acceptance probes. A passing unit test and a working screen are separate claims.
SYRIX runs on my desktop; Kohli runs on four phones in my family. Defects surface in use rather than in review.
Each of these left a directory, a config entry or a commit on this machine.
~/.claude.~/.codex.avan_cursor_mode.py exists because of it.qwen3:8b for private queries, llava for vision. Unloaded automatically after five idle minutes to free VRAM.gpt-oss-120b and 20b on Groq; a nine-model NIM stack for reasoning, vision, speech, reranking and safety.Having the tools is not the skill. This is the routing table I actually use, and the same reasoning is hard-coded into SYRIX's model router.
Everything listed appears in code I have written and run. Nothing here is from a tutorial I watched.
Python · JavaScript (ES5 → modern) · HTML · CSS · GLSL · SQL · PowerShell · Bash
Prompt engineering · context-window and cost/latency management · model routing and fallback · quota ledgers · function/tool calling · structured output validation · evaluation harnesses · streaming
Retrieval-augmented generation · vector databases (Chroma) · embeddings · chunking · hybrid ranking · query rewriting · semantic verification · freshness gating · citation grounding
Multi-agent systems (analyst / critic / verifier / synthesiser) · agentic tool loops · LangGraph · DSPy · smolagents · Pydantic AI · MCP as both server and client · permission gating · sandboxed browser automation
Groq · NVIDIA NIM · Google Gemini · Cerebras · OpenRouter · Ollama (local) · gpt-oss 120b/20b · Qwen3 · Llama 4 · Mistral · Phi-4 · Nemotron
Faster-Whisper STT · Piper and Kokoro TTS · Silero VAD · multimodal and vision-language models · llava · PaddleOCR · MediaPipe · YOLO
Electron · React · Canvas 2D · WebGL and raymarched shaders · CSS 3D · Progressive Web Apps · service workers · responsive and accessible UI · light/dark theming
FastAPI · WebSocket state bridges · Cloudflare Workers and Pages · Wrangler · zero-dependency Node servers · OpenTelemetry · Git
pandas · numpy · DuckDB · backtrader · yfinance · ccxt · Finnhub · Alpha Vantage · Stooq · TradingView · IBKR · technical indicators and risk sizing
AES-256-GCM · PBKDF2 key derivation · CSP without unsafe-inline · OAuth token handling · DPAPI-encrypted stores · secret redaction · deny-by-default allowlists · per-action permissions · audit trails · threat modelling
pytest · golden regression suites · Playwright · CDP automation · screenshot and layout-overflow harnesses · live acceptance probes · cross-device verification
Formal evaluation harnesses for agent output · walk-forward validation for strategies · real-time graphics and shader work · distributed edge deployment

I'm in London, studying BTech at West Herts College. Before that, GCSEs at Northwood School in Pinner, and school up to Grade 8 at Amity International in India.
Every project on this page was built outside coursework, self-directed and unassessed. One of them is now relied on daily by my family.
I have also managed a personal investment portfolio for 18 months — 22 holdings, reviewed monthly, with 20+ written reviews of my own decisions and roughly 27% in one annual period. The discipline carries into the engineering: establish what is known, record what is not, and size the risk accordingly.
Previously a competitive footballer: Player of the Month at the LaLiga Football School in Delhi, and invited to train with Real Madrid's youth programme in Spain.
Kabirr Kohli · AI Systems Engineer · London
Based in London, open to relocation. Happy to walk through any of the above in detail, including the parts that did not work first time.