AUG 2025
— PRESENT
Impact Analytics
Senior Software Engineer · Backend
Rust on the backend for retail ERP — collaborative design tooling, and allocation across the supply chain.
VLP — real-time collaborative moodboard
RUST · AXUM · CRDT
- Wrote the real-time layer for a collaborative moodboard, where merchandising teams at retail companies build and edit style boards together.
- Built the CRDT sync engine. Clients exchange state vectors, so someone coming back after an hour offline pulls the handful of ops they missed instead of refetching the whole board.
- Each board runs as its own Tokio task that owns its state outright. Edits arrive over a channel, so there is no shared lock in the hot path and no mutex to get wrong.
- Rooms live in a DashMap with a supervisor that drops idle ones. Memory stays flat instead of climbing with every session the process has ever held.
- Split the WebSocket protocol in two: JSON for control frames, binary for CRDT payloads, with a version byte so older clients survive a deploy.
- Capped the send buffer per connection, so one slow client stalls itself rather than the whole room.
Source Smart — ERP allocation platform
PUB/SUB · REDIS
- Rust services for an ERP allocation platform, working out how inventory is distributed across vendors and facilities under capacity limits.
- Allocation runs as staged Pub/Sub events instead of one long request. A run can take minutes, so this way it survives a deploy and each stage retries on its own.
- Solver jobs go to Gurobi through Cloud Functions behind weighted semaphores, capping how many run at once so one large tenant cannot starve the queue.
- Modelled the vendor, facility and capacity schemas in Postgres with sqlx.
- Added Redis caching on the hot reads, with TTLs and keys narrow enough that a write only clears what it actually touched.
- Feed generation streams through Arrow and Polars, so memory tracks batch size rather than the size of the export.
JUL 2022
— AUG 2025
Tata Consultancy Services
Software Engineer · Rust Backend
Backend work inside a large European bank's core platform, where the correctness bar is set by regulators rather than by us.
Core banking services
RUST · AXUM · TOKIO
- Backend internals for a large European bank: onboarding, account management and transaction processing, on Axum and Tokio.
- Moved JWT verification and role checks into Axum middleware on the router, wired to the internal OAuth2/IAM. Handlers stopped carrying their own auth code, and new endpoints got it by default.
- Kept the domain layer free of transport and database types, so a change to infrastructure could not quietly reach into business logic.
- Handled API versioning and schema evolution, which is what let the services ship on their own schedules without breaking consumers.
- Wrote CLI tools and batch jobs for XML, CSV and Avro ingest, plus load-testing harnesses that caught throughput regressions before release.
NOV 2020
— JUN 2022
Tata Consultancy Services
Data Engineer
Warehouse migration and pipeline work across Credit Risk and Credit Ratings portfolios.
Teradata → Snowflake migration
PYTHON · SNOWFLAKE
- Led the Teradata to Snowflake migration: 12k stored procedures, 30k views, 20k tables.
- Built Python tooling that resolved the dependency graph and validated DDL, which is how we knew what order to cut over in at that size.
- Moved ingestion onto Snowpipe, Streams and Tasks. End-to-end latency dropped by over 80% and the batch windows went away.
- Automated RBAC and lineage analysis in Python and SQL across the Credit Risk and Credit Ratings portfolios.
- General data engineering either side of that — Python, Snowflake, Teradata, SQL — on modelling, ETL validation and schema normalisation.
CONCURRENCY & STATE
Real-time collaboration, mostly. CRDTs so several people can edit the same thing without anyone being asked to resolve a conflict, and giving each piece of state a single owner so there is nothing to lock.
CRDTsactor modelTokiolock-freeWebSockets
DISTRIBUTED SYSTEMS
Treating an append-only log as the record of what happened and rebuilding read models from it. Versioned contracts between services, so they can be deployed one at a time.
gRPCevent-drivenmessage queuesPub/SubNATSDDD
DATA & STORAGE
Designing the schema before writing the code, choosing indexes off the query plan rather than by guess, and keeping cache keys narrow enough that invalidation stays exact.
PostgreSQLRedissqlxSnowflakeTeradataETL
LANGUAGES
Rust for anything that has to hold state correctly while several things touch it at once. Go and Python where the work is throughput or data. SQL written by hand.
RustGoPythonTypeScriptSQL
CLOUD & DELIVERY
Keeping infrastructure in version control and building images in CI, so a deploy pulls a tagged image instead of copying files onto a box and hoping.
AWSGCPDockerKubernetesTerraformCI/CD
SECURITY
Threat modelling at the trust boundary, with enough reverse engineering and OS internals behind it to have a real sense of what is reachable.
web securitycryptographyreverse engineeringbinary exploitationOS internals