About
Currently Rebuilding device provisioning onto a new Kotlin and Spanner platform, and carrying the legacy VoIP and account domains across to it.
I build the systems behind cloud communications software — provisioning, VoIP account management and billing for a UK platform serving over 200,000 users.
I started in technical support, moved into mobile development building the company's native iOS and Android clients, and now work primarily on backend services. Having dealt with customer problems directly and then built the interfaces those customers use, I have a broad view of the domain — and it shapes design decisions as much as the technical reasoning does.
Outside work I'm usually running — Strava if you're curious.
Experience
System Developer · Nebula
Dec 2023 — Present- One of five engineers building a greenfield Kotlin microservices platform to replace a decade-old Java monolith — Spring Boot, gRPC, Protobuf and Cloud Spanner on GCP. Second in seniority on the project, owning the provisioning, VoIP and account domains.
- Schema and data ownership across both generations of the platform: designing entities and migrations for the new system, consolidating overlapping legacy models, and keeping the two consistent while they run side by side.
- Feature delivery end to end across the product range — customer portals, partner ordering, billing and provisioning — usually taking a requirement from specification through to release rather than building to someone else's design.
- Maintain the internal systems the company runs on, including the operations portal used daily by support, sales and provisioning staff.
- Act as effective third line for production issues — the escalation point when support and the wider development team cannot resolve something, diagnosing live against real customer impact.
- Platform-wide engineering work: OpenTelemetry tracing across every service and the gateway, static analysis and formatting standards, API documentation, and rebuilt test suites.
Mobile Developer · Nebula
Dec 2022 — Dec 2023- Principal developer on the native iOS softphone in Swift, and its Android counterpart in Kotlin from late 2023 — maintained both alongside backend work until they were succeeded by a React Native rewrite in 2025.
- Built WebRTC video conferencing: in-call UI, waiting rooms, host admin controls, participant management and inbound conference joining.
- Delivered team chat with user tagging, markdown rendering, pinning, read state and SMS conversations — plus voicemail notifications, BLF presence indicators, call history and contact management.
- Shipped a single codebase as two separately branded white-label applications.
Technical Support Engineer · Nebula
Jun 2021 — Dec 2022- Second-line support for the same communications platform I now build — diagnosing call quality, routing and provisioning issues across partner deployments.
Selected Work
Provisioning platform migration
2026- Provisioning is what configures a desk phone the moment it is plugged in — line keys, directories, dial plans, busy-lamp indicators — with nobody touching the handset. I rebuilt it from the legacy monolith into the new Kotlin platform and shipped it through staged releases without interrupting live provisioning.
- Supports Grandstream, Yealink, Cisco, Polycom, Fanvil and Gigaset hardware, each with its own firmware quirks. One fix meant reformatting responses to one XML tag per line after tracing a failure to handsets using fixed-size line-read buffers that silently truncated anything longer.
- Built the dual-write framework keeping legacy and new data models consistent throughout the migration — the seam the wider platform transition depends on.
- I had maintained the Python provisioning server it replaced for two years, so the rebuild carried forward behaviour I already owned rather than reverse-engineering someone else's. Device check-in intervals are randomised so that thousands of handsets do not poll simultaneously after a restart.
Internal CRM and operations portal
2024 — Present- Principal maintainer of the Python/Flask portal the company runs on internally — where support, sales and provisioning staff manage customers, partners, orders, hardware and tickets. Most departments touch it daily, so changes land in front of colleagues immediately.
- Migrated customer ticketing from OSTicket to Zendesk and decommissioned the old system: canned responses, webhooks, group and form routing, tagging, submitter identity and multi-brand domain handling.
- Recent additions include renewals-at-risk and number reporting, partner and store management, Stripe Identity verification, knowledge-base publishing, bulk site moves and an internal staff directory.
Order and event processing
2024 — Present- The asynchronous backbone behind the platform: reseller and partner order processors, email subscribers, port verification handling, fraud alerting, and the record processor feeding call reporting.
- Spans both event-driven consumers on Pub/Sub and recurring scheduled work — including distributed locking so that a job fires once across every running instance rather than once per instance.
- Also covers number lifecycle — recycling deactivated numbers back into the available pool — and scheduled reconciliation against the payment and accounting systems.
White-label customer portal
2024 — Present- The self-service portal partners' own customers use, delivered entirely under the partner's branding rather than ours — the product promise the business sells on.
- Ordering flow and processors, porting provider selection, package management and cancellation, member and user administration, and fraud alerting. Python and Flask with a TypeScript front end.
Wholesale fibre partner integration
2025 — 2026- Bespoke ordering and provisioning API for a wholesale fibre partner, spanning four services: SKU handling, automatic service configuration, number migration on customer creation, and partner-specific outbound call restrictions.
- Emergency calls stay connectable regardless of those restrictions or any rate limiting applied to the account.
Emergency address consolidation
2025- UK operators must hold an accurate installation address for every number so that 999 calls reach the correct control room. Two overlapping address models had grown up in the database — number addresses and emergency addresses — leaving no single source of truth for a legally significant field.
- Consolidated onto one model and removed the legacy path entirely, reconciling four upstream carriers with differing address formats and validation rules, and adding validation at the point of entry rather than at submission.
Multi-carrier number porting
2024 — 2025- Porting moves a customer's existing number across from another provider. It is regulated, document-backed, and unforgiving — a failed port means a business loses its published phone number.
- Built Letter of Authority generation and status tracking, ownership document upload, bulk porting, carrier-specific request formats across four providers, and Ofcom Do-Not-Originate list handling, integrated with Salesforce for the commercial workflow.
Call reporting subsystem
2024- Built call reporting end to end: data model, record processor, and a scheduler that maintains next-run dates and triggers reports on recurring intervals.
- Queue and agent statistics derived from call detail records — summaries, dispositions, ring timeouts and unregistered-agent handling — released behind a feature toggle.
How I Work
- I have reviewed around 630 pull requests across the organisation. A meaningful part of my contribution sits in other people's branches rather than my own — catching problems early is cheaper than catching them in production.
- I support developers joining the team, having come through the graduate route here myself and remembering what was unclear.
- Getting work out of the door often means driving the conversation rather than the code. I coordinate across QA, Product, Support, Marketing and Development to get a release agreed, tested and actually shipped.
Technical
- Languages
- KotlinJavaPythonSwiftTypeScriptSQL
- JVM
- Spring BootSpring DatagRPCProtobufHibernate/JPACoroutinesOpenAPISpark Java
- Python
- FlaskSQLAlchemyFlask-LoginJinja
- Data
- Cloud SpannerPostgreSQLMySQLRedis
- Platform
- GCPPub/SubDockerUnleash
- Observability
- OpenTelemetryMicrometerSonarQube
- Testing
- JUnitMockKAssertJTestcontainers
- Mobile
- SwiftAndroidWebRTC
- Integrations
- StripeGoCardlessSalesforceZendeskXero
- Domain
- VoIP & SIPDevice provisioningNumber porting & lifecycleCarrier integrationEmergency call routingOfcom complianceSubscription billingCDR & call reporting