Girish E Mobile engineer
BLR IST Résumé
Girish E · Portfolio Bengaluru · 12.97° N, 77.59° E Edition of October 2026

I build mobile apps, and everything they need to ship.

I'm a mobile engineer in Bengaluru with four years of production work in React Native and Flutter. I usually own the whole line: the app, the API and admin portal behind it, the store release, and the fix when something breaks in the field.

Now
Senior Software Developer, Techfino Capital
Ships to
Android · iOS · Web · Desktop
Stack
React Native · Flutter · Node · FastAPI · PHP
Open to
Senior mobile roles and product work
Every line on this board is a real release.
Projects live right now
ProjectWhereStatus

01.2 · About

I build for people who are busy doing something else.

Girish E, in a light shirt, in front of grey curtains
Girish EBengaluru, 2026

ನಮಸ್ಕಾರ, I'm Girish. For the last four years I've built software that has to work on ordinary phones in ordinary conditions: a conductor checking the day's duty before the first airport run, someone comparing a branded strip with its Jan Aushadhi generic, a loan connector sending a lead from a shop counter.

At Techfino Capital, an RBI-registered NBFC, I build and support customer, partner and internal apps in React Native and Flutter, and the Node.js, FastAPI and PHP services they talk to. Broken builds, release days and production bugs that cross the app, the API and the database tend to end up with me.

Alongside that I build products for Bengaluru and Karnataka: three apps and a portal for the KIA airport buses, a generic-medicine finder and a government-jobs alert app. And Libella, a code editor, because I wanted to see how much IDE fits in a 5.5 MB download.

Based in
Bengaluru, India · IST (UTC+5:30)
Role
Senior Software Developer, Techfino Capital, since June 2022
Education
Master of Computer Applications (MCA)
Apps ship in
English and ಕನ್ನಡ

01.3 · Now

What I'm working on this month.

Updated 12 October 2026

  1. In review

    TechFino Connector and TechFino AMS, two Flutter apps for Techfino Capital, are waiting on App Store review. The listings, screenshots and submission were scripted against the App Store Connect API.

  2. Shipped

    Libella 0.2.1: parameter hints, quick fixes, workspace symbols and inlay hints, on top of the signed auto-update that arrived in 0.2.0.

  3. Next OTA

    A live map for KIA-15 that shows buses approaching you, drawn on BMTC's own route paths, with a 2, 5 or 10 km radius.

  4. Every day

    Three airport-bus apps and their portal: timetables, the daily crew rotation, and the route posters for the crew groups.

Zone 02

Work

Products I've built and shipped, how the biggest one fits together, and the full list.

02.1 · Selected work

Four pieces of work I'd show first.

01

KIA airport buses

One database behind three apps, three websites and a Telegram bot, for Bengaluru's KIA-15, KIA-5 and KIA-5D airport routes.

Role
Sole developer
Runs on
Android, iOS, Web
Built with
React Native, PHP 8.3, MySQL, React
Status
Live on Google Play and the App Store

02

Libella

A code editor with Git, a terminal, language servers and an AI agent, in a 5.5 MB download.

Role
Design and engineering
Runs on
macOS, Windows, Linux, Web
Built with
Tauri 2, Rust, React, CodeMirror 6
Status
0.2.1, notarized, auto-updating

2,439 medicines21,286 KendrasWorks offline

03

Aushadha Mitra

Find the Jan Aushadhi generic for a branded medicine, what it saves you, and the nearest Kendra. Works offline.

Role
Sole developer
Runs on
Android, Web
Built with
Flutter, PHP 8.3, MariaDB
Status
Live

04

Techfino Capital

Customer, partner and internal apps for an RBI-registered NBFC, from CredCo and the CRM to this year's Connector, AMS and HRMS.

Role
Senior Software Developer
Runs on
Android, iOS, Web
Built with
React Native, Flutter, FastAPI, Node.js, PHP
Status
In production since 2022

02.2 · The KIA system

How the airport-bus system fits together.

Every app, site and bot reads the same MySQL database through one small API. Point at a part, or tap it, to see what it does.

