The gate is the product
Anyone can generate a lesson plan. The work is the reviewer that scores it against a rubric and sends it back.
↳A plan below threshold is regenerated, not delivered · 14 checks before an exam is returned
AI / ML Engineer / Islamabad, Pakistan
Lesson plans for Pakistani classrooms. A call-centre voice agent that runs on one GPU and costs nothing to operate. A tax optimiser that never sees your salary. I build the AI, and the harness that proves it works.
Four things I actually do, each one demonstrated below rather than described.
A tax optimiser for Pakistani salaried filers — not “what do I owe”, but “what could I owe instead”.
Befiler and FBR IRIS optimise for filing compliance. TaxBacha optimises the bill: it computes your liability against the FY 2025-26 salaried slabs, then ranks the legal instruments that reduce it — VPS under §63, Zakat under §60, approved donations under §61 — by rupees saved. No API keys, no account, no salary leaving the machine.
six brackets · 9% surcharge above PKR 10M
This is the real engine. The slab function and every credit rule below are the exact logic from app/lib/tax-engine.ts, ported line-for-line. Drag the salary.
A call-centre voice agent with barge-in that runs entirely on my own GPU. No cloud, no carrier, no PSTN.
Speech recognition, the language model, and speech synthesis all run locally; the “customers” are SIP softphones on a private subnet. It hooks into Asterisk audio over AudioSocket — an 8 kHz PCM TCP stream — and VICIdial’s campaign, lead and reporting layer wires in on top. Total running cost is zero and no audio ever leaves the machine.
libvirt NAT bridge virbr0 · 192.168.122.0/24 · no carrier, no DID, no cloud API
The actual deployment topology — host and guest on one libvirt NAT bridge, no PSTN anywhere in it. The pulse is a turn of the audio loop.
Double-clap; it wakes, listens, answers out loud, and goes back to sleep. Every hosted hop has a local fallback.
Clap detection runs continuously on MFCC embeddings matched against a voice-print you calibrate yourself, so it fires on your clap and not a door closing — without holding the mic open for transcription. It keeps a persistent memory of you in a plain-Markdown Obsidian vault, reads your calendar, and hands code changes to Claude Code, routed to the right repo by spoken alias.
Clap detection runs continuously against a voice-print you calibrate yourself — it fires on your clap, not a door.
Hosted path on top, local fallback underneath. Toggle the network to watch it degrade instead of die.
Joins your Google Meet calls from your calendar, listens, decides whether to speak, and replies in your cloned voice.
The hard part is not speaking — it is knowing when not to. Transcription runs locally on GPU with Faster-Whisper, a local Mistral decides whether the moment warrants a reply, and Chatterbox synthesises the answer with zero-shot cloning from a ten-second reference clip. Audio moves over virtual PulseAudio devices, so there is no physical mic or speaker in the loop.
The decision the agent actually makes on every turn boundary. Most of them are “stay silent”.
Seven agents that replace the thirty minutes of phone calls it takes to book a plumber in Pakistan.
Type a request in Urdu, Roman Urdu, or English. Intake structures it, Discovery filters the directory by haversine distance in pure Python, Ranking scores candidates, and then the Coordinator spawns three concurrent negotiations — each provider played by an in-character LLM persona — asking can you come, what time, what price. It books the best committed offer. Built for the AI Seekho 2026 Antigravity Hackathon.
The Coordinator’s three parallel negotiations, and the scoring rule that ranked the providers going in.
An always-on Slack agent in iambic pentameter that knows who is asking, and refuses the ones who shouldn’t.
The interesting problem in a personal assistant that lives in a shared workspace is not personality — it is containment. Identity is resolved per message before any tool is reachable, so the private toolset and the owner’s context are gated at the boundary rather than guarded by a prompt. It runs 24/7 as a Socket Mode worker with an owner-only conversation log.
both send “what did I say I'd ship this week?”
The gate runs before the model is handed a toolset — refusal is a property of the boundary, not a line in a prompt asking it nicely.
The same question, asked by two people. Identity resolves before the toolset is even visible.
Curriculum in, classroom-ready bilingual lesson plans out — with a reviewer that can send them back.
Multi-grade, English and Urdu, with auto-generated illustrations. The part that matters is the gate: an AI reviewer scores every plan against a pedagogy rubric before it ships, and a failing plan is regenerated rather than delivered. The async pipeline is migrating to a LangGraph state machine so each stage is inspectable and retryable on its own.
idle
The generate → review → gate loop. A plan below threshold does not ship; it goes back around.
Any teaching content becomes a standards-aligned exam — as structured data other platforms consume over HTTP.
Multiple question types, bilingual, with figures. Because it returns structured exam data rather than a rendered PDF, it works as a reusable content API instead of a one-off document maker. A fourteen-check, standard-mapped reviewer grades every exam on a calibrated scale before it is returned.
waiting for an exam…
The reviewer’s check surface. Every generated exam is graded against all fourteen before it leaves the service.
Swapped a GPT-4o vision call out of a production parser for a YOLO detector I fine-tuned myself.
Handwritten exam pages had to be segmented and cropped at scale, and a hosted vision model was the wrong tool for a fixed, repetitive layout problem. I curated a domain dataset, fine-tuned YOLO v11/v12 over 100+ epochs, and paired it with OCR — self-hosted, so throughput is a function of my own hardware rather than someone’s rate limit. It ships behind FastAPI with APM tracing and process-pooled workers.
GPT-4o vision call detector I trained
100+ epochs on a curated domain dataset. Throughput is now a function of my hardware, not someone's rate limit.
What the detector does to a page: regions found, classified, and cropped for OCR downstream.
An IEEE-format benchmark of LLMs for Pakistani primary lesson-plan generation (Grades 1–5, four subjects), proposing a rubric grounded in Bloom’s Taxonomy and Assessment for Learning — and evaluating models as reviewers, not just generators.
Calibrate an AI reviewer against human-expert annotations until it agrees with them, then let that agreement score drive automated prompt optimisation — versioned registry and score store underneath, human promotion gate on top.
Benchmarking Gemma, Qwen and Llama against commercial models for Urdu instruction-following — a low-resource language where the leaderboard rankings stop predicting anything.
Generation that runs entirely on the phone for classrooms with no connectivity — tiered Gemma models in React Native, sized against a real device fleet rather than a flagship.
A retrieval agent that answers and writes reports over textbooks — shipped with its own evaluation harness and test set, because a RAG system without one is a demo.
Comparative grading across GPT-4, Gemini and Claude, with the Claude Batch API doing the bulk work at a fraction of the interactive cost, surfaced through Streamlit dashboards.
Sequence-to-sequence translation with Bahdanau attention in PyTorch, from scratch — 81 GLEU on 15k+ sentence pairs against a baseline transformer.
A floor-plan to furnished-3D-scene pipeline built Claude-Code-native — agent skills and MCP servers driving Unreal Engine 5 and SketchUp, with a fixed benchmark scene as the regression test.
An insurance call bot — Ultravox for transcription, Qwen3-4B for intent and response, orchestrated as a LangGraph workflow.
Whisper, LLaMA and a LoRA-fine-tuned SDXL chained into a pamphlet generator — cut design time 80%, tested on 100+ menu items, deployed on AWS.
Tracks Pakistan Stock Exchange dividends against live data, with withholding tax handled correctly by filer status — the detail every other tracker gets wrong.
Nothing in that domain yet.
Sole-authored preprint — targeting IEEE FIE 2026, Limassol, Cyprus · 2025
A validated pedagogical rubric (Grades 1–5; English, Science, Maths, Urdu) and a benchmark of seven open-weight LLMs as both generators and reviewers — a generator–reviewer refinement loop lifted every model above 88% of the rubric maximum.
Taleemabad Blog · 2026
How a generation–review pipeline got tuned for Yemeni Arabic — frontier models down to self-hosted small LMs, the prompt change that fixed script rendering, and a dual-judge evaluation loop underneath it.
Making a model produce something is the easy half. Building the thing that can tell you it’s wrong — that’s the job.
I work on education AI at Taleemabad, where the lesson-plan and exam generators I build are used by teachers and gated by reviewers I also built — a plan that fails its rubric is regenerated, not delivered. Outside that, I keep pulling speech pipelines apart: a VICIdial voice agent with sub-second latency and no cloud dependency, a meeting bot that mostly decides to stay quiet, an assistant that wakes on the sound of my own clap. The through-line is that I would rather ship something measurable than something impressive.
AI Engineer · Islamabad
Jan 2025 – Present
Same generator, same model family — the only variable is whether output is scored against an auditable rubric before it ships.
AI Intern · Islamabad
Jul 2024 – Aug 2024
Associate Data Scientist
Apr 2024 – Jun 2024
AI Intern
Jun 2023 – Sep 2023
BS, Computer Science · Islamabad
Aug 2021 – Jun 2025
Anyone can generate a lesson plan. The work is the reviewer that scores it against a rubric and sends it back.
↳A plan below threshold is regenerated, not delivered · 14 checks before an exam is returned
A hosted API is a dependency with a price and an outage. Where a model can run on my own GPU, it does.
↳Voice agent at ~0.3 s round-trip for $0 · a fine-tuned YOLO replacing a GPT-4o vision call
Systems meet bad networks and rate limits. The interesting design question is what still works when they do.
↳Jarvis falls back to faster-whisper and Piper locally · Sahulat has a regex path when the LLM is down
A prompt asking a model to keep a secret is not access control. Resolve identity before the tools are reachable.
↳Sheikhspeare mounts its private toolset per message, after the sender is known
Open to collaborations and conversations about applied AI, evaluation, and education technology.