At Dice.tech I own the Android platform: ~964k lines, 772k of them Kotlin, serving 50,000+ MAU and 22,000+ DAU.
Portfolio (also served at siddharth-pandalai.vercel.app) · Interactive CV · Hire me · LinkedIn
80% crash reduction · GPS 50% to 95% · ~87% of the UI layer on Compose · AES-256 Keystore, SSL pinning across 9 domains, VAPT cleared
Everything below is drawn by a generator from a real source, and every generator has a deadline. If one dies, a job opens itself an issue and the badge goes red. The three panels after this one are that machinery, in public.
Live status board · 11 jobs and datasets tracked, each against its own deadline
This profile has been red three times, and each time the tests stayed green. That is why the board grades against a deadline rather than a pass or fail, and why it is published rather than kept in a dashboard only I look at.
A separate board tracks cv-siddharth's own generated datasets against their SLA: /ops. The two are not merged; this board watches the account, that one watches the portfolio repo.
Incident ledger · 7 recorded, 0 open, mean time to fix 1.1 days, worst 8
Including the eight days a daily job was red because a dash sweep silently killed a regex, and the day this profile was caught reporting nine of its own merged pull requests when the real figure was twenty four. Publishing the mean time to fix is the only part of a status page that costs anything to be honest about.
At Jugnoo I built the per-tenant flavour system, one build config and one set of resource overlays, that let a client app ship without forking the codebase. The interesting number is not the total, it is the shape: apps launched under that system are still being updated years later. See the fleet, checked against the Play Store and Internet Archive crawls rather than memory.
Nothing became a library until a second consumer needed the same logic.
- kmp-toolkit: 40 modules. Typed
Result, an MVI core, an offline-first store, network, security, on-device AI behind one seam, a 19-provider payment abstraction. MIT. - kmp-build-logic: 17 authored convention plugins, vendored by
includeBuildacross five repos, so a version bump happens once. - kmp-app-template: the app shape the toolkit slots into, buildable on day one.
Dependency graph · 40 modules, 55 internal edges, layered by computed depth
Parsed from settings.gradle.kts and each module's build file. The columns are
dependency depth computed from the edges, so the layering is a measurement of
the architecture rather than a drawing of it.
Writing provenance · 17 lessons, ten of them out of a single project
"Engineer who writes" is a claim anyone can make. The edge is the interesting part: ten of these came out of Doori alone. That is not a blog, it is one project that produced ten things worth writing down.
One platform, seen at different layers. Depth is behind the links.
| Lane | The proof | The number |
|---|---|---|
| Android at scale | Dice platform: GPS pipeline, Compose migration, crash and concurrency work, security hardening | 50k MAU, 80% fewer crashes |
| Platform ownership | Jugnoo's white-label estate and the automation that shipped it | 173 apps on Play, 80% less delivery time |
| Libraries and build | kmp-toolkit, kmp-build-logic, kmp-app-template | 40 modules, 17 plugins |
| Tooling | The generators that draw this page, and the guards that fail when their data ages | every figure machine-checked |
| Writing and games | The Loopdown, Gaddi | one war story, four platforms |
Everything else I maintain · eight repositories, one line each
| Repo | What it is | Its number |
|---|---|---|
| Doori | Mileage and trip tracking, offline-first, Ktor backend | 46 modules, 5 platforms |
| PaymentsLab-KMP | Every payment gateway behind one abstraction, each transaction's lifecycle visible | 40 modules |
| Gaddi | Bluffing card game, ISMCTS and LLM opponents on a byte-for-byte deterministic engine | Android, iOS, Desktop, Web |
| cv-siddharth | This portfolio: React 19, multi-provider LLM chat, and the generator farm behind every number | test count gated, not hand-typed |
| cv-siddharth-kmp | The same portfolio in one Kotlin commonMain, rendering to Wasm, Desktop, Android, iOS |
near dependency-free |
| Candidai (case study) | Local-first AI career-intelligence dashboard: resume onboarding, reverse-ATS discovery (87 providers), evidence-based fit scoring. Built on the open-source career-ops engine. Private while v1 lands | case study is public |
| The Loopdown | One war story from a real project, adapted to four platforms, with a linter that strips AI tells | 4 channels |
| SINC-P | Statutory student grievance redressal, UGC 2023 compliant, with an SLA clock | compliance-cited |
24 merged PRs to career-ops (⭐70k+): two new ATS providers (BambooHR, Breezy HR), a dashboard status-cell fix and an agent-inbox feature.
Most of the rest are correctness fixes, each with a reproduction and a regression test, and each the same class of bug: code that reports success while doing the wrong thing. Non-Latin company names collapsing into one and deleting a tracked application. $-patterns in CV text splicing the template into the resume at exit 0. A date filter silently ignored in its --flag=value form.
Stack: Kotlin · Jetpack Compose · Compose Multiplatform · Coroutines and Flow · Koin and Hilt · Room and DataStore · Ktor · WorkManager · Gradle convention plugins Architecture: MVVM and Clean Architecture · MVI unidirectional state · offline-first · multi-module




