NaanBinary

NaanBinary #

By Naan Binary: Shahrukh Qureshi, Aastha Parmar, Muhammad Mujtaba, Faizaan Qureshi, Ammar Obaid, Soham Nagi

🎬 Watch the Demo #


What is NaanBinary? #

NaanBinary is an Android student hub that consolidates your academic life into one polished app. Upload your transcript and get a full GPA dashboard. Upload a course outline and your deadlines appear automatically. Get notified before every class. Find study partners. Navigate campus. All in one place, all working offline-first.


Features #

  • Transcript Intelligence — Upload a PDF transcript; LLM parsing extracts every term, course, grade, and credit into a term-by-term GPA dashboard with trend analytics
  • Syllabus Parser — Upload a course outline and automatically extract deadlines, assignments, and meeting times directly into your timetable and home hub
  • Timetable & Smart Notifications — Manage courses locally with WorkManager-powered 15-minute class reminders that survive app restarts
  • Home Hub — A daily at-a-glance view of your next class, upcoming deadlines, and one-tap campus navigation
  • Course Reviews — Search and submit Laurier course and instructor reviews
  • Study Buddy — Peer messaging system for finding and coordinating with study partners
  • Campus Navigation — 100+ UW and Laurier building mappings with direct Google Maps navigation intents

Architecture #

The app is built on two complementary architectural styles.

MVVM is used for all screen-state management across auth, transcript, profile, timetable, chat, and study buddy flows. Compose screens own zero business logic — they forward user input to ViewModels, which call repositories, which surface new state back via StateFlow. Firebase, Supabase, and WorkManager are never touched directly by the UI layer.

Event-Driven (Implicit Invocation) powers the transcript parsing pipeline. When a user selects a PDF, the repository enqueues a TranscriptParseWorker via WorkManager, marks parsing state in DataStore, and returns immediately. The worker parses in the background and emits results through a snapshotFlow. The UI reacts to state changes rather than waiting on a callback — meaning parsing survives process death, rotation, and interruption with automatic retry and exponential backoff.

Compose Views → ViewModels → Repositories → Services
                                             (DataStore / Firebase / Supabase / Gemini / WorkManager)

Design Patterns #

Adapter — LLM boundary. All three AI-powered features (transcript parsing, syllabus extraction, campus chat) depend on a single LlmService interface rather than the Gemini SDK directly. GeminiLlmService adapts that interface — handling URI-to-part conversion, structured JSON output, markdown stripping, and error translation in one place. Swapping LLM providers requires implementing one interface, not touching three agents.

Facade — Profile photo subsystem. ProfilePhotoRepository exposes a five-method API (observePhotoUri, createCameraCaptureUri, saveCapturedPhoto, savePickedPhoto, removePhoto) that hides FileProvider, ImageDecoder, DataStore metadata, auth-dependent Supabase sync, and timeout/error handling. The ViewModel calls one entry point instead of coordinating six subsystems. Images are capped at 1024px max edge and JPEG quality 85 before any upload.


Tech Stack #

Platform: Android (Kotlin, Jetpack Compose)
Auth & Cloud: Firebase Auth, Firestore, Realtime Database
Storage: Supabase (photos), DataStore (local persistence)
AI: Gemini API (transcript parsing, syllabus extraction, campus chat)
Background Work: WorkManager
Navigation: Google Maps intent API