Commercial

Client Engagement

I managed client relationships and technical delivery across multiple engagements.

See its threads in the world

Used on

Stories where it mattered

2023 · Omnichannel agent inbox

Taking a component out of the stack instead of adding one

Situation
A messaging product ran Keycloak for identity, yet users, roles and organisations already lived in Dgraph, so every write landed twice.
Task
Remove the dual write and its compensating code, and get to one store of record.
Action
I checked which Keycloak features were used, found none beyond authentication, which NestJS covers, and wrote a decision record proposing its removal.
Result
The dependency and its rollback logic came out, leaving the backend with a single store of record.
View in the world
2024 · Kray.AI search and document assistant

One model for everyone, or one per customer

Situation
A document assistant for a fleet operator needed an architecture, and one model trained on every vessel's documents was the assumed default.
Task
Lay out the real trade-offs of cost, latency and access control instead of just picking one.
Action
I wrote both options out for client and team: one shared model versus one model per vessel, with pros, cons and the replica arithmetic.
Result
The partitioned design went forward, with the loss of cross-fleet questions accepted openly.
View in the world
2026 · TalkingDB document question-answering

Credentials in git history, and rotating keys was not enough

Situation
Reviewing repositories before a host move, I found OAuth client secrets in git history, which ships to anyone who clones.
Task
Make the secrets unreachable, not merely invalid, before the repositories were pushed to their new home.
Action
I cloned bare mirrors, mapped each leaked value to a placeholder, rewrote history with filter-repo, pushed to the new remotes, and documented the exact procedure.
Result
The repositories moved with secrets removed from every commit, and another file with hardcoded credentials was flagged for cleanup.
View in the world
2026 · TalkingDB document question-answering

Holding back an accuracy number that would have looked great

Situation
A large reported jump in search accuracy was circulating and was about to become a go-to-market claim.
Task
Check whether the gain was real, since repeated passing results seemed to be counted again across runs.
Action
I raised it plainly, then set a general standard: proposed improvements need a frequency table of failing cases and expected fix share.
Result
The inflated figure never reached a customer-facing claim, and benchmark results are now reviewed against a sheet before approval.
View in the world
2026 · TalkingDB document question-answering

Being asked to pull a date forward, and naming the real constraint

Situation
Leadership wanted a cross-product integration delivered sooner because it strengthened the story with channel partners, which I agreed with.
Task
Show that the date was set by available engineering time, not technical complexity.
Action
I agreed with the goal, offered to make time visible through tracked tasks, and named three ways to buy time: delegation, clear ownership, hiring.
Result
The conversation moved from when it can be done to which trade-offs we accept, with the task breakdown as shared evidence.
View in the world
2026 · TalkingDB document question-answering

A port that turned out not to be a port

Situation
Search training was to be ported from an older e-commerce AI codebase, and the files looked like a simple lift and shift.
Task
Scope the port properly before committing a sequence of stories others would plan around.
Action
I read the code itself: the crawler was tied to one storefront, so I called for a fresh generic crawl-and-chunk pipeline and resequenced.
Result
The order of work changed without changing the plan, and client-specific code stayed out of the generic package.
View in the world

Goes with

Throw me a paper plane

Write a line; I’ll find it in my inbox.