This page shows what I am working on at the moment.

HardwareHPC

Single-Tower High-Performance Rig

This machine currently runs 70B+ parameter models locally and processes terabyte-scale microscopy datasets. The full build-out to three GPUs and 1TB of RAM will generate value every day and stay relevant as I upgrade components.

The core philosophy here is modularity without compromise. The Threadripper 7970X gives me 48 PCIe 5.0 lanes, meaning I can run three flagship GPUs at full x16 bandwidth without needing £GBP thousands more on a dual-socket EPYC or enterprise Xeon platform. The ASUS Pro WS TRX50-SAGE has IPMI and ECC support, so this isn't just a gaming rig with delusions of grandeur—it's production-grade infrastructure.

This started as a microscopy research platform. I needed something that could crunch through days of high-resolution imaging data while simultaneously running LLM inference for automated experimental workflows. Turns out, the Venn diagram of "can process microscopy data" and "can run massive language models" is just "absurdly powerful computer."

ECC memory isn't negotiable. When you're running multi-day experiments or training on scientific data, a single bit flip can corrupt everything. The 128GB DDR5 ECC setup expands to 1TB because why set artificial limits?

The 96TB ZFS pool means I can stop worrying about cloud storage costs and actually work with real datasets locally. Checksumming, snapshots, data integrity—all the things you want when your data represents months of work.

The RTX 6000 Blackwell (96GB VRAM) is cutting-edge enough to stay relevant as models get bigger, and when I need more, I'll just add two more GPUs. 288GB total VRAM in a single tower. No racks, no datacenter, no monthly AWS bills making me cry.

Sub-systemComponentRationale
CPUAMD Threadripper 7970X32 cores, 48 PCIe 5.0 lanes.
GPUNVIDIA RTX PRO 6000 96GBBlackwell architecture for large-scale compute.
RAM128 GB DDR5-4800 ECCRDIMM; Expandable up to 1TB.
NVMe OSCrucial P2 1TBDedicated OS drive.
NVMe ScratchSamsung 9100 Pro 8TB8TB scratch storage for active datasets.
Bulk Storage96TB ZFS Pool4x Seagate IronWolf Pro 24TB drives.
MotherboardASUS Pro WS TRX50-SAGEIPMI and ECC support.
SoftwareVision-LLM

Scientific PDF Extraction Pipeline

A production pipeline for extracting high-fidelity text from scientific books and papers — without OCR. Traditional OCR collapses on the content that matters most: multi-column layouts, inline LaTeX equations, figure captions interleaved with text, and dense technical notation. This pipeline bypasses that entirely by treating each page as an image and using a vision-language model to read it directly.

microscopy_indexing_yolo-qwen2-72b ↗

PDFsource
→
Page imagespdf2image · 200 DPI
→
Layout detectionDocLayout-YOLO
→
TranscriptionQwen2-VL-72B
→
Structured JSONbbox · confidence · tokens
→
Markdownreading-order aware

DocLayout-YOLO (YOLOv10, trained on DocLayNet) runs first and classifies every region on the page into six content classes: Text, Title, Section-header, List-item, Caption, and Formula. Each detected region is cropped and passed individually to Qwen2-VL-72B, which transcribes the image directly. Tall blocks are chunked vertically before inference and reassembled afterward. Multi-column reading order is reconstructed from bounding box X-coordinates — left column top-to-bottom, then right column.

The extraction loop writes a checkpoint after every page. If the process is interrupted — OOM, power loss, deliberate pause — re-running the script picks up exactly where it left off. Batch size is reduced automatically on OOM and cautiously ramped back up on recovery. VRAM is monitored via pynvml against a configurable threshold; cleanup runs at page boundaries, not per-block, which is a meaningful throughput win on 72B models.

Pipeline running — checkpoint resume and model loading
Checkpoint resume and model loading Live VRAM monitoring and OOM batch reduction
MetricValue
Accuracy95%+ on scientific text
Throughput~15–25 tokens/sec
Pages/hour~30–50 (density-dependent)
VRAM usage70–90 GB (8-bit quantisation)
GPU targetA100 80GB / RTX 6000 96GB
# 1. Build the container
./manage_env.sh

