Work

Systems we designed, built and shipped.

Public repositories and in-house builds, with the technical decisions written out. Client work under agreement isn't listed — ask and we'll talk through comparable projects.

Lead generation · Python

Discovery, extraction, generation and dispatch in a single pipeline.

All-in-One Client Finder

An outreach system that finds businesses on LinkedIn and Google Maps, crawls their websites for contact details, generates a personalised message for each contact, sends it over SMTP and logs every send so no one is contacted twice. A second track discovers prospects on freelance marketplaces and drafts pitches for them.

It runs unattended with cooldown logic between cycles, keeps every stage in reviewable CSV files rather than a black box, and falls back to a locally hosted model when cloud APIs are unavailable — so a rate limit or an outage doesn't halt the pipeline.

Python 3.10+OllamaSMTPOpenRouterGemini
Result: the full cycle — discovery through to sent mail — running from a single command, with per-stage output you can audit.
Price intelligence · Python

Built to be pointed at a real client catalogue.

E-commerce price scraper

A production-shaped catalogue scraper: page-by-page crawling with pagination handling, structured extraction of name, price, currency, image and stock status, price parsing with currency detection, and deduplication by product ID. Exports to both CSV and JSON, ready for a spreadsheet or a database load.

Headless by default for server and CI use, with a configurable delay between requests so it stays polite to the target. Swapping selectors, adding proxy rotation, writing to PostgreSQL instead of CSV, or scheduling it to diff prices over time are all deliberate extension points rather than rewrites.

SeleniumBaseHeadlessCSV / JSONDataclasses
Result: repeatable pricing snapshots that can be scheduled and compared across runs.
AI agents · JavaScript

Manifest V3 Chrome extension.

Agent Blue — natural-language browser automation

Describe a goal in plain English and the extension carries it out: it analyses the live DOM to work out which controls to use, then navigates, clicks, types and scrolls. Extracted text goes into a memory scratchpad it can reuse across tabs and sites, so multi-step tasks survive a page change.

Provider-agnostic across Gemini, GPT-4o, Groq and local Ollama models, on a bring-your-own-key basis — running costs and data stay with the user, and everything executes locally rather than through a hosted service.

Manifest V3GeminiGroqOllamaBYOK
Result: repetitive browser work described once instead of performed every day.
Market intelligence · Python

Two related builds.

AI competitor analysis

Scrapes competitor listings and reviews, then uses generative models and sentiment analysis to compare features and surface where a product is losing on perception rather than capability. Results land in a SQL database so they can be queried and tracked over time instead of read once and lost.

A second build extends the same pipeline into structured feature-by-feature comparison, producing the kind of grid a product team can act on directly.

PythonLocal LLMsSQLSentiment analysis
Result: competitor positioning tracked continuously rather than researched once a quarter.
Backend · Python

Deployed service, not a notebook.

Scraper API

Extraction exposed as a service rather than a script: an HTTP API that accepts a target and returns structured records, containerised and deployed to a VPS with a managed browser runtime behind it. Built so a client's own systems can request data on demand instead of waiting for a file.

FastAPIPostgreSQLDockerChromeDriver
Result: extraction available as an endpoint your application can call.
Quantitative research · Python

Research systems, not signal selling.

Algorithmic trading and RL strategy research

Backtesting and reinforcement-learning experiments against live-market data through MT5 and demo accounts, with a separate execution engine for running strategies under controlled conditions. Built as research infrastructure — reproducible runs, logged results, no claims about returns.

PythonReinforcement learningMT5Backtesting
Result: a testbed where a strategy can be evaluated before any money is involved.
Document processing · n8n

Automation with OCR in the loop.

OCR document workflows

n8n workflows that take documents in whatever form they arrive — scans, photographs, PDFs — run OCR over them, and push the extracted fields into the systems that need them. The kind of process that otherwise consumes a person's morning, running instead on a trigger.

n8nOCRWebhooks
Result: paper and PDF input turned into structured records without manual re-typing.
Machine learning · Python

Classification on messy real-world text.

Fraudulent job posting classifier

A supervised model that separates genuine job listings from fraudulent ones, built through the full cycle — exploratory analysis, feature engineering, model comparison and evaluation. Representative of the classification and scoring work we take on: churn, lead quality, fraud and content triage.

Pythonscikit-learnEDAModel evaluation
Result: a scored, evaluated classifier rather than an untested notebook.
Open source · C++

Contribution to a widely used library.

glaze — string truncation fix

Diagnosed and fixed a string truncation bug in glaze, a high-performance C++ serialisation and reflection library. Patch reviewed and merged upstream.

C++SerialisationUpstream merged
Result: a fix now shipping to every downstream user of the library.

Browse the repositories on GitHub

Start here

Your project probably resembles one of these.

Tell us which, and we'll tell you what it costs and when it lands.