MSc Financial Technology (1st Class Hons.), University of Exeter · BSc Financial Mathematics, University of Kent
Software engineer: reliable distributed systems, payments infrastructure and blockchain protocols.
My first venture into crypto was in 2014, mining Litecoin on a PC I had built at home,
mostly for games. After my degree I decided to trade crypto full time for a year, on
the strength of a £1,300 interest-free overdraft and not a great deal else. It
went better than a sensible person would have predicted. Within a year the overdraft
had paid for a master's in Financial Technology at the University of Exeter, and I
finished it with first-class honours.
After the MSc I spent roughly 2.5 years working for myself in crypto, trading both on-
and off-chain, and running self-hosted blockchain infrastructure from Hetzner
servers. This is what led me to my first official job at
Edge & Node, building
The Graph (GRT), where I spent just over 2.5 years
and got promoted twice along the way. I started out as a research analyst, in a small
economics research team, designing the algorithm and latency linear regression model
that ranks protocol participants and decides which of them earn paid indexing work.
My work then moved from research to engineering to build out more of the Direct
Indexing Payments (DIPs) stack.
35Mchain RPC requests routed daily by my Go load balancerMeasured from the balancer's own metrics: about 25,000 requests a minute averaged across Arbitrum, Avalanche, Ethereum and their testnets. Private repo; demo on request.
19security findings fixed across The Graph, including a critical issuance vulnerability13 OpenZeppelin findings on The Graph's Horizon contracts and 5 high-severity findings from the TRST audit of the indexer service. Separately, investigated and patched a vulnerability, reported through The Graph's Immunefi bug bounty, that would have let an attacker earn protocol issuance without contest.
Picks which indexers are offered paid indexing work. Taken from research prototype to
production in Kubernetes. It replays about 1.7 billion gateway query records daily from
Redpanda, sampling them for my latency linear regression. Indexers are scored on
economic security, price, latency, uptime and success rate, preferring those already
synced, and agreements go to a group with a high decentralisation score.
Offers indexing agreements to indexers and manages each from proposal through settlement
and withdrawal. Designed the agreement lifecycle state machine, chain listener and
recovery paths that keep a dataset served when an indexer rejects, never answers or
quietly stops indexing. Moved payments from off-chain signed vouchers to on-chain escrow
across 4 repositories.
Decides which indexers qualify for The Graph's indexing rewards and records the
decisions on-chain on Arbitrum. Built the service and the criteria it enforces: a
rolling 28-day window counting days an indexer served queries meeting published
thresholds for response status, latency and freshness. Took it to production with RPC
failover, gas bounds, a circuit breaker, and Slack and Opsgenie alerting.
The service indexers run to receive, verify and answer agreement proposals over gRPC.
Wrote 25 of 26 changes merged to its DIPs code from January to August 2026. Rebuilt the
trust model: proposals are attributed to whoever actually signed them and accepted only
if that signer is on the protocol's on-chain list of approved payers, not a sender field
anyone could fill in.
Moved on-chain acceptance onto its own parallel loop so agreements stopped expiring
unaccepted under a backlog, then fixed 3 ways the agent quietly cost indexers money:
dropped final payments, allocations left indexing unpaid, and live agreements
destroyed by closing a stale allocation.
Created the shared view of the on-chain record both sides read: indexes agreement and
offer events from The Graph's contracts and serves them from a single GraphQL
endpoint, so the paying service can reconcile and backfill without calling contracts
over RPC on every catch-up pass.
Node operations
Off the clock · Infrastructure
I run a Graph Protocol indexer on mainnet and testnet, the same software I spent years
building payment rails for, behind a fleet of 6 chain archive nodes and my Go load
balancer, routing roughly 35 million RPC requests daily, plus validators on crypto
networks. All on my own Proxmox and KVM hosts with ZFS storage, automated snapshots,
Ansible configuration and Docker deployment.
LLM GPU workstation
Off the clock · AI
I built my own at-home LLM GPU workstation that serves self-hosted open-weight
models with speculative decoding. I use this workstation to run some of my
coding-agent sessions locally, instead of against a cloud API. This gives me access
to 24/7 compute, which is useful for tasks with longer time horizons.
Options data pipeline
Off the clock · Quant
I run my own stock options data collection pipeline, tracking prices for
over 100,000 options contracts covering stocks in the S&P 500. This pipeline's
goal is to investigate profitable trading strategies around selling volatility risk
premium from a quantitative analysis perspective.
Smart contracts & security
Protocol security · Solidity · EVM
Fixed 5 high-severity findings from the TRST third-party security audit of The
Graph's indexer service, and addressed 13 OpenZeppelin audit findings across The
Graph's Horizon upgrade contracts. Investigated and patched a subgraph withholding
vulnerability, reported through The Graph's Immunefi bug bounty, that would have
let an attacker earn protocol issuance without contest. Wrote the EVM-facing
components of dipper and the
rewards eligibility oracle.
Cross-chain GRT
Bridging · CCIP
Worked with Chainlink
to integrate GRT with CCIP for The Graph's cross-chain token launch and pushed for
Avalanche support. Deployed GRT on Base with a council-approved risk assessment. Built
the council-required bridge monitor: every 5 minutes it checks CCIP rate-limiter
capacity across Base, Avalanche, Arbitrum and Solana, paging on-call when capacity runs
low or looks anomalous. Scoped contracts for delegating GRT across chains.
A hardened home network edge, from scratch:
a reference guide to building a firewall that filters DNS, admits nobody but you,
watches for intrusions and keeps latency low under load. Example values throughout.
Erigon:
2 merged contributions to one of the main Ethereum execution clients: a fix restoring
receipt state correctly when the chain briefly reorganises, and logging for the reorg
paths that skip the on-disk unwind.
apple-juice:
a Swift CLI for managing battery charging on a Mac, distributed via Homebrew.
Signal-K-Plugins:
Signal K plugins for off-grid electrical systems, including smart AC grid control
for a Victron inverter/charger.
RustBuilt dipper's agreement lifecycle and chain listener; rebuilt the proposal trust model in indexer-rs.PythonThe indexer selection service and the rewards eligibility oracle, both running in production.GoA load balancer fronting my own EVM node fleet, routing roughly 35 million RPC requests a day. Private repo; demo on request.TypeScriptParallel on-chain acceptance and 3 payment-loss fixes in the indexer agent.SQLSchema design, migrations and analytical queries across dipper and the daily selection pipeline.PostgreSQLAsync persistence and schema migrations in dipper; agreement storage in indexer-rs.GraphQLCreated the indexing payments subgraph, serving on-chain events from 1 endpoint.DockerEverything I self-host runs in it, and the local-network stack I used for end-to-end payment testing.Kafkadipper streams agreement lifecycle events to it.RedpandaThe selection pipeline replays about 1.7 billion gateway query records from it every day.AnsibleMy Proxmox and KVM hosts are configured entirely through it.KubernetesThe selection service, its daily measurement job, and the rewards oracle all run on it in production.ProxmoxThe hypervisor under my home fleet of chain nodes and services.SolidityAddressed 13 OpenZeppelin audit findings on The Graph's Horizon contracts; scoped the cross-chain delegation contracts.EthereumI run an archive node, moved DIPs to on-chain escrow payments, and deployed GRT on Base.AssemblyScriptThe mappings in the indexing payments subgraph.gRPCdipper's services and indexer-rs's proposal handling speak it to each other.ZFSThe storage under my fleet, with automated snapshot policies.scikit-learnThe latency regression in the selection service: encoding, scaling and a linear model fitted daily.Chainlink CCIPWorked with Chainlink's team on GRT's cross-chain launch and built the bridge capacity monitoring for it.AvalancheBuilt an ERC20 token launch at the 2024 Avalanche hackathon; an Avalanche node also runs in my home fleet.Swiftapple-juice, a Mac battery management CLI shipped via Homebrew.
03
Get in touch
Something I could help with? I'd like to hear about it.