# 2. Verify the container was created
docker ps -a

# 3. Start the container
docker start <container_name>

# 4. Enter the container
docker exec -it <container_name> bash

# 5. Rasterise PDF to images (inside container)
python pdf_to_images.py document.pdf --dpi 200

# 6. Run extraction (resumes automatically on restart)
python text_extraction_sequential.py

# 7. Export to Markdown
python json_to_markup.py output.json -o output.md
StackTechnologyRole
EnvironmentCUDA 12.6 · DockerPyTorch nightly, flash-attn 2.8.3 pinned for Blackwell.
Layout modelDocLayout-YOLO (YOLOv10)Detects and classifies page regions at 1120px imgsz.
TranscriptionQwen2-VL-72B (8-bit)Vision-language transcription per detected crop.
OutputJSON + MarkdownPer-block bbox, confidence, token count, reading order.
InfrastructureLLMRust

Delphi Deploy

A complete, self-contained deployment stack for Qwen3.5-122B-A22B (MoE, 22B active parameters) on a single high-VRAM GPU. Built around vLLM with an OpenAI-compatible API, it bundles a CLI coding agent, an interactive chat interface, a Rust-based web GUI with session management, and browser automation — all wired to the local model with zero cloud dependency.

The stack is named after the Oracle at Delphi. The model persona, Delphi, greets every new conversation as the Pythia at the Temple of Loxias — a private oracle running entirely on local hardware.

vLLM serverOpenAI-compatible API
→
Claw (Rust CLI)coding agent + GUI
→
Tailscaleremote GUI access

One-command bootstrap. bootstrap.sh is fully idempotent — it installs the conda environment, downloads ~79GB of model weights from HuggingFace, builds the Rust binary, caps GPU power via systemd, and starts the server. Re-running it at any time skips completed phases. A single config file, delphi.conf, is the source of truth for every runtime parameter; nothing is hardcoded elsewhere, and a drift scanner enforces this.

Claw is a modified Rust reimplementation of the Claude Code CLI, adapted to run against the local vLLM endpoint. Modifications add session load/resume from the web GUI, inline turn stats (elapsed time, tok/s), and an external HTML GUI file served at runtime — editable without recompiling.

The chat interface streams responses with live thinking-mode word counts, a context bar that tracks token usage against the 128K window, and automatic context compaction — when older messages push token usage past a threshold, the model summarises them into a dense block, preserving context indefinitely without truncation.

Delphi Deploy — live demo
deploy_qwen35_vllm.sh
Server lifecycle, chat REPL, coding agent, Claw launcher. Single entry point for all interfaces.
bootstrap.sh
One-command full system rebuild. Idempotent — safe to re-run. Handles 12 phases from GPU check to health validation.
claw-code/ (Rust)
Modified Claude Code-style CLI. Session resume, GUI v2, inline tok/s stats, Playwright browser tooling.
qwen_agent.py
Coding agent with file read/write/edit, grep, bash execution, session persistence, and memory injection.
gui-v2/gui.html
Self-contained web GUI with session history, rename, file drag-and-drop upload, and SSE streaming.
scripts/
Config validation, drift detection (scan for hardcoded values), and live STATUS.md snapshot generation.
ParameterValue
ModelQwen3.5-122B-A22B GPTQ-Int4 (MoE, 22B active)
Context window128K tokens (131,072)
KV cachefp8 — ~2× capacity vs bf16
GPU targetRTX PRO 6000 Blackwell 96GB (SM 12.0)
APIOpenAI-compatible · port 8000
Thinking modeEnabled · reasoning tokens shown in chat
Remote accessTailscale serve / funnel
Weights size~79 GB
# One-command setup on a fresh machine
cp delphi.conf.example delphi.conf
# Edit delphi.conf — set WORK_DIR, CLAW_DATA_DIR, etc.
./bootstrap.sh

# Interfaces
./deploy_qwen35_vllm.sh chat # streaming chat with thinking mode
./deploy_qwen35_vllm.sh claw # Claw REPL (Claude Code-style)
./deploy_qwen35_vllm.sh agent # coding agent (file/bash tools)
./claw-remote_2.sh # web GUI exposed over Tailscale

