Work
Projects.
12 projects across IT support, cloud and infrastructure, AI, software and testing. Pick what you’re hiring for and the most relevant come first.
12 projects
Projects
AI & AgentsSoftware
Document-extraction pipeline
Insurance documents in, structured records out: classified, read by vision and language models, checked, and saved.- Problem
- Documents arrive by email in dozens of layouts and versions. Reviewers were reading them by hand and retyping the fields that mattered into another system.
- Approach
- Attachments land in blob storage, and a classifier routes each document by type. Accuracy first reached about 98% with Azure Document Intelligence and OpenAI vision models. We then benchmarked open-source models to cut cost and moved to a hybrid: NuExtract 3 with Docling for checkboxes on dense forms, and PaddleOCR then Kimi for tables and general PDFs.
- Outcome
- Documents that used to be keyed in by hand arrive as structured records. Every value links back to its bounding box on the page, and low-confidence fields go to a human.
- Stack
- Python · FastAPI · PostgreSQL · Azure Document Intelligence · Azure OpenAI · NuExtract 3 · PaddleOCR · Docling · Kimi · Next.js
Cloud & InfrastructureAI & Agents
Self-hosted GPU servers for AI models
Custom and open-source models served from GPU servers we run, in development and production, instead of paying a metered API per call.- Problem
- Every extraction call was billed per request by a managed AI service, and documents left our network to be read. The cost grew with every document.
- Approach
- Provisioned GPU instances on Akamai Cloud for development and production, and on Google Cloud for evaluation. Packaged the models in containers, served them behind an authenticated private endpoint, and tunnelled ports so accuracy could be tested against the real serving path from a laptop.
- Outcome
- Models run on GPU servers the team controls, so cost no longer scales per call and documents stay in-house.
- Stack
- Linux · Docker · SSH tunnels · Firewall/ports · NVIDIA L4 · RTX 6000 Pro · Akamai Cloud · Google Cloud
IT SupportCloud & Infrastructure
Active Directory administration
Running a Windows domain: users, groups, OUs and Group Policy, plus the tickets help desks handle every day.- Problem
- Most organizations still run on Active Directory. Support and sysadmin work means knowing it well enough to fix access problems quickly and safely.
- Approach
- Set up a domain controller with DNS, organized users and computers into OUs by department, created security groups for access, joined a Windows client to the domain, and used Group Policy for password rules, mapped drives and desktop settings. Then practised the common tickets: lockouts, password resets, new starters, department moves and leavers.
- Outcome
- Hands-on practice with the everyday Active Directory tasks that support and sysadmin roles handle.
- Stack
- Windows Server · Active Directory Domain Services · DNS · Group Policy · ADUC · PowerShell (basic)
IT SupportCloud & Infrastructure
Hands-on support: repairs and PC builds
I diagnose and fix Windows PCs and laptops, build desktops from parts, and set up the devices people work with every day.- Problem
- People bring me a blue screen, a laptop whose battery dies in an hour, or a PC that says "no boot disk found", usually with no idea what's wrong.
- Approach
- I ask what changed, reproduce the fault, then work from the simplest cause up: power and connections, then drivers and updates, then disk and memory health, and only then a repair or clean reinstall, with files backed up first. Before handing it back, I explain what went wrong and how to avoid it.
- Outcome
- Machines back in use, files kept, and people who understand what happened.
- Stack
- Windows 10/11 · Windows Recovery Environment · Safe Mode · Device Manager · BIOS/UEFI · Disk and memory diagnostics · SFC/DISM
IT SupportCloud & InfrastructureSoftware
User access: Microsoft 365, Entra ID and AWS
Adding users, granting and removing access, and connecting Microsoft Entra ID sign-in to the platform's services.- Problem
- A growing team and several services meant access had to be granted, checked and removed reliably, in more than one cloud.
- Approach
- Users and groups live in Entra ID, and every service checks the same identity through Microsoft Graph. In AWS, each person or service gets an IAM user with only the permissions it needs.
- Outcome
- One place to add or remove a person in Microsoft's cloud, and limited access in AWS.
- Stack
- Microsoft 365 admin · Microsoft Entra ID · Microsoft Graph · AWS IAM · OAuth 2.0 / OIDC
IT SupportCloud & InfrastructureTesting & QA
Troubleshooting a live platform, often overnight
When uploads failed or results came back wrong during releases, I traced the logs to the cause and confirmed the fix.- Problem
- A multi-service platform can fail in many places: an upload, a queue, a model endpoint, a database write. What the user sees rarely points at the cause.
- Approach
- Reproduce with the same file, follow its record ID through each service's logs over SSH, check the model endpoint and the network (ports, IPs, firewall), and narrow it to one service. Then write up the cause, the fix and how it was verified in Jira, and explain it to the team in plain terms.
- Outcome
- Each failure traced to its cause, and each fix confirmed and written up.
- Stack
- Linux · SSH · Application and server logs · Postman · Jira · Azure · Docker
AI & AgentsSoftware
Search and answers over the document archive
Embeddings in PostgreSQL, an Azure AI Search index, and a RAG layer on top: ask in plain English, get an answer that cites its source.- Problem
- Answers lived in years of archived policy wordings, guidelines and claim files. Finding one meant searching folders and reading PDFs end to end, and keyword search missed anything phrased differently.
- Approach
- Documents are chunked and embedded. Vectors live beside the records in PostgreSQL with pgvector, so similarity search is plain SQL. The same chunks are indexed in Azure AI Search for hybrid retrieval: keyword and vector scores fused, then a semantic reranker. An LLM answers from the top chunks only, citing each one, and says so when nothing scores high enough.
- Outcome
- Questions over the archive can be asked in plain English, and each answer cites the passage it came from so it can be checked.
- Stack
- PostgreSQL · pgvector · Azure AI Search · Embeddings · RAG · Python · FastAPI · AWS Bedrock · Amazon S3
AI & AgentsSoftware
Agent workflow: research-to-publish pipeline
A LangGraph workflow that finds trending topics, researches them, writes and illustrates a post, and publishes it to WordPress.- Problem
- Running a content site by hand takes hours per post: finding topics worth writing about, researching, writing, making images and publishing.
- Approach
- A LangGraph graph passes state between steps: topic discovery scored for demand, web research through Tavily, drafting with Azure OpenAI (GPT-5 mini/nano), a pgvector check so the site doesn't repeat itself, image generation with Gemini, then publishing through the WordPress API.
- Outcome
- Version 2 in progress.
- Stack
- Python · LangGraph · Azure OpenAI (GPT-5 mini/nano) · PostgreSQL + pgvector · Tavily · Gemini · WordPress REST API
Testing & QASoftwareIT Support
Testing and defect tracking
Where I started: testing every document upload and API end to end, and turning failures into clear, reproducible Jira tickets.- Problem
- An extraction platform can return a confident answer that is wrong. No tool can reliably check a scanned PDF, and the AI models themselves can hallucinate, so the final check has to be a person.
- Approach
- Upload real documents through the API in Postman and compare every extracted field with the scanned source. Log each mismatch in Jira with the file, the field, the expected value and steps to reproduce. Re-test after every prompt or model change to catch regressions.
- Outcome
- Defects anyone on the team could reproduce, and accuracy that was measured instead of assumed.
- Stack
- Postman · Jira · REST APIs · Python · Log analysis
AI & AgentsTesting & QACloud & Infrastructure
Choosing the right model: GPU benchmarks
Tested open-source OCR and vision models against a managed AI service on the same documents, then matched each document type to the model that earned it.- Problem
- The managed AI service was accurate, but it was billed per call, so the cost grew with every document.
- Approach
- Deployed 5+ open-source OCR and vision-language models on Akamai Cloud and Google Cloud GPUs (NVIDIA L4, RTX 6000 Pro), ran the same labelled documents through each, and scored every field by hand. Checkboxes got their own benchmark because they were the hardest part. Also evaluated AWS Bedrock Knowledge Bases for document Q&A; made-up answers on missing checkbox marks were the blocking issue.
- Outcome
- A hybrid setup chosen by measured accuracy and cost: NuExtract 3 and Docling for dense forms, PaddleOCR then Kimi for tables and general PDFs.
- Stack
- Akamai Cloud · Google Cloud · NVIDIA L4 · RTX 6000 Pro · Docker · SSH tunnels · Python · AWS Bedrock
Cloud & InfrastructureSoftware
Containerized deployments and CI/CD
Every service ships as a container: YAML pipelines build and check it, and shell scripts deploy it to Azure and Google Cloud VMs.- Problem
- Several services and several developers: every change had to build, pass checks and deploy the same way.
- Approach
- Work lands through pull requests into dev. A YAML pipeline builds each service, runs the SonarQube gate and builds its Docker image. A .sh script then runs on the VM over SSH and brings the services up with Docker Compose. The same flow deploys to Azure and Google Cloud, and a scheduled pipeline keeps each VM's packages updated.
- Outcome
- One path from commit to running container for every service on both clouds, issues caught before they merge, and VMs patched without logging in by hand.
- Stack
- Azure DevOps · YAML pipelines · Docker · Docker Compose · Bash scripts · SonarQube · Git · Linux VMs · Azure · Google Cloud
Software
Step-by-step policy submission
A multi-screen policy-creation flow that saves every step as it's submitted and sends it to the policy system.- Problem
- Creating a policy took several long forms; losing progress halfway meant starting again.
- Approach
- Split the flow into steps (account, locations, loss history, property and values). Each step's payload is saved when submitted and sent to the submission service, so a session can stop and resume.
- Outcome
- Underwriters can pick up a half-finished submission where they left it.
- Stack
- React · Next.js · TypeScript · Django · PostgreSQL · External system API