Mobile Developer · Bengaluru, India
I put AI companions inside mobile apps — and keep them fast.
Mobile developer at Vel Labs, building Sola — an AI companion on one Kotlin Multiplatform codebase, with a real-time 3D character from Unity running inside the native app.
- Kotlin Multiplatform
- Compose Multiplatform
- Unity as a Library
- Jetpack Compose
- Decompose
- Koin
- Ktor
- Macrobenchmark
- Baseline Profiles
- Perfetto
- Sentry
- WebRTC
- Ably
- Swift
- C#
01 CONSISTENCY
Shipping is a habit, not a sprint.
My GitHub contributions over the last twelve months, across work and open source.
983 contributions in the last 12 months across 172 active days; longest streak 8 days.
02 COMPANION LAB
At work I embed a 3D companion in a native app. Here's a small one.
Sola's companion runs in Unity, embedded in Android and iOS through Unity as a Library. This robot runs in WebGL, but follows the same ideas: an animation state machine, speech-driven expressions, a thermal-aware frame rate, and a typed message bridge between the host and the 3D runtime.
DEMO · THERMAL THROTTLE
Heat up the phone
On device, the app reads the thermal state and tells Unity to drop its frame rate before the OS throttles it harder.
DEMO · BRIDGE LOG
native ⇄ unity · contract v2.7Waiting for the handshake…
03 TRACE
My career, read like a Perfetto trace.
Each track is a company; each slice is a problem I owned. Filter by type, click a slice for the details.
3D Unity companion
Owned embedding a real-time 3D companion with Unity as a Library on Android and iOS.
- Built the shared KMP bridge module and a versioned message contract with a handshake.
- Thermal-aware frame rate: adaptive 30/60/120 fps, stepping down when the device heats up.
- Async bootstrap, shader pre-warming and URP stripping; Sentry boot and frame telemetry.
- Packaged iOS as a prebuilt XCFramework.
DEMO · COLD START RACE
Get work off the main thread
Same app, two startups. Deferring SDK init to a worker and making the DI graph lazy lets the first frame land sooner.
DEMO · FRAME TIMELINE
Every bar is a frame
Anything over the 16.6 ms line misses a 60 Hz deadline and shows up as stutter.
- Janky frames
- 18.8%
- p95 frame time
- 50.0 ms
- What changed
- Blur + per-frame allocations
04 OPEN SOURCE
Giving an AOSP dialer a Compose makeover.
Pvot Phone runs on PvotLib, the project's Compose design system — I contribute to both.
OPEN SOURCE · PVOT-OSS
Pvot Phone & PvotLib
An open-source Android dialer, forked from AOSP, that I'm moving to Kotlin and Jetpack Compose on PvotLib — the project's Compose design system.
- Unknown-caller screening
- Missed-call reminders
- Favorites home-screen widget
- Glass surfaces with battery-saver fallback
- WCAG 4.5:1 text contrast on glass
DEMO · PVOTLIB GLASS SURFACE
05 ROCKET
If it isn't measured, it didn't ship.
Pick a journey to see how Rocket gates KPIs against a baseline.
TOOL · VEL LABS (INTERNAL)
Rocket
A mobile performance toolkit I built. It installs a build on a real Android or iOS device, drives a user journey, records a Perfetto or xctrace trace, and diffs every KPI against a committed baseline. One YAML flow drives both benchmarks and QA runs.
| KPI | vs budget | baseline | current | Δ | gate |
|---|---|---|---|---|---|
| Time to initial display | 828 ms | 620 ms | -25% | PASS | |
| Main-thread blocking | 484 ms | 190 ms | -61% | PASS | |
| Baseline Profile rules | 28,494 | 42,412 | +49% | PASS |
Values shaped like a real report, for illustration.
06 RESUME
The one-pager.
Everything above, on a single ATS-friendly page.
RESUME · ONE PAGE · UPDATED NOV 2026
Mobile Developer at Vel Labs
Kotlin Multiplatform, Unity as a Library, performance engineering, and Android work before that at Brick and Bolt. Read it in the browser, or grab the PDF.
- KMP
- Compose Multiplatform
- Unity
- Macrobenchmark
- Perfetto
- Sentry
07 CONTACT
Say hi.
Building something with mobile, 3D or a performance problem nobody can explain? Let's talk.