# Ops
./scripts/check_config.sh # validate config, paths, services
./scripts/check_config_drift.sh # scan for hardcoded values
./scripts/status_snapshot.sh --update # refresh STATUS.md
SoftwareSaaSMulti-Tenant

Epiproc Atlas — Procurement Intelligence Platform

A multi-tenant SaaS platform that turns scientific-supplier invoices into procurement intelligence. It takes the vision-LLM extraction approach from my Scientific PDF Extraction Pipeline — pages read as images by a vision model, never OCR — and wraps it in a full production stack that is sector-agnostic and scalable: schema-per-tenant PostgreSQL, server-side sessions, MFA, audit logging, a crash-safe job queue, observability, and a Cyber-Essentials-ready compliance pack. It runs entirely on the single-tower rig — UK data residency, no cloud.

Invoice PDFsource
→
Layoutpage-region detection
→
Extractionvision-LLM
→
Validationcross-foot checks
→
PostgreSQLschema-per-tenant
→
DashboardFastAPI · reports

Every database query is scoped to the tenant schema via SET search_path, and a CI test creates two tenants and asserts that one can never read the other's rows. Reports are generated on demand by either a self-hosted local model (GPU) or a cloud API, dispatched through a Postgres-backed job queue and worker that survives server restarts.

Multi-tenancy
Schema-per-tenant in shared Postgres. Every query scoped via search_path; a CI test proves zero cross-tenant leakage.
Security
argon2id hashing, server-side sessions with force-logout, CSRF, optional TOTP MFA, rate limiting, full audit log.
Job queue
Postgres-backed queue + worker (SELECT … FOR UPDATE SKIP LOCKED). Report jobs survive restarts; stuck jobs re-queue.
Dual report backends
On-demand AI briefings from a local model (GPU) or a cloud API, selectable per report.
Observability
Prometheus metrics, Grafana dashboard, Alertmanager rules, health probes, and an admin panel to control the local model service.
Onboarding harness
Template library + dry-run cross-foot gate brings a new supplier from sample PDFs to audited data in hours, not days.
LayerTechnologyRole
API / appFastAPI · Jinja2 · Python 3.12Server-rendered dashboard, admin panel, REST endpoints.
DataPostgreSQL 16 · psycopg3 (pooled) · PrefectSchema-per-tenant store; pipeline orchestration.
ModelsLocal model · Cloud APIExtraction and on-demand report generation.
Securityargon2-cffi · pyotp · slowapiHashing, TOTP MFA, CSRF, rate limiting.
ObservabilityPrometheus · Grafana · AlertmanagerMetrics, dashboards, alerting.
Qualitypytest · Playwright · ruff · pip-audit · GitHub ActionsUnit, integration & e2e tests, lint, dependency audit, CI.

Screenshots show a fully anonymised demonstration tenant — supplier names, departments, products and figures are fictitious.

BotanyHerbariumPrint

Quercus europaea

My personal theory about the rise of agriculture is that oaks are the cornerstone species that enabled the revolution, not cereals. Oak species are ubiquitous in every region where agriculture arose independently: the Fertile Crescent in the Levant; Mesoamerica, home to the highest diversity of oak species on Earth; and the Yangtze and Yellow river basins in China. Acorns are abundant in the archaeological record, and only in the Fertile Crescent does the balance tilt slightly towards cereals as the dominant crop. Both China and Mesoamerica tilt it towards acorns as precursors, before corn, rice and millet reached domestication. Japan and California had acorn economies of such scale that they never needed to develop agriculture at all.

Why? Oaks are deep-rooted trees, less sensitive to seasonal variation, and they respond to those fluctuations by masting: every four or five years a bumper crop is produced. Acorns are storable. The literature discusses how storage pits and the stone tools believed to be for cereal processing could have originated as acorn processing, or served both products seasonally. A preservation bias towards cereal grains may have handed us the wrong archaeological conclusion.

Method

It took me eight months to collect the twenty specimens on this sheet.

The project started in Bulgaria. The country has amazing forests and beautiful mountains, and with the Giro d'Italia kicking off there I had the perfect excuse for a trip to visit my dear friend Georgi Merev. While the cyclists were having a tough start in rain and cold, I was roaming the streets, parks and woodlands around Veliko Tarnovo and Plovdiv, observing and collecting.