Overview Data comes in on the left, lives in one database in the middle, and goes out to riders and crews on the right.
  • PHP 8.3 admin portal for routes, timetables, crews, fleet, assignments, media and audit logs. It doubles as a phone app with a bottom tab bar.
  • A daily cron job rotates the KIA-15 crews, and push reminders go out before duty.
  • A cron job polls BMTC every minute for live bus positions, so the apps can show buses approaching you.
  • One source of truth for every route, stop, timetable, crew and vehicle. Moved off Supabase in September 2026.
  • A small PostgREST-style API: filters, ordering and column selection in the query string, the same for every client.
  • React Native 0.84 on Android and iOS: duties, timetables, the live map and festival headers. Updated over the air.
  • React Native 0.80 on Android, with a custom bundle loader so over-the-air updates apply without a restart.
  • The passenger app: airport bus schedules, routes, stops and directions.
  • KIA-15, KIA-5 and KIA-5D timetables on Vercel, built with Vite, React and TypeScript.
  • The portal draws each route's poster on a canvas and posts the image through the Telegram Bot API.

02.3 · Index

Everything, in one list.

  1. KIA-15Duties, timetables and a live map for the KIA-15 airport routeReact Native 0.84Play · App Store
  2. KIA-5DCrew app for the KIA-5D route, with its own OTA bundle loaderReact Native 0.80Google Play
  3. Namma Vayu VajraAirport bus schedules, routes, stops and directions for passengersReact Native, MapsGoogle Play
  4. Vayu Vajra portal & APIThe admin portal and API behind every KIA app, site and botPHP 8.3, MySQLLive, staff only
  5. KIA route websitesPublic timetables for KIA-15, KIA-5 and KIA-5DVite, React, TypeScriptVercel
  6. LibellaAn IDE for macOS, Windows, Linux and the browserTauri 2, Rust, React0.2.1
  7. Aushadha MitraGeneric medicine prices and the nearest Jan Aushadhi KendraFlutter, PHP, MariaDBLive
  8. Udyoga AlertsKarnataka government jobs, exams and results, from official notices onlyFlutter, PHP, MariaDBLive
  9. Byraveshwara Flour MillServices, prices and festival greetings for a flour mill, in English and ಕನ್ನಡFlutter, PHPLive
  10. Today BengaluruCity events app with an admin, share pages and JWT authFlutter, PHPAPI live, app in testing
  11. TechFino ConnectorSend and follow MSME loan leads, for Techfino's connectorsFlutterIn App Store review
  12. TechFino AMSAsset management portal and app, with vendor deliveriesPHP 8.3, FlutterPortal live · app in review
  13. TECHFINO HRMSAttendance, leave, payroll with LOP and employee self-servicePHP 8.3, MySQLLive, internal
  14. TechFino CredCoCustomer-facing finance app: sign-in, financial workflows, releasesReact NativeProfessional work
  15. TechFino CRMMobile-first workflows on top of production APIsReact NativeProfessional work
  16. techfino.in, rebuiltA static site generator that keeps all 35 old URLs and the legal text word for wordNode.jsOn staging
  17. This siteHand-written, no framework, no build stepHTML, CSS, JSYou're on it

Zone 03

Engineering

How I work, what I've learned the hard way, and the tools I reach for.

03.1 · How I work

Five habits that keep things shipping.

  1. i.

    Own the whole line.

    An app is the smallest part of shipping one. I'd rather own the API, the admin screens, signing, the store listing and the support afterwards than throw them over a wall.

  2. ii.

    Keep one source of truth.

    Every KIA app, site and bot reads one database. When a rule has to exist twice, in PHP on the server and Dart on the phone, a generated test keeps the two identical.

  3. iii.

    Check it on the real thing.

    Simulators, real devices and live APIs, read-only by default. Libella's release binary runs a 32-step self-test of its own before I trust a build.

  4. iv.

    Make releases boring.

    Over-the-air updates for JavaScript, a manual release button on the stores, a backup before every migration, and the migration before the code that needs it.

  5. v.

    Write it down while it's fresh.

    Every project carries a runbook: how to build it, how to deploy it, and what never to touch. The next person to read it is usually me, six months later.

