Systems engineering
Rust, C and C++; Linux/Unix internals; IPC; networking; performance and concurrency.
What this includes
- Low-level developmentSystems components and libraries in Rust, C, and C++.
- Linux & Unix internalsProcesses, filesystems, services, permissions, and operating-system interfaces.
- IPC & networkingLocal and distributed communication, protocol design, and integration.
- Performance & concurrencyProfiling, contention analysis, memory behaviour, and concurrent design.
Embedded & hardware integration
Linux-connected devices, hardware interfaces, protocols, IoT, firmware, and the awkward boundaries between hardware, software, and firmware.
What this includes
- Linux-connected devicesHost software, device services, provisioning, and reliable deployment.
- Hardware interfacesUSB, serial, GPIO, buses, and custom device communication.
- Firmware integrationDefining and debugging the contract between firmware and host software.
- Protocols & IoTDevice protocols, networked hardware, telemetry, and control systems.
Open-source development
Feature development, maintenance, architectural work, upstreaming, build/release infrastructure, and getting neglected-but-important software back into shape.
What this includes
- Feature developmentDesigning, implementing, testing, and documenting new capabilities.
- MaintenanceTriaging issues, reducing technical debt, and restoring neglected projects.
- UpstreamingPreparing focused contributions and working effectively with maintainers.
- Build & release infrastructurePortable builds, continuous integration, packaging, and dependable releases.
Architecture & modernisation
Helping with the “this thing has existed for twelve years and nobody is quite sure how to change it safely” class of problem.
What this includes
- System archaeologyReconstructing intent, dependencies, and undocumented constraints.
- Architecture reviewFinding boundaries, risks, bottlenecks, and practical opportunities for change.
- Migration planningBreaking risky rewrites into staged, testable improvements.
- Technical debt reductionMaking old systems easier to understand, operate, and extend.
Debugging & investigation
The horrible bugs. Especially the horrible bugs. Race conditions, integration failures, performance problems, and other things where the obvious answer has already failed.
What this includes
- Race conditionsIntermittent failures, deadlocks, timing problems, and concurrency hazards.
- Integration failuresProblems spanning processes, platforms, devices, APIs, and ownership boundaries.
- Performance problemsMeasurement-led investigation of latency, throughput, CPU, and memory use.
- Root-cause analysisReproducers, instrumentation, evidence, and a clear explanation of what failed.
Reverse engineering
I reverse engineer undocumented software and device interfaces,
turning opaque systems into something understandable, documentable,
and usable.
What this includes
- USB devices & proprietary protocolsCapturing, decoding, and documenting device communication and behaviour.
- Protocol & file-format analysisUnderstanding undocumented network protocols, data formats, and APIs.
- Binary & software analysisInvestigating undocumented or legacy software to determine how it actually works.
- Compatible implementationsBuilding replacement clients, libraries, integrations, and interoperability layers.
- Tooling & documentationProducing practical tools and clear documentation from the results.
- Behavioural analysisTesting black-box systems and mapping edge cases when source code is unavailable.