sohair@prod: ~/portfolio
sohair@prod : ~ session opened
$ whoami→Sohair A. — Full-stack & AI systems engineer
$ cat ./since→shipping production software since 2014
$ cat ./positioning→I build AI that survives production.
$

Full-stack engineer since 2014. I design the schema, build the backend, wire up payments, auth and background work, and ship it — then I keep it running. Lately that means LLM systems built for production: retries, provider failover, human-review gates and audit trails, not demos.

press ⌘K for commands

$ cat ./about.md

/**

*The work I do best is end-to-end. I am as comfortable modelling a multi-tenant schema and a Sidekiq pipeline as I am building the React or Hotwire UI on top of it, and I have maintained most of what I have built for years afterward — which is what changes how you write it.

*On the AI side I build document pipelines, retrieval systems, voice agents and streaming chat — designed from the first commit around what happens when the model is wrong, the provider times out, or a job dies at stage nine of fifteen.

*I use AI coding agents daily to move fast, and I review, test and own every line that ships. Agents accelerate the work; they do not get the last word.

*/

$ ls ./work --production

6 systems · clients described by sector, architecture shown in full

Legal / contract intelligence

Pulls contract PDFs from Drive and bulk uploads, unpacks nested archives and attachments, then walks each document through a chain of explicit LLM stages — citation extraction, deal typing, vendor identification, overlap and amendment detection, redaction checks.

pipeline

extracting text→citation→deal type→vendor→deal data→summary→overlap check→amendment check→redaction→◆ human QA gate→import

in production

  • ›Resumable pipeline with one idempotent job per stage
  • ›Bounded retries + 180s timeout + provider failover on every model call
  • ›Human review gate blocks the item, never the queue
  • ›Live and unattended for over a year
Ruby on Rails 7.2HotwireSidekiqPortkeyOpenAIGoogle Drive APIMySQL

Executive coaching

A Slack-native assistant that answers from a curated coaching corpus rather than from whatever the base model remembers — vector search over embedded source material, with scheduled nudges pushed to users on a cadence.

pipeline

sync corpus→embed→vector search→compose context→generate→deliver in Slack

in production

  • ›Answers grounded in the client's own corpus, not model recall
  • ›Multiple model providers behind one interface
  • ›Non-technical team edits content in the tool they already use
  • ›Scheduled delivery runs unattended
PythonFastAPILangChainOpenAIAnthropicPineconePostgresDocker

Sales enablement

Reps practise live sales calls against an AI counterpart: speech in, transcription, a scenario-conditioned model turn, synthesised speech back — a full conversational loop that has to feel like a phone call, not a chatbot.

pipeline

capture audio→transcribe→scenario context→model turn→synthesise voice→stream back

in production

  • ›Full duplex voice loop, tuned stage by stage
  • ›Scenario state persists across a multi-turn call
  • ›Provider-swappable transcription and synthesis layers
PythonFastAPILangChainOpenAIElevenLabsSpeech-to-text

Marketing technology

Streaming AI chat that plans campaigns, generates creative, and reads live performance data back out of an ad platform — with two billing providers behind it and a typed service boundary in front of the ad API.

pipeline

brief→stream plan→generate creative→publish campaign→read metrics

in production

  • ›Ad-platform volatility isolated behind one typed service
  • ›Token-streamed responses — no blank waiting state
  • ›Multiple payment providers supported side by side
Next.js 14TypeScriptVercel AI SDKOpenAIReplicateFastAPIStripePaddle

Academic research

Uploads research papers, summarises them, and bills by word count — one-time credit packs and subscriptions running against the same metered balance.

pipeline

upload→parse PDF→meter credits→summarise→deduct balance

in production

  • ›Usage-based billing tied to real model cost
  • ›One balance across subscriptions and one-time packs
  • ›Background processing with live progress
Ruby on Rails 7HotwireSidekiqOpenAIStripePDF processingPostgres

Assessment / edtech

A computer-vision microservice that watches exam video for face presence and anomalies, called synchronously by the Rails assessment platform that owns the exam session.

pipeline

video frame→face detection→anomaly scoring→flag session

in production

  • ›ML workload isolated from the application deployment
  • ›Independently scalable inference
  • ›Narrow, testable service boundary
PythonFastAPIOpenCVYOLOv8DockerRails integration
$ cat ./stack.json
{
"backend": ["Ruby on Rails", "Node", "Python", "FastAPI", "Hotwire", "Sidekiq"],"frontend": ["React", "Next.js", "TypeScript", "Tailwind", "Stimulus"],"ai": ["OpenAI", "Anthropic", "LangChain", "Portkey", "Pinecone", "Vercel AI SDK"],"data": ["PostgreSQL", "MySQL", "Redis", "Supabase"],"infra": ["Docker", "AWS", "Heroku", "Kamal", "CI/CD"],"payments": ["Stripe", "Connect", "Braintree", "Paddle"]}
$ ./contact --all

$ sohair — 2026 · Lahore, PK · UTC+5