Early summer took me to Sardinia, a Quercus lover's paradise. The maquis and garrigue are incredible landscapes, and it is there that the altitudinal gradient shows oaks specialising. The lowlands are the realm of Q. ilex, the holm oak, while the upper slopes are dominated by Q. pubescens sensu lato. Yes, Q. pubescens is a tricky species: the variation is so large that wherever it occurs botanists have created all sorts of subspecies, or simply described new species. Introgression and hybridisation are rampant, so sensu lato it is. But the interesting part is in the highlands, away from the coast. There the sughera is king (Q. suber), and the composition of these cork woodlands, which double as animal pens, is outstanding.

From Sardinia I travelled to the Netherlands, an awkward place to look for oaks, but if anything defines the modern Dutch landscape it is that this is the land of arborists and florists. The streets of any Dutch city are small arboretums, and simply walking through them reveals a majestic mixture of American red oaks and European white oaks. The Hortus Botanicus in Amsterdam has two jewels: a fine cork oak planted next to the shop, and a beautiful Q. × turneri. While I collected leaves the Breda Jazz Festival was in full swing, so the botany came enriched by classical and contemporary jazz, dotted with a good dose of salsa.

Finally, the UK is a huge arboretum disguised as a country. Because gardens and wealth have lived together for so long on these islands, you get the best of both worlds: classical cottage gardens, and the monumental private collections of rare specimens in the stately homes. A visit to Wimpole Estate hands you Q. ilex, Q. cerris and Q. petraea (rare in East Anglia) on a silver plate. A visit to the University of Surrey campus rewards you with a superb Q. pyrenaica, one of perhaps three in the whole country. Walking the streets of Cambridge you find all sorts of treasures hidden in plain sight — a beautiful Q. cerris on the rugby grounds, two fine Q. ilex in the gardens of Greenwich House, not to mention the trove in the Botanic Garden.

Field notes

Eighteen photographs from the collecting trips. Click any image for the full-size version.

A beautiful Q. ilex in one of the public parks in Alghero
1A beautiful Q. ilex in one of the public parks in Alghero
Q. ilex and Q. pubescens from a public park in Alghero
2Q. ilex and Q. pubescens from a public park in Alghero
Q. ilex near Alghero
3Q. ilex near Alghero
Q. coccifera bush. Collected mid-way on the climb to Monte Timidone. Parco Naturale Regionale di Porto Conte
4Q. coccifera bush. Collected mid-way on the climb to Monte Timidone. Parco Naturale Regionale di Porto Conte
The author standing next to a superb Q. suber in the road towards Villanova Monteleone
5The author standing next to a superb Q. suber in the road towards Villanova Monteleone
Collecting Q. pubescens in Parco Archeologico Nuraghe Appiu
6Collecting Q. pubescens in Parco Archeologico Nuraghe Appiu
The author in Monte Timidone. Near the summit.
7The author in Monte Timidone. Near the summit.
The Maquis in the lower areas of Parco Naturale Regionale di Porto Conte
8The Maquis in the lower areas of Parco Naturale Regionale di Porto Conte
A beautiful Q. robur in Wimpole Estate
9A beautiful Q. robur in Wimpole Estate
Q. petraea. Wimpole Estate
10Q. petraea. Wimpole Estate
Some Q. robur acorns collected in Ely, Cambridgeshire
11Some Q. robur acorns collected in Ely, Cambridgeshire
Q. cerris. Grange road rugby stadium. Cambridge
12Q. cerris. Grange road rugby stadium. Cambridge
The author standing outside the Ethnographical Museum of Plovdiv
13The author standing outside the Ethnographical Museum of Plovdiv
The author with Georgi Merev. Veliko Tarnovo during the Giro d’Italia
14The author with Georgi Merev. Veliko Tarnovo during the Giro d’Italia
The majestic Q. × turneri of the Hortus Botanicus. Amsterdam
15The majestic Q. × turneri of the Hortus Botanicus. Amsterdam
Q. suber. Hortus Botanicus. Amsterdam
16Q. suber. Hortus Botanicus. Amsterdam
The author cycling along Porto Conte. In the background Capo Caccia
17The author cycling along Porto Conte. In the background Capo Caccia
Down Monte Timidone. Alghero.
18Down Monte Timidone. Alghero.
Arrangement

The plate is ordered by section, not by size or appearance. A section is the rank between genus and species: a lineage of oaks descended from a common ancestor and sharing a set of characters — leaf type, tooth type, bark, and how long the acorn takes to ripen. It is a more useful ordering than appearance because it predicts behaviour. Oaks cross freely with other members of their own section and only rarely outside it, so section boundaries do the work that species boundaries fail to do in this genus. The three sections here belong to two subgenera: sect. Quercus in subgenus Quercus, sects. Cerris and Ilex in subgenus Cerris.

sect. Quercus
Deciduous white oaks, lobed, without bristle tips. Nine specimens: Q. frainetto, Q. petraea, Q. canariensis, Q. robur, Q. hartwissiana, Q. pubescens s.l., Q. pyrenaica, Q. infectoria subsp. veneris, Q. faginea.
sect. Cerris
Bristle-tipped teeth, centred on the eastern Mediterranean with western outliers. Four specimens: Q. castaneifolia, Q. suber, Q. trojana, Q. cerris.
sect. Ilex
Evergreen and sclerophyllous. Four specimens: Q. ilex s.l. shown twice as juvenile and adult foliage, Q. coccifera, Q. alnifolia.
hybrids
Three crosses, parentage stated beneath each specimen: Q. × turneri, Q. × warburgii, Q. × rosacea. Q. × turneri is the outlier, crossing not just sections but subgenera.

The two Q. ilex specimens are included because juvenile foliage is spinose and adult foliage entire, and the two are routinely logged as separate taxa in field records. Q. × rosacea (robur × petraea) is common in Britain and frequently recorded as one or other parent.

Scale and reproduction

All specimens are reproduced at true mounted size against a single 100 mm bar. No specimen is enlarged or reduced to fit its position, so relative size across the plate is measurable: Q. frainetto at the top left and Q. coccifera in sect. Ilex differ by roughly an order of magnitude in lamina area.

Distribution maps

One map per species, twenty in total, at the foot of the plate. Equal-area projection, native range only, no political borders. Fill colour carries the section: olive for Quercus, rust for Cerris, teal for Ilex. Q. ilex and Q. pubescens are mapped sensu lato, as both are aggregates. Ranges are approximate and intended for orientation.

ItemValue
FormatA1 · 841 × 594 mm
Specimens20 mounted · 17 species · 3 hybrids
SectionsQuercus · Cerris · Ilex
Collection sitesUnited Kingdom · Netherlands · Bulgaria · Italy
ReproductionTrue size · 100 mm reference bar
Maps20 · equal-area · native range, approximate

Sectional treatment follows the current placement of Quercus in subgenera Quercus and Cerris. Aggregates are marked s.l. Where a subspecies was collected it is given in full (Q. infectoria subsp. veneris). Hybrid parentage is stated as collected or as determined from morphology, not from genotyping.

Profile

Procurement strategist with deep expertise in complex scientific and technical categories, built through senior roles at the University of Cambridge. Designed and led category strategies across £11M in annual spend, delivered £25M+ in high-value tenders, and built supplier frameworks from greenfield across imaging, optics, and laboratory gases. Unusually, I understand the science behind what I buy: I have hands-on experience with the instruments, the data they generate, and the infrastructure needed to process it. This enables faster market analysis, sharper supplier evaluation, and better outcomes for technically demanding clients.

↓ Download CV
Key Achievements

  • Delivered £220K early savings (2%) across laboratory equipment categories by aggregating spend and centralising supplier relationships — with a roadmap to a further 5%.
  • Led 14+ high-value tenders totalling £25M+, including Wind Tunnel (£3M), Rotating Rig (£3M), Lab Equipment (£750K), and AV Systems (£1.2M) for world-class research facilities.
  • Designed and administered the University of Cambridge Laboratory Confocal Microscope Framework — a pre-agreed supplier structure that reduced procurement burden on research staff across multiple departments.
  • Built long-term category strategies for Laboratory Gases (£2M), Optics (£5M), and Imaging (£4M) from scratch in a greenfield procurement environment.
  • Negotiated major contracts in technically sensitive categories including lab gases (£3.2M) and specialist rotating equipment (£3M) with zero prior frameworks in place.
Professional Experience

Category Manager — Laboratory Mar 2023 – Present
University of Cambridge

Lead strategic procurement for three specialist categories with £11M combined annual spend, partnering directly with scientists, professors, and research infrastructure teams.

  • Developed long-term category strategies for Imaging (£4M), Optics (£5M), and Laboratory Gases (£2M) — establishing market intelligence, supplier landscapes, and multi-year sourcing plans.
  • Co-created and administered the Confocal Microscope Framework Agreement, streamlining access for research teams and embedding pre-negotiated commercial terms across the supplier base.
  • Achieved 2% category-wide cost savings by centralising demand and aggregating supplier relationships; identified pathway to further 5% reduction.
  • Produced advanced spend analytics and market visualisations using Python — enabling data-driven category decisions beyond standard procurement reporting.
  • Embedded as a trusted advisor to scientific stakeholders — translating complex technical requirements into commercial strategy and supplier briefs.
Project Buyer Aug 2021 – Mar 2023
University of Cambridge

Led end-to-end procurement for major capital and infrastructure projects across Science, Engineering, Chemistry, and Physics faculties.

  • Managed 14+ tenders valued at £25M+, including the UK National Centre for Propulsion and Power (Whittle Laboratory) and the New Atria Building (Heart & Lung Institute).
  • Negotiated contracts across technically complex categories: Wind Tunnel (£3M), Rotating Rig (£3M), Lab Gases (£3.2M), Lab Equipment (£750K), AV Systems (£1.2M).
  • Built relationships with academic and scientific stakeholders to translate research requirements into fit-for-purpose procurement specifications.
Procurement Specialist Feb 2021 – Jul 2021
NHS Collaborative Procurement Hub — East of England
  • Supported procurement across FM, ICT, and clinical categories; contributed to the rollout of three major procurement frameworks.
  • Led bid evaluation and tendering processes reporting to the Head of Corporate Services.
Contracts & Performance Officer Jan 2020 – Jan 2021
Mayor's Office for Policing and Crime (MOPAC)
  • Managed complex contract administration and supplier performance monitoring for major public sector contracts.
  • Delivered process improvements saving approximately 300 staff hours through optimised contract and PO procedures.
Contracts Assistant (NPPV3) Mar 2019 – Dec 2019
Bedfordshire Police
  • ICT procurement and contract management for critical police technology systems (£20M annual budget).
Procurement Manager Sep 2017 – Feb 2019
Agrosight
  • Led international procurement for product development; negotiated contracts with UK and Chinese manufacturers.
  • Achieved £400K+ in cost savings and secured initial contracts with Brazilian customers.
Consultant Jul 2016 – Sep 2016
UNEP-WCMC
Project Manager Jan 2010 – Jul 2015
Oro Verde — Die Tropenwaldstiftung

Managed international conservation programmes across South America. Led cross-border stakeholder engagement, grant management, and project delivery in complex, low-resource environments.

Technical Capability

Alongside procurement work, I maintain active research and engineering projects in inference efficiency and scientific imaging infrastructure — areas directly relevant to technology and life sciences procurement mandates.

  • Python data analysis (Pandas, Matplotlib, Plotly) — used in production for spend analytics, category reporting, and supplier market modelling.
  • Scientific imaging infrastructure: designed and built processing pipelines for 200GB+ Zeiss confocal datasets (OME-Zarr, parallel stitching, NVMe-optimised I/O).
  • LLM inference research: developed forge-edge, a Shannon-grounded inference optimisation system achieving 1.18× speedup on 14B parameter models with zero quality degradation.
  • Operates a local HPC workstation (Threadripper 7970X, RTX PRO 6000 96GB, 96TB ZFS) — practical familiarity with the infrastructure procurement clients in research and deep tech are acquiring.
Qualifications & Education

CIPS Level 4 Chartered Institute of Procurement & Supply Completed
Masters in Conservation Leadership University of Cambridge
LLM in International Environmental Law SOAS – University of London
Degree in Law Universidad Santa María, Venezuela