03.2 · Field notes

Bugs worth writing down.

Short write-ups of problems that took more than an afternoon. Open one for the cause and the fix.

N1 React Native · AndroidOver-the-air updates that only applied after a restartiOS picked up a new bundle on reload. Android kept running the old one.
Problem
After AppsAirPush installed an update and reloaded the app, Android still ran the previous JavaScript. People only saw the update after killing and reopening the app.
Cause
React Native 0.80's DefaultReactHost builds its JSBundleLoader once per process, from a fixed path. The SDK's in-place reload re-ran that same loader. iOS re-reads bundleURL on every reload, which is why it never showed the bug.
Fix
Build the release ReactHostImpl by hand, with a loader that asks for the bundle path every time JavaScript loads. Debug builds keep the default host. It compiles clean and goes out with the next Android release.
object : JSBundleLoader() {
  override fun loadScript(delegate: JSBundleLoaderDelegate): String {
    val path = AppsAirPushModule.getJSBundleFile(applicationContext)
    if (path.startsWith("assets://")) {
      delegate.loadScriptFromAssets(applicationContext.assets, path, true)
    } else {
      delegate.loadScriptFromFile(path, path, false)
    }
    return path
  }
}

Takeaway When a framework caches something, find out exactly when it reads it.

N2 React Native · iOS · MapsA route line that never appeared on iOSThe bus markers showed up. The route path and the radius circle didn't.
Problem
On the KIA-15 live map, BMTC's route path arrives a moment after the map. On iOS with the New Architecture it was never drawn, and neither was the radius circle once the location came in.
Cause
In react-native-maps on iOS, polylines and circles are only drawn if they exist when the map is created. Anything added later is ignored. A map created off-screen has the same problem until its camera moves.
Fix
Treat a new route or a new circle as a new map, by keying the MapView on both. On Home, the map is only created once it scrolls into view.
<MapView
  // a new route or circle means a new map
  key={`${route?.routeId ?? 'no-route'}|${center ? radius : 'no-circle'}`}
  ref={map}
  style={styles.fill}
>

Takeaway If a native view ignores updates, make the update a remount.

N3 PHP · MySQL · DeploysOne new column, and every read returned 500The schema file reached the server a minute before the database did.
Problem
I added driver columns to kia_15_routes and uploaded the schema file before the ALTER had run. For about a minute, every read of that table failed.
Cause
The API's query builder selects every column listed in the schema file, even for a bare *. One column in the file that wasn't in the table made every query invalid.
Fix
Reverted the file at once, ran the migration, then deployed again. The deploy notes now say: migration first, code second, and compare the live file with the local original before overwriting it.
-- 1. the database first
ALTER TABLE `kia_15_routes`
  ADD COLUMN `driver_id`   VARCHAR(20)  NULL AFTER `profilepic`,
  ADD COLUMN `driver_name` VARCHAR(150) NULL AFTER `driver_id`;
-- 2. then tableSchema.php, 3. then the portal

Takeaway Order a deploy so that every step in between still works.

N4 Flutter · PHP · TestingThe same search, written twice, kept identicalAushadha Mitra searches offline on the phone and online on the server. The results have to match.
Problem
Medicine search runs in Dart when the phone is offline and in PHP when it isn't. Two copies of text-matching rules drift apart the moment one of them gets a fix.
Fix
PHP is the reference. A script runs it over a list of real queries and writes the expected results to a file, and flutter test replays every case against the Dart code. Udyoga Alerts does the same for listing status: one date rule, two languages, 726 cases.
php backend/tests/make_search_vectors.php   # PHP writes the expected results
flutter test                                # Dart has to match every case

Takeaway If logic must live in two places, let a test be the source of truth.

