Ameya Kulkarni.

Master of Information student at the University of Toronto, interested in system architecture and practical software design.

Ameya Kulkarni Toronto, Canada
Currently co-developing ShowPapers, an app for scanning, organizing, and finding personal documents.

About me

I'm Ameya, a Master of Information student at the University of Toronto, concentrating in Information Systems and Design. I'm interested in system architecture and how design decisions shape the way software works.

I like looking beneath the interface: where state belongs, how components work together, and what happens when something fails. Understanding those choices is a big part of what I enjoy about building software.

Areas I work inAndroid architecture, AI integration, state management, and protocol design.

Selected projects

The problems behind my projects and the design choices I made to solve them.

ShowPapers app preview with pinned sample documents and folders for personal IDs, visas, and other papers Document library / Enlarge screenshot

ShowPapers

Make personal documents easier to find and organize

Currently in developmentI'm co-developing an Android app for scanning, organizing, and finding personal documents. After scanning, the app classifies documents and automatically organizes them into folders. Users can review extracted information against its source and correct values.

App architectureI integrated document-processing and on-device AI SDKs, handling model availability and device eligibility. The Kotlin and Compose architecture uses ViewModels and repositories to separate UI state, processing, and storage.

The .showpapers protocolI developed the .showpapers protocol and validation rules for portable document collections. The app imports and exports .showpapers collection files. Users can open a collection from Files or the share sheet and review its contents before importing.

Visit showpapers.app
Orbit Hub sidebar showing account quotas, credit bars, and reset countdowns Orbit Hub / Enlarge screenshot

Orbit Hub

See available quota before choosing an account

I built a sidebar that brings Antigravity model quotas across accounts into one view. Reading current values required merging SQLite write-ahead logs and decoding binary payloads with a schema-free Protocol Buffers decoder.

Making freshness visibleReset countdowns help users decide which account to use. Last-fetched timestamps distinguish recent values from cached information, while cached reset times support recovery estimates when fresh data is unavailable.

Orbit Hub source
LLMetrics session analysis showing a context grade, token waste estimate, and model choice audit LLMetrics / Enlarge screenshot

LLMetrics

Understand AI usage and spot wasted tokens

I built a developer tool that turns supported LLM API activity into token-use and estimated-cost reporting. Network instrumentation and a TypeScript SQLite page reader with write-ahead log support make request activity and stored conversations available for analysis.

From activity to feedbackSession diagnostics and six anti-pattern detectors help explain where tokens are being used inefficiently. Coverage depends on the supported API paths and storage formats.

LLMetrics source

NearChat

Message nearby devices without internet access

I built offline messaging between nearby Android devices using Bluetooth Classic. A star relay topology supports group conversations, with one device routing messages while it stays connected and within range.

Keeping connections usableAndroid's cached device names caused stale connection attempts. I built a custom handshake to redirect them and managed socket lifecycles with Kotlin Coroutines and ViewModel scoping so connections follow the app's lifecycle.

NearChat source

Chattodo

Turn chat requests into trackable tasks

An Android app that lets users turn a chat message into a trackable task with a double tap, so requests can be followed through after the conversation moves on. I built it through a technical mentorship project; it is available in open alpha.

My workI worked on Compose interfaces and MVVM architecture, profiled recompositions, and stabilized state holders and list keys. Firestore listeners, caching, and ownership checks support task updates and access control; adaptive layouts and accessibility work make those flows easier to use.

Visit Chattodo

Vanish

Keep conversations live and temporary

A messaging project for conversations that begin when both participants are online, with an interface designed without a persistent message history. The source repository is named BlinkChat.

Design tradeoffI worked on real-time session state to support live conversations. Requiring both participants to be present keeps the interaction immediate, but limits asynchronous use.

Vanish source (BlinkChat)

Two Cars

Control two cars at once in an Android game

I built a game in Compose Canvas where the player controls two cars at once. I wrote the game loop directly, using delta-time interpolation to make movement account for the time between updates.

Managing game stateMVI and unidirectional data flow organize player actions and state changes, keeping the game logic separate from the drawing code.

Two Cars source

Experience

Edelweiss, EAAA | May 2026 - July 2026

Business Transformation Intern

Authored SOPs from scratch for the Business Transformation team, defining structured workflows for cross-functional coordination. Participated in vendor onboarding calls, documented UAT processes, and contributed to SAP stabilisation efforts by coordinating with implementation partners.

The Learning: Systems thinking isn't confined to code. Mapping vendor onboarding flows, writing UAT documentation, and stabilising ERP rollouts gave me a product management lens: understanding how technical decisions cascade into operational workflows, and how process design is itself a form of architecture.

Mentor: Nirbhay Pherwani | October 2025 - March 2026

Android Engineering Mentee

Mentored by Nirbhay Pherwani, Principal Engineer (Android) at ReachMobi, USA. Built Chattodo end-to-end as a deep engineering exercise: profiling performance bottlenecks, iterating on software architecture, and shipping a clean, stable product. Absorbed entire technical domains overnight and returned with working implementations.

The Learning: Working with a principal-level engineer reshaped how I approach problems. Beyond code, I began thinking about user engagement measurement, ethical data structuring, onboarding design, and accessibility, the intersection of people, data, and systems that defines real product thinking.

Thinking
Fragments.

01 / Subtract, Don't Add

The best product decision is usually a removal. Every feature is a decision forced on the user. I'd rather ship something that does one thing with zero friction than something that does ten things with a tutorial.

02 / Systems Over Screens

A beautiful UI on a fragile architecture is a liability. I think in data flows, state machines, and failure modes first. The interface is the last layer, not the first. Information design starts at the schema, not the mockup.

03 / Bridge the Gap

The most interesting problems live between disciplines. Studying Information Systems & Design at UofT after engineering taught me that the best builders speak both languages: the technical "how" and the human "why."

04 / Ship, Then Refine

Perfection is procrastination with better branding. I've learned more from shipping an imperfect product and watching real people use it than from any amount of whiteboard architecture. Feedback loops beat design docs.