2025
Video conferencing platform, Techgentsia
- JavaScript
- Vue 3
- Nuxt
- MediaDevices API
Reusable media device selection library
Camera and microphone pickers had been rewritten by hand in every surface of the product: the web client, the admin console, the Electron desktop app and the pre-call test page. Each one handled permissions, device labels and hot-plug slightly differently, so a bug fixed in one place stayed broken in three others.
- Pulled device enumeration, permission state and selection persistence out of the UI layer and into one framework-agnostic module.
- Handled the case most implementations miss: device labels are empty strings until permission is granted, so enumeration has to be re-run after the first getUserMedia call.
- Subscribed to the devicechange event so plugging in a headset mid-call updates the list and the active track without a page reload.
- Persisted the chosen deviceId and fell back cleanly when that device disappears between sessions, instead of throwing OverconstrainedError at the user.
Result
One implementation behind a small API, adopted across every surface. Feature work that touched device handling dropped by roughly 60%, and a fix now lands everywhere at once.
Trade-off
It is deliberately not a UI component. Each product surface still owns its own markup, which was the right call for white-labelling but means the library cannot enforce consistent UX on its own.
2023 - 2024
Video conferencing platform, Techgentsia
- WebRTC
- WebSocket
- Video.js
- Vue 3
Real-time co-watch inside live conferencing
Participants in a live call needed to watch the same video together, covering both hosted platforms (YouTube, Vimeo, Dailymotion) and a local file on one participant's machine.
- Split the problem in two, because the two cases are not the same problem. For hosted platforms nothing needs to be streamed: every participant already has the source.
- Hosted video is pure state sync. A shared link plus WebSocket events for play, pause, seek and volume, with the host as the source of truth. No media flows peer to peer at all.
- Local video is a media problem. captureStream() on the video element produces a MediaStream, which is fed into a separate content peer connection alongside the existing camera track.
- Keeping content on its own peer connection means video quality degradation never competes with the participants' camera and audio tracks.
Result
Both paths shipped behind one feature toggle. The hosted path costs effectively no bandwidth, which mattered because most sessions used it.
Trade-off
Signalling was hand-rolled over WebSocket for SDP offer and answer, on a mesh topology with a third-party TURN service. Mesh is simple and was fine at our participant counts, but it does not scale to large rooms. An SFU would be the correct next step.
2022 - 2023
Healthcare platform, Techgentsia
Canvas zone calibration for fall detection
An ML model detected people and actions in a room camera feed, but it had no idea what the room meant. Someone lying down is normal in a bed and an emergency on the floor. Nurses, not engineers, had to be the ones to draw that distinction, per room, on site.
- Built a calibration tool on top of a still frame from the camera, where a non-technical user draws polygon zones and labels them bed, chair or floor.
- Used Fabric.js for the interaction layer: draggable vertices, live area feedback, snapping, and undo on a stack of canvas states.
- Exported normalised zone coordinates as JSON so the geometry stays correct regardless of the resolution the model runs at.
- Combined zone plus detected action into the alert rule, so the same detection produces different severity depending on where it happened.
Result
Room setup moved from an engineering task to something ward staff do themselves in a couple of minutes, and false alarms dropped once zones reflected the real room layout.
2022 - 2023
Techgentsia
- Vue 3
- Vuetify
- Chart.js
- Performance
Analytics dashboard, 20 seconds to 3
The dashboard took around 20 seconds to become usable on the largest customer datasets. Every chart rendered every raw point, and the whole page waited on the slowest query before showing anything.
- Profiled first. The bottleneck was not the network, it was Chart.js drawing tens of thousands of points into canvases only a few hundred pixels wide.
- Applied decimation so the number of points drawn is bounded by the pixel width of the chart, not by the size of the dataset. Visually identical, dramatically cheaper.
- Turned off entry animation on large series. Animating thirty thousand points is pure cost with no information gained.
- Stopped blocking the page on the slowest widget: each chart resolves and paints independently rather than waiting on a single combined request.
Result
Initial load dropped from roughly 20 seconds to 3, with chart rendering itself around 30% faster. On a later dashboard the same approach took data load from 3s to 0.8s.
Trade-off
Decimation means the rendered line is an approximation. That is correct for trend charts and wrong for anything where a single outlier point is the signal, so those charts kept full fidelity.
2021 - 2023
Video conferencing platform, Techgentsia
- Electron.js
- Node.js
- Vue
- CI builds
White-labelled cross-platform desktop client
Enterprise customers wanted the conferencing client as an installable desktop app under their own brand, on both Windows and macOS. Maintaining a hand-built fork per customer was not going to survive more than two or three of them.
- Kept a single codebase and moved everything customer-specific into build-time configuration: branding, icons, app identifiers, update endpoints.
- Automated packaging so a new tenant is a config entry and a build, not a branch.
- Used the desktop layer for what the browser could not do at the time, notably screen source selection and OS-level window handling.
Result
Multiple branded desktop clients shipping from one codebase, adopted by enterprise customers on both platforms.
2025 - now
Own product, solo
- React Native
- Expo
- Node.js
- Web Push
Business Tracker, a B2B queue and profit app
Small shops in India run customer queues on paper and track profit in their heads. I am building a mobile app for token-based queuing and daily profit tracking, and selling it to non-technical shop owners.
- Customers were notified over WhatsApp. Four messages per token, at roughly ₹0.15 each, against shops serving 100 to 500 customers a day. The cost was survivable; the dependency was not.
- The real risk was never the per-message price. It was that a single Meta policy change could take the product offline overnight, and I would have no way to reach a single customer.
- Constraints made the usual answers unavailable: nothing can be installed on the customer's phone, and not every customer has a smartphone.
- Current direction is to move the customer off messaging entirely, onto a shareable status link backed by web push, with an installable PWA as the primary channel and plain web as the fallback.
- Wrote a phased resilience plan first: early warning, a permanent web QR entry point, a notification outbox, degraded mode, then SMS and spare numbers as the last resort.
Result
A working product built end to end on my own, and the first architecture decision I have had to make where the deciding factor was platform risk rather than anything technical.
Trade-off
Shop owners compare the product to the WhatsApp messages they get from Bajaj Finance and PhonePe, so reducing WhatsApp usage is a real sales objection. Solving the engineering risk creates a positioning problem I still have to answer.