N5 Tauri · Security headersAn editor that showed only its line numbersLibella's editor worked on the desktop. On Android, only the gutter appeared.
Problem
CodeMirror styles itself by injecting <style> tags. In the Android build the text area was blank and only the line numbers showed.
Cause
Tauri adds a nonce to style-src in the app's Content Security Policy. Once a nonce is present, browsers ignore 'unsafe-inline', so every style CodeMirror injected was blocked.
Fix
Stop Tauri changing style-src (scripts keep their nonces), and add a self-test step that checks the editor really renders text.
"security": {
  "dangerousDisableAssetCspModification": ["style-src"]
}

Takeaway Test what the user sees, not just what loaded.

N6 iOS · Xcode 27One Xcode upgrade, three breaking changes, sixteen appsApps crashed at launch, pods refused to build, and run-ios couldn't find the simulator.
Cause
iOS 27 requires the UIScene lifecycle. Deployment targets below iOS 15 became build errors. And Simulator.app is now DeviceHub.app, which the React Native and Expo CLIs didn't know about.
Fix
A postinstall script in all sixteen React Native and Expo apps patches the CLI so it finds the new simulator. Every Podfile lifts pods to iOS 15.1. A SceneDelegate starts React Native in a window scene, done first for the three transit apps.
installer.pods_project.targets.each do |target|
  target.build_configurations.each do |config|
    current = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']
    if current && current.to_f < minimum_ios.to_f
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = minimum_ios
    end
  end
end

Takeaway Fix it once, in a file every project shares.

03.3 · Toolbox

Tools I reach for, and why.

Mobile

React Native
My daily driver since 2022. New Architecture, Hermes, over-the-air updates.
Flutter
My default for new apps in 2026, with Riverpod 3 and go_router.
Kotlin & Swift
When the bridge isn't enough: React hosts, scene delegates, native modules.
Xcode, Gradle, CocoaPods, SPM
Most "it won't build" tickets end with me.

Backend

PHP 8.3, no framework
Small, fast, and it deploys to shared hosting with a file upload.
Node.js, Python & FastAPI
Services at Techfino, on MySQL.
MySQL & MariaDB
Plain SQL migrations, run before the code that needs them.
Auth
JWT with rotating refresh tokens, or sessions with CSRF where a portal already has them.

Web & desktop

TypeScript, React, Vite
The public route sites and Libella's interface.
Vanilla JS
Portals and this site. No build step to go stale.
Tauri 2 & Rust
A desktop app in 5.5 MB instead of 150.
CodeMirror 6, xterm.js
The editor and terminal inside Libella.

Shipping

App Store Connect API
Listings, screenshots and submissions from a script.
GitHub Actions
Windows and Linux builds of Libella.
AWS, Nginx, Hostinger, Vercel
Wherever the project already lives.
Claude API
Libella's chat, inline edits and agent, with prompt caching.

Zone 04

Career

Where I've worked, written like a changelog.

04.1 · Experience

Where I've worked.

  1. Jun 2022 → now

    Senior Software Developer · Techfino Capital Private Limited, Bengaluru

    • Build and maintain Android and iOS apps in React Native, JavaScript and TypeScript, and since 2026 in Flutter.
    • Write reusable mobile UI, and wire it to production REST APIs and authentication flows.
    • Fix the Android and iOS builds that break: Gradle, Xcode, CocoaPods and dependency upgrades.
    • Trace production issues across the UI, the APIs, the database and the build, and make them not happen again.
    • Build backend services in Node.js and Python/FastAPI on MySQL, and deploy them on AWS behind Nginx.
    • Own features from requirements through testing, release and support.
  2. Alongside

    Independent products

    • The KIA airport-bus apps, their portal and their public sites.
    • Libella, Aushadha Mitra, Udyoga Alerts, Today Bengaluru and Byraveshwara Flour Mill.
  3. Jan 2021 → May 2022

    Medical Billing Analyst · Tharworx

    • Data-heavy operational work, with a focus on accuracy, data quality and resolving cases on time.
  4. Education

    Master of Computer Applications · MCA

Zone 05

Contact

The end of the line.

Have something that needs to ship? Let's talk.

Bengaluru, IST (UTC+5:30). It's here now.

↑↓ move↵ openEsc close