Skip to content

Forward Deployed Engineer · Bengaluru, India

I put AI companions inside mobile apps — and keep them fast.

Forward Deployed Engineer at Vel Labs. I embed where the hardest problems are and own them end to end — on Sola, that's the Kotlin Multiplatform app, the real-time Unity companion inside it, and the tooling that keeps it fast and stable in production.

WAKING COMPANION

0%

  1. 3D engine
  2. companion.glb
  3. first frame
Hi! I'm Madhur's companion. Tap me, or try a move below.
~25%
faster cold start, on average
3.5 s
Unity freeze removed on low-end phones
22
production crashes, ANRs and hangs closed
  • 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.

984
contributions, last 12 months
172
active days
8
longest streak (days)
50
busiest day

984 contributions in the last 12 months across 172 active days; longest streak 8 days.

Hover or tap a day.lessmore

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.

companion.scene · WebGL● 0 fps · 0.0 ms · cap 120

WAKING COMPANION

0%

  1. 3D engine
  2. companion.glb
  3. first frame

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.

34°C · nominal
120
fps cap
60
fps cap
30
fps cap
Measured: 0 fps

DEMO · BRIDGE LOG

native ⇄ unity · contract v2.7

Waiting for the handshake…

→ native to Unity← Unity to native

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.

process
Oct 24
Jan 25
Apr 25
Jul 25
Oct 25
Jan 26
Apr 26
Jul 26
Oct 26
Jan 27
Vel Labs
Feb 2026 – Present
Brick and Bolt
Nov 2024 – Jan 2026
Projects
2026
playhead follows your scroll → now11 slices · 3 tracks
3D · Vel Labs · Jul 26 → Nov 26

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.
Unity as a LibraryC#URPSentry
21 → 29 fps
first call on low-end phones, 3.5 s freeze removed

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.

Beforestarting… · 0 u
main
Application.onCreate
SDK init ×4
DI graph
Activity + Compose
first frame
Afterstarting… · 0 u
main
Application.onCreate
Activity + Compose
DI (lazy)
first frame
bg-worker
SDK init (deferred)
warm caches
…time to fully drawn, on average across devices. Shapes are illustrative; the 25% is the real result.

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.

10
screens moved to Compose
8
dialogs rebuilt
34k
lines of dead code removed
~35
PvotLib components
  • Unknown-caller screening
  • Missed-call reminders
  • Favorites home-screen widget
  • Glass surfaces with battery-saver fallback
  • WCAG 4.5:1 text contrast on glass
View on GitHub ↗Kotlin · Jetpack Compose · Dagger/KSP · Roborazzi

DEMO · PVOTLIB GLASS SURFACE

Recents
AAaravMobile · 2 min ago
DDiyaMissed · remind at 6 PM
KKabirOutgoing · 4:12
Wallpaper
70%

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.

54 + 12
Android and iOS KPIs
6
user journeys
48.8%
more Baseline Profile coverage
$ rocket report --journey
KPIs for the cold start journey against baseline
KPIbaselinecurrentΔgate
Time to initial display828 ms620 ms-25%PASS
Main-thread blocking484 ms190 ms-61%PASS
Baseline Profile rules28,49442,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

Forward Deployed Engineer at Vel Labs

End-to-end ownership across Kotlin Multiplatform, Unity as a Library and production performance, with Android work before that at Brick and Bolt. Read it in the browser, or grab the PDF.

  • KMP
  • Compose Multiplatform
  • Unity
  • Macrobenchmark
  • Perfetto
  • Sentry
Open →

07 CONTACT

Say hi.

Building something with mobile, 3D or a performance problem nobody can explain? Let's talk.