I joined an early stage startup as the first person on the team besides the two founders. The mandate was direct: build real products, with real data, fast. A few weeks later, the systems I worked on are live. This is the engineering write up, including the failures that taught me the most.
The through line is one idea: trustworthy data about workers. Understanding why they leave, and recording that they showed up.
Turning a static dashboard into a live trust score
The first product is a dashboard that runs and analyses worker exit interviews, powered by an AI voice agent.
When I started, most of the dashboard was a facade. Eleven of the twelve cards were hardcoded. So the real work was making them true. I built the Trust Score on an actual formula: four sub scores for Employer, Contractor, Location, and Regulatory signals, each computed from Firestore data. I added sanity guards so test and junk records could not skew the result.
The Trust Score, now computed from real Firestore data across Employer, Contractor, Location, and Regulatory signals.
A score is only useful if people trust it, so I made it explainable. Cards that break down how the score was reached, an insight panel that surfaces the single biggest challenge based on the lowest sub score, and a next job signal on the worker view. I also added a filter to the interview workflow and fixed a rendering mismatch where twelve cards were defined but only ten showed.
Making an AI voice interview feel instant
The interview itself runs over a phone call. Instead of HR calling every departing worker, a voice agent calls them in their own language and holds a natural conversation.
I led the technical integration with the voice platform on my own. To pin down the exact request format, I ran a spike that pointed the platform at httpbin so I could read the raw payload it was sending. That is how I found the cause of a failing POST and got it fixed on the vendor side.
The interview needs to react to what the worker says, so I built a separate endpoint server that sits between the platform and the model.
Latency was the hardest part. What moved the needle:
- Have the model emit the spoken text first and the bookkeeping JSON last, so speech starts before the housekeeping is done.
- Move the server to a Mumbai region and pre warm it before every call.
- Keep every response under twenty words.
I also spent real time on conversation quality. I fixed how PF and ESIC are pronounced, spelling them letter by letter in all four languages, removed gossip style probing, and replaced abrupt hang ups with warm, language specific closings. One debugging lesson worth keeping: a 401 that looked like an auth bug was actually environment variables not taking effect until a fresh deploy.
A kiosk that records attendance by face
The second product is Inverix Attend. A tablet at the gate, and daily check in by face. It is multilingual, works offline, and is privacy first.
A few parts were interesting to build.
On device face recognition. Each face becomes a 128 number descriptor. Enrollment stores it, check in compares the live numbers against it, and nothing leaves the device except the match.
Privacy first by design. At enrollment we only ever keep a name, a photo, and a masked reference. No sensitive identity number is stored.
A Firestore constraint I learned the hard way. Firestore rejects nested arrays. My face templates were a list of number arrays, so the write threw a 400 that reached the browser as an empty 500. I now serialize the templates to a string and rebuild them on read.
Offline that actually works. Templates are cached, punches queue locally, and everything syncs when the connection returns.
The part I am most happy with: getting reliable recognition working entirely in the browser, so a worker's face never leaves the device, and the whole thing still holds up when the network drops.
Engineering takeaways
I moved fast by pairing with AI tools, and I want to be honest about that rather than hide it. But the judgment was mine. Reading the real 400 instead of trusting the vague 500. Deciding how the Trust Score should be computed. Running the vendor call. Choosing what to cut. That is where the actual engineering was, and it is the part that stuck.
The systems are live. On to the next one.


Top comments (0)