Projects
A Making Tax Digital platform for UK landlords that keeps property records and files cumulative quarterly updates straight to HMRC. Landlords add income and expenses by hand or import a bank statement CSV through a two-step preview that blocks duplicate rows. Every figure is stored as integer pence and mapped to HMRC's property headings, with joint ownership shares and mortgage interest handled the way HMRC requires. It connects to HMRC over OAuth with encrypted tokens, sends validated fraud prevention headers, checks obligations and deadlines, and keeps an append-only audit trail of every submission. Built as a modular monolith (FastAPI, PostgreSQL, SQLAlchemy 2.0, Alembic) with a React and TypeScript frontend whose types are generated from the API, Auth0 sign-in in the UK region, and a CI gate that runs more than 600 automated tests, covering the backend on SQLite and Postgres plus frontend unit and browser tests with accessibility checks at phone, tablet and laptop sizes. The live demo runs end to end on HMRC's sandbox.
Live DemoAn enterprise energy intelligence platform for UK and European industrial operations. It provides real-time multi-site energy monitoring, ML anomaly detection with an isolation forest model, causal AI root-cause analysis with quantified causal strength scores, and CSRD-ready ESG reporting covering Scope 2 emissions, GRI 302-1 and carbon intensity. Includes a plain-English AI assistant powered by Claude, JWT authentication with role-based access control, and 911 passing tests. The live demo is deployed on Render.
View on GitHub Live DemoStructured extraction and deterministic validation for UK commercial energy bills, and the bill-intelligence module of VoltEdge. It accepts PDFs and phone photos (including iPhone HEIC), sends each one to Claude for schema-constrained extraction into a fixed Pydantic model, then runs a registry of independent validation checks covering MPAN digit counts, subtotal and VAT reconciliation, estimated reads, duplicate charges, contract-renewal windows and non-energy-bill detection. It ships a FastAPI review app with a drag-and-drop frontend, SQLite persistence, API-key auth and JSON, Excel and CSV export, plus a cross-portfolio layer that surfaces renewals, quantified suspected overcharges and supplier comparisons. Includes interactive OpenAPI docs, a Render deployment blueprint and 50 passing golden-file tests anchored on real, anonymised supplier bills.
View on GitHubA B2B clinical trial site performance intelligence platform for mid-market CROs in the UK and EU. It monitors enrolment velocity, risk scores and protocol deviations across trial sites, with an AI-assisted insights layer powered by Claude. Features a FastAPI backend, a Plotly Dash dashboard and a SQLAlchemy data layer that seeds itself on startup. Built across five phases with 496 passing tests.
View on GitHubA production-grade UK salary intelligence platform built on ONS open data. It aggregates Annual Survey of Hours and Earnings data, applies CPI inflation adjustment and statistical analysis, and delivers fair salary benchmarks through a REST API and a React dashboard. Features include regional breakdowns, gender pay gap trends, occupation distribution profiles and CAGR analysis, all GDPR-compliant with no personal data collected. Deployable to AWS ECS Fargate or GCP Cloud Run with a multi-stage Docker build.
View on GitHubA public data challenge on GitHub about UK jobs, unemployment and pay. One script downloads 33 ONS labour market series and HMRC payroll data, and a State of UK Jobs report of eight findings is generated straight from the data, so every number and sentence stays true as new figures arrive. At launch in October 2026 it showed long-term sickness up 620,000 since Covid to 2.74 million people, youth unemployment at 15.6%, a jobs market cooling from its 2022 record, and survey and payroll figures pointing in opposite directions since late 2024. A weekly GitHub Actions job tests the new data and opens a pull request with refreshed charts after every ONS release. All 15 charts are drawn with Bezel Charts, my own library, and each month brings a new brief with beginner to expert levels.
View on GitHubA public monthly data challenge on GitHub that asks how UK house prices respond to economic shocks. It's built on the HM Land Registry UK House Price Index, with monthly prices from 1995 to 2026 by country, region, local area and property type. The first brief tracks the 2008 crash region by region: London took about 4 years to get back to its peak, the North East 13.5, and Northern Ireland is still below where it was in 2007. It also covers the stamp duty holiday spike and the 4% dip as Bank Rate rose from 0.1% to 5.25%. It comes with six reproducible charts, a pandas starter script and a roadmap for joining prices to ONS affordability, Bank Rate and CPI data. Anyone can take part, with a GitHub Discussion for sharing findings and voting on topics.
View on GitHubWhat I've Shipped
Ten zero-dependency chart tiles drawn in pure SVG, a sibling of Bezel: sparklines, lines, bars and grouped bars, rings, donuts, gauges, progress bars, a year-long heatmap and a scatter plot with a least-squares trend line and Pearson's r. Each chart is one HTML tag that fills its container, follows the viewer's light or dark setting, formats numbers for any locale and describes itself to screen readers. A Studio imports CSV, Excel or JSON, or cells pasted from a spreadsheet, picks out labels, series, units and dates, and exports the chart as HTML, a shareable link or a static SVG for READMEs, Notion and slides. The same ten charts are also a Python package on PyPI (pip install bezel-charts) that draws them straight from pandas DataFrames for notebooks, reports and READMEs, tested to match the browser version byte for byte. The web components are about 12 kB gzipped, with unit tests and a Playwright browser test.
View on GitHub Live Demo View on PyPIFive zero-dependency web components for clocks, a calendar, live weather, an at-a-glance dashboard and a large-type poster calendar, inspired by Apple's StandBy widgets. Every tile is drawn in vectors and sized with container query units, so it looks the same at 120 px or across a 4K screen. A Studio lets anyone design a tile, share it as a link and copy the code, with automatic dark mode, live weather from Open-Meteo, .ics calendar feeds and weather words in seven languages. About 25 kB gzipped, tested with unit and browser suites, with zero axe accessibility violations.
View on GitHub Live DemoAn open-source JavaScript library of ten dot-formation animations: sphere, wave, spikes, network constellation, torus, double helix, spiral galaxy, loader ring, wireframe cube and k-means clusters. Any shape morphs smoothly into any other, and each has its own silhouette, drawing style and motion. Built for loaders, AI thinking states and small interactive moments. One file, about 5 KB gzipped, no dependencies, with support for reduced motion, keyboard use, and light and dark themes. Try it in the Get in Touch section below: click the orb to change its shape.
View on GitHub Live DemoAn open-source kit of 183 layered-line symbols, letters and numbers, inspired by the stacked layers of a 3D print. A Python pipeline built on fontTools and Shapely extracts glyph outlines from Inter Display, resolves nested contours and generates original geometric shapes. A custom JavaScript scanline engine then slices every outline live in the browser at any angle, merges overlapping letters and tests several grid offsets to remove stray slivers. Designers can tune line count, weight, angle and four effects, colour symbols with a solid or gradient ink, set any word in the type tester, and export SVG, PNG, CSS or a ZIP with an SVG sprite.
View on GitHub Live DemoAn interactive choropleth world map covering 172 countries across 7 data layers: population density, GDP per capita, HDI, CO₂ per capita, life expectancy, internet usage and a default view. Features region and political group filters (EU, G20, NATO, BRICS+), CSV and JSON data import, shareable URLs, iframe embedding with a JavaScript API, full keyboard navigation and dark mode, with zero dependencies in one HTML file.
View on GitHub Live DemoWhat I've Built
A higher-or-lower guessing game inspired by higherlowergame.com. Players see two items and guess which one gets more monthly Google searches. It has 3,187 questions across 11 categories, including Sports, Celebrity, Tech, Gaming, Geography and History, with 3 lives, high scores per category, subcategory navigation and smooth card animations. Free to play.
View on Google PlayBuild a world from nothing and watch it grow. World Builders is an open sandbox that gives you the tools to shape the land and expand it piece by piece, at your own pace. No timers and no fixed goals, just room to create and experiment. Free to download and play.
View on Google PlayAn adventure-based learning app for children aged 3 to 11. It combines storytelling and exploration with maths challenges to build core skills in a way that feels like play rather than study. Free to download and use.
View on Google PlayA fun, bingo-style maths game for Android. Familiar bingo mechanics make practising maths engaging, and the design keeps players coming back. Free to download and play.
View on Google PlayA minimal, fullscreen animated live wallpaper for Android that shows the current month. Fully customisable, with multiple languages and fonts, a breathing animation and a live clock. Free to download.
View on Google PlayA minimal, fullscreen animated live wallpaper for Android that shows the current day of the week. Supports multiple languages and fonts, with a breathing animation and a live clock. Free to download.
View on Google PlayTurns an Android phone into a living departure board. Inspired by the classic split-flap Solari boards, it shows live world clocks for multiple cities with authentic flip animations. Supports 300+ world cities and multiple colour themes. Free to download.
View on Google PlaySkills & Tools
- Python
- Kotlin & Java
- Flutter
- JavaScript
- TypeScript
- HTML & CSS
- SVG
- SQL & PostgreSQL
- SQLite
- Machine Learning
- NLP & spaCy
- pandas & NumPy
- scikit-learn
- SciPy
- Data Visualisation
- FastAPI
- Plotly Dash
- React
- Flask
- SQLAlchemy & Alembic
- Pydantic
- Vite
- Node.js
- Web Components
- Electron
- Streamlit
- Docker
- Git & GitHub
- GitHub Actions (CI/CD)
- pytest, Vitest & Playwright
- REST APIs
- Jupyter
- Matplotlib & Seaborn
- Plotly
- Tableau
- fontTools & Shapely
- Vanilla JS
- HTML5 Canvas
- AWS
- GCP
- Railway
- Render
- Auth0, OAuth 2.0 & OIDC
- HMRC Making Tax Digital APIs
- Accessibility (WCAG, axe)
- Causal AI & NetworkX
- Android Development
- Generative Design
- UI / Visual Design
- Digital Product Design
- Open-Source Maintenance
- Anthropic Claude API
- ChatGPT & Gemini
- Photography
- Videography
From raw data
to something useful
I'm a London-based Data Scientist and Python Developer, trained through Imperial College London's Data Science Bootcamp (96% average). My work covers the whole data workflow, from cleaning messy datasets and building models to turning the result into a tested, deployed product. Lately that has mostly meant B2B platforms, like a Making Tax Digital service that files to HMRC and an energy intelligence tool for industrial sites.
Outside client and product work, I build my own things: Android apps, generative art systems, live wallpapers, word-cloud typography. Fifty-plus projects so far, spread across the Google Play Store, Gumroad, Envato, and Lemon Squeezy. Running them myself taught me things that are hard to learn any other way: how to price something, when to ship versus keep polishing, and what users respond to once a product is out in the world.
There's a quieter part of my life too. After major surgery and the birth of my eldest child, I started donating blood regularly, and have now made 50+ donations, with my 50th recognised by NHS Blood and Transplant. It's a small, repeatable way of putting something back.
I also write, though not often and not because I'd call myself a writer. On Reddit, I share programming work and what I've learned building it. On Medium, I write personal essays, because some thoughts just need somewhere to land. You'll find those in the Writing section below.
Certifications
What I've Written
Reflections on becoming, connection, and the things that stay with you.
Get in Touch
Open to freelance, contract, and full-time opportunities, in London or internationally, wherever the work is interesting. If you're building something that matters, bring the problem. I'll bring the code, the models, and the thinking.
Download CV