Skip to content
View chinmay-tayade's full-sized avatar
💭
I may be slow to respond.
💭
I may be slow to respond.

Block or report chinmay-tayade

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
chinmay-tayade/README.md
Chinmay Tayade — Mobile Engineer · Android · Kotlin · Jetpack Compose · Kotlin Multiplatform

LinkedIn  Email  Profile views



Positioning

Portfolio  Android Wiki  Résumé

 whoami

Mobile engineer building B2C fintech-grade Android apps — the kind where a dropped connection mid-transfer, a stolen unlocked phone, or a schema migration gone wrong are design inputs, not afterthoughts. Primary stack: Android · Kotlin · Jetpack Compose · Kotlin Multiplatform. IIIT Allahabad.

object Chinmay {
    val core       = listOf("Android", "Kotlin", "Jetpack Compose", "KMP")
    val breadth    = listOf("iOS / SwiftUI", "Flutter", "React Native")
    val domain     = listOf("digital banking", "payments", "ledgers", "KYC onboarding")
    val obsessions = listOf(
        "what NOT to share in KMP",
        "eventual consistency as a UX contract",
        "a test suite you actually trust",
    )
    val default    = "boring, well-understood tools — until the novel one earns its place"
}

 The signature problem: a transfer you don't fully control

The user taps Send with no signal. What does a serious banking client do? Not spin. Not lie. It persists the intent, shows the truth, and reconciles later.

The offline transfer state machine

stateDiagram-v2
    direction LR
    [*] --> PENDING: submit · local validation passes · opId assigned
    PENDING --> SYNCING: worker picks it up · network available
    SYNCING --> CONFIRMED: 2xx · server id returned
    SYNCING --> CONFLICT: 409 · needs resolution
    SYNCING --> FAILED: 4xx · terminal reason
    SYNCING --> PENDING: 5xx / IO · backoff + full jitter · attempts < ceiling
    SYNCING --> FAILED: attempts == ceiling
    CONFLICT --> PENDING: user re-applies
    CONFLICT --> FAILED: user cancels
    CONFIRMED --> [*]
    FAILED --> [*]
Loading
  • Idempotency key (opId, client-generated) persisted before any network attempt → a retried request the server already saw returns the original result.
  • Optimistic UI — the transfer appears instantly as PENDING, de-emphasised, with retry / cancel. The app never claims success it can't verify.
  • Backoff is exponential with full jitter and a ceiling — so every device that went offline in an outage doesn't stampede the server when it returns.
  • Conflict resolution is per operation type, not one global rule.

The engine lives in offline-sync-engine (9 tests, standalone); it gets wired into argent-android behind WorkManager.

 Kotlin Multiplatform: share the logic, keep the UI native

What I share vs. what I deliberately keep native

flowchart TD
    subgraph AND["📱 Android"]
        A1["Jetpack Compose<br/>Material 3 · Vico charts"]
        A2["ViewModel · collectAsState"]
    end
    subgraph IOS["🍎 iOS"]
        I1["SwiftUI<br/>Swift Charts"]
        I2["ObservableObject · SKIE · async/await"]
    end
    subgraph SHARED["🟣 shared — Kotlin Multiplatform"]
        S1["domain — portfolio math, validation, business rules"]
        S2["data — repositories, sync, DTO ↔ domain mappers"]
        S3["network — Ktor + serialization"]
        S4["persistence — SQLDelight"]
    end
    A2 --> S1
    I2 --> S1
    S1 --> S2 --> S3
    S2 --> S4
    A1 -. expect/actual .-> SEC["biometrics · secure storage"]
    I1 -. expect/actual .-> SEC
Loading

Shared: everything that's expensive to get wrong twice — domain logic, data, networking, persistence. One implementation, one test suite, run on JVM and Kotlin/Native. Native: all UI, navigation, charts, notifications, biometric prompts — the things users actually feel. The decision, module by module, is written up in SHARING.md.

Built in basis-kmp — shared domain + SHARING.md done, Android app runs, iOS framework links.

 Featured work

  Flagships

🏦  argent‑android  retail digital banking

Multi‑module Kotlin/Compose. Foundation shipped — convention plugins, a currency‑safe domain layer with tests, Hilt‑wired app, green CI. Next: the offline transfer state machine (offline‑sync‑engine behind WorkManager), biometric Keystore, cert pinning.

kotlin compose multi‑module offline‑first fintech

🧩  basis‑kmp  shared Kotlin core · Android + iOS

One financial core — valuation, cost basis, allocation — shared via Koin, with fully native Compose and SwiftUI UIs. Domain + tests done, Android app runs, iOS framework links. Ships SHARING.md: the module‑by‑module share‑vs‑native argument.

kmp compose swiftui koin ios

🧠  slate‑ai  on‑device + cloud notes assistant

A real RAG pipeline in pure Kotlin — sentence‑aware chunking, embeddings, cosine retrieval — and a routing policy that keeps short lookups on‑device and only escalates to the cloud when the task needs it. 12 tests, Compose app.

on‑device‑ai litert rag compose

🏗️  modulith  Android architecture template

Gradle convention plugins so a module build file is ~2 lines, plus a checkModuleGraph task that fails the build on module‑graph violations — verified catching a core → feature edge.

gradle convention‑plugins architecture ci

📡  argent‑track‑sdk  KMP analytics & attribution SDK

A self‑contained KMP SDK replacing CleverTap + AppsFlyer — durable event queue, push/in‑app campaigns, install attribution, and a client‑side PII denylist. Android + iOS from one codebase.

kmp analytics attribution sdk

📱  argent‑ios  native Swift · MVVM

SIP/investment, KYC, bank‑account & mandate flows with a generic token‑refreshing network layer. UIKit + SwiftUI.

swift mvvm fintech ios

  Fintech libraries & modules

📒  ledger‑core KMP library

Double‑entry ledger: balanced journal entries, idempotent postings, a currency‑safe Money. 12 tests, JVM + iOS.

kmp ledger double‑entry

💳  pay‑sheet Compose module

Card input with Luhn + brand detection, tokenization, a 3‑D‑Secure‑style step‑up state machine, PCI notes. 11 tests, sample app.

compose payments 3ds

🔄  offline‑sync‑engine library

Durable queue, exponential backoff + full jitter, pluggable per‑operation conflict strategies. 9 tests.

offline‑first workmanager

  Craft & infrastructure

🔐  mobile‑security‑notes lib + writeups

Keystore AES‑GCM, BiometricPrompt + CryptoObject, deny‑by‑shape redaction (8 tests), cert pinning. Threat model + docs.

keystore biometrics redaction

⚡  android‑perf‑lab perf infra

Baseline Profile + Macrobenchmark modules, pixel6Api34 managed device, a methodology where every number carries its device + iteration count.

baseline‑profiles macrobenchmark

🧪  compose‑lab experiments

A custom Layout with the wrapping maths unit‑tested (5 tests), and a recomposition study that shows @Immutable skipping on screen.

custom‑layout recomposition

🤖  argent‑rag  bilingual RAG backend

FastAPI + ChromaDB + MongoDB + Gemini. Language‑detecting retrieval, grounded generation, multimodal image queries — English + Hindi collections.

python fastapi rag gemini chromadb

🔁  argent‑http‑core  Ktor client factory

Refresh‑on‑401 with careful failure classification — 401/403 force logout, 5xx/network keep the session. Optional‑bearer auth, pure unit‑tested decideRefresh. 9 tests.

ktor token‑refresh auth

🧭  argent‑checkout  MVI checkout state machine

Pure‑Kotlin payment‑checkout state machine — three reducers driving every UPI flow. A when(checkoutType) scattered across 50+ places collapses into one CheckoutTypeConfigFactory; the reducer re‑derives SIP bank‑switches from the selected bank's mandates. 9 tests, no Android/Compose deps.

kotlin mvi state‑machine

📉  argent‑risk‑engine  credit-underwriting policy core

Pure‑Python loan‑amount policy — SMS‑income waterfall, bureau servicing history, risk segmentation and a FOIR cap combine into a pre‑approved amount. Decile‑direction is declared per model so ascending and descending scorecards can't silently invert each other's risk bands. 26 tests, zero I/O.

python credit‑risk decision‑engine

Each repo is built the same way: scaffold → ./gradlew build green → feature commits → tests → CI → README. Honest history, no big‑bang dumps.

 Learn Android — the wiki

A wiki for becoming an Android engineer, from zero to shipping on the Play Store. Each stage is a written note paired with a repo that runs. Start at the wiki or follow the learning path in order.

Stage Repo One line
🌀 Coroutines Learn-Kotlin-Coroutines network, Room, timeouts, error handling — the hard 20%
🌊 Flow Learn-Kotlin-Flow operators, search, retry, backpressure
🏛️ MVVM MVVM-Architecture-Android Kotlin + Hilt + Retrofit + Coroutines + StateFlow
🗺️ Roadmap android-developer-roadmap nine stages, fundamentals → shipping
☕ Java → Kotlin from-java-to-kotlin every concept side by side, with the why

 Toolbox

 

 

 

 How I think about engineering

Principle In practice
Design for the failure case first No signal, stolen device, mid-migration — that's where the architecture is decided
Share logic, not UI KMP: domain + data shared, UI native. Knowing what not to share is the skill
Measure before claiming a win A perf number ships with its device, build type and iteration count — or it doesn't ship
Trust the test suite Hand-written fakes over brittle mocks; cover the logic that moves money
Boring by default Proven tools until a new one earns its place

 GitHub activity

stats languages most used languages streak

contribution snake

Pinned Loading

  1. Expense-Manager Expense-Manager Public

    A personal finance and expense management app built with Kotlin and Jetpack Compose.

    Kotlin

  2. Task-App Task-App Public

    A productivity task manager app built with Kotlin and Jetpack Compose.

    Kotlin

  3. E-TRASH-APP E-TRASH-APP Public

    an e-sanitization app initiative for clean and ideal cities

    Java

  4. Iris-recognition Iris-recognition Public

    Iris Recognition using deep learning methods on jpeg compressed images

  5. Number-Plate-detection Number-Plate-detection Public

    Automatic license plate recognition using computer vision and machine learning.

    Jupyter Notebook

  6. Youtube-Video-Downloader Youtube-Video-Downloader Public

    Android video/audio downloader — Compose UI, foreground download service, yt-dlp engine via Chaquopy.

    Kotlin