From f2c51e6c982926c8111eeef019a9da01013a18f3 Mon Sep 17 00:00:00 2001 From: Noaman-Akhtar Date: Sat, 16 May 2026 12:07:32 +0530 Subject: [PATCH] feat: add TAP Buddy native app prototype and DMP proposal --- tap-buddy-proposal/PROPOSAL.md | 486 +++++++++++++++++++++++++++++++++ tap-buddy-proposal/README.md | 54 ++++ 2 files changed, 540 insertions(+) create mode 100644 tap-buddy-proposal/PROPOSAL.md create mode 100644 tap-buddy-proposal/README.md diff --git a/tap-buddy-proposal/PROPOSAL.md b/tap-buddy-proposal/PROPOSAL.md new file mode 100644 index 0000000..4ba8b33 --- /dev/null +++ b/tap-buddy-proposal/PROPOSAL.md @@ -0,0 +1,486 @@ + +# Code for Gov Tech + +# Project Proposal for The Apprentice Project + +# **Project:** Native GovTech Learning App for Public Education Systems **Mentors:** TBD **Idea:** This project builds a native Android application for TAP Buddy, an AI-powered learning platform by The Apprentice Project that supports government school students in developing 21st-century skills through project-based learning. The app connects with TAP's Frappe-based LMS to enable content access, submissions, feedback, and progress tracking. It includes a real-time AI tutor chat interface, supports low-connectivity environments through offline capabilities, and integrates with DIKSHA for broader content access. **I built a working prototype of the app's UI, navigation, and component architecture before writing this proposal, to demonstrate that I understand the problem deeply enough to deliver, not just describe.** + +# \ + +### **Project Vision, Prototype, and Motivation** + +#### **Prototype** + +A working UI prototype has been developed that demonstrates the complete student journey: onboarding, login, content browsing, AI chat, progress tracking, and profile management. The prototype establishes the full navigation architecture, reusable component library, and state management patterns that the production app will build on. + +* **Prototype Repository:** [github.com/Noaman-Akhtar/Tap-buddy](https://github.com/Noaman-Akhtar/Tap-buddy) + +The prototype runs on real Android hardware via Expo Go. It demonstrates: + +* 3-slide animated onboarding carousel with Skip, Next, and Get Started controls +* Phone number login screen (simulated auth, ready for Frappe API integration) +* 5-tab navigation: Home, Learn, Chat, Progress, Profile +* AI Tutor chat interface with message bubbles, typing indicator, and keyboard-aware layout (simulated responses, ready for WebSocket integration) +* Reusable UI component library: Button, Card, Badge, ProgressBar (all built with React Native StyleSheet for maximum Android compatibility) +* Zustand-based global auth and onboarding state management +* SQLite schema defined for messages and activities (ready for offline caching) +* Connectivity-aware SyncBanner component using NetInfo + +**Important note:** All screen data currently comes from a `MockData.ts` placeholder file. The prototype proves the UI/UX architecture and component patterns. Real Frappe API integration, WebSocket chat, DIKSHA content, and offline sync logic are planned for implementation during the DMP program. + +**Motivation** + +My motivation for this project comes from a genuine belief that **the digital divide in India's government school system is a solvable engineering problem**, and that TAP is one of the few organizations attacking it the right way. + +TAP's current approach of running learning interactions through WhatsApp is clever for reach, but fundamentally limited. WhatsApp cannot track structured learning outcomes, cannot render rich content like code blocks or diagrams, cannot work offline, and cannot provide the kind of contextual AI tutoring that makes personalized learning possible. **A native Android app layer is the missing piece.** + +When I read the issue, I immediately recognized the technical stack: React Native, Frappe REST APIs, WebSockets, offline caching. This is exactly what I have been building across my projects. **CoSketch** taught me real-time WebSocket architecture and local-first rendering. **MindStack** taught me semantic search, JWT auth, and building AI-first interfaces. My research at KIIT on adaptive video streaming taught me how to engineer for constrained network environments. My 29+ merged PRs across Sugar Labs, Cilium, CHAOSS, and Avanti Fellows taught me how to work inside existing codebases and ship reliable improvements. + +### **Contact Information** + +**Name:** Noaman Akhtar + +**Email:** akhtarnoaman@gmail.com + +**Phone:** +91-6297219570 + +**GitHub:** [github.com/Noaman-Akhtar](https://github.com/Noaman-Akhtar) + +**LinkedIn:** [linkedin.com/in/noaman-akhtar-8235572a2](https://www.linkedin.com/in/noaman-akhtar-8235572a2/) + +**Twitter/X:** [x.com/Noaman__Akhtar](https://x.com/Noaman__Akhtar) + +**Preferred Language:** English + +# **Education** + +**Kalinga Institute of Industrial Technology (KIIT), Bhubaneswar** + +Bachelor of Technology - Computer Science and Engineering + +*July 2023 - Present, CGPA: 8.71 / 10* + +**Coursework:** Data Structures and Algorithms, Operating Systems, DBMS, Computer Networks, OOP + +# **Past Experience in Software Development** + +## **MindStack - Second Brain Web App** + +> **Stack:** React, Node.js, Express, MongoDB, TypeScript, Pinecone, Cloudinary +> **Live:** [mind-stack-fe.vercel.app](https://mind-stack-fe.vercel.app/) **Code:** [github.com/Noaman-Akhtar/MindStack](https://github.com/Noaman-Akhtar/MindStack) + +A full-stack Second Brain application. Directly relevant to this project because: + +* Built **AI-powered semantic search** using Pinecone vector embeddings, the same approach needed for the AI Tutor's knowledge retrieval +* Implemented **end-to-end JWT authentication** with bcrypt hashing and Zod schema validation, directly maps to Frappe auth integration +* Designed **real-time content sync** patterns and responsive UI with Framer Motion animations + +## **CoSketch - Collaborative Whiteboard** + +> **Stack:** Next.js, TypeScript, Node.js, PostgreSQL, WebSockets, Prisma, Turborepo +> **Code:** [github.com/Noaman-Akhtar/coSketch](https://github.com/Noaman-Akhtar/coSketch) + +A local-first collaborative whiteboard. This is the **most directly relevant project**: + +* **WebSocket architecture** - designed the full duplex communication layer, message queuing, and reconnection logic. This is exactly what the AI Tutor chat needs. +* **Local-first rendering** - strokes render instantly on the client device, syncing to server asynchronously. This is the offline-first pattern TAP needs for low-connectivity environments. +* **Turborepo monorepo** with HTTP API, WebSocket server, and frontend each in their own package, keeping deploys independent. + +## **Graviton - Arcade Runner** + +> **Stack:** JavaScript, HTML5 Canvas, Web Audio API, CSS3 +> **Live:** [graviton-theta.vercel.app](https://graviton-theta.vercel.app/) **Code:** [github.com/Noaman-Akhtar/Graviton](https://github.com/Noaman-Akhtar/Graviton) + +A gravity-based arcade runner rendered entirely with HTML5 Canvas 2D. Players navigate an Archimedean spiral tunnel around a black hole, dodging procedurally generated polygon asteroids with a fixed-timestep physics engine at 60 FPS. + +* **Custom rendering pipeline** - built from scratch with Canvas 2D, no game engine. Demonstrates low-level understanding of frame timing, animation loops, and performance budgets. +* **Procedural generation** - asteroids are generated dynamically using polygon geometry, keeping the game endlessly replayable. +* **Fixed-timestep physics** - consistent 60 FPS physics simulation decoupled from render framerate, the same pattern used in smooth mobile animations. + +## **Research Assistant - Adaptive Video Streaming over 5G** + +**KIIT, Bhubaneswar** *Sep 2025 - Present* +**Tech:** Python, DASH-SVC, AWS EC2, FFmpeg + +* Built a DASH-SVC streaming testbed on AWS EC2 for controlled experimentation +* Analyzing throughput, bitrate adaptation, and QoE metrics under **varying network conditions** +* This research directly informs how TAP's app should handle content delivery in low-bandwidth environments + +## **Open Source Contributions - 29+ PRs Merged** + +### Sugar Labs - `sugarlabs/musicblocks` + +Active contributor to an open-source music programming environment used by students and educators worldwide. + +**Performance and Resource Management:** Optimized execution hot paths via deep-cloning and eliminated memory leaks by implementing systematic timer cleanup for timbre, rhythm ruler, and phrase maker widgets. + +**State and Data Integrity:** Resolved complex asynchronous race conditions and engineered cross-reload state persistence to prevent data loss during language transitions. + +**System Resilience and Testing:** Built robust storage quota error fallbacks and fortified test suite reliability by eliminating tautological assertions. + +#### Pull Requests + +| PR | Title | Category | Status | +| :---- | :---- | :---- | :---- | +| [#7128](https://github.com/sugarlabs/musicblocks/pull/7128) | fix: replace tautologies with real assertions in PenBlocks tests | Testing | Merged | +| [#7042](https://github.com/sugarlabs/musicblocks/pull/7042) | fix: correct dark help dropdown hover states | Accessibility | Merged | +| [#7033](https://github.com/sugarlabs/musicblocks/pull/7033) | fix: use tempo activity instance | Bug Fix | Merged | +| [#7013](https://github.com/sugarlabs/musicblocks/pull/7013) | fix: change help icon colors for better dark/high-contrast visibility | Accessibility | Merged | +| [#6993](https://github.com/sugarlabs/musicblocks/pull/6993) | fix: handle click event state after stop in action block | Bug Fix | Merged | +| [#6980](https://github.com/sugarlabs/musicblocks/pull/6980) | Fix DuoSynth Panel Not Opening on First Click | Bug Fix | Merged | +| [#6941](https://github.com/sugarlabs/musicblocks/pull/6941) | fix: clean up timbre widget timers | Performance | Merged | +| [#6940](https://github.com/sugarlabs/musicblocks/pull/6940) | fix: clean up rhythm ruler timers | Performance | Merged | +| [#6939](https://github.com/sugarlabs/musicblocks/pull/6939) | perf: use deepClone in block copy hot paths | Performance | Merged | +| [#6884](https://github.com/sugarlabs/musicblocks/pull/6884) | fix: cache sampler tuner segments | Performance | Merged | +| [#6880](https://github.com/sugarlabs/musicblocks/pull/6880) | fix: render rhythm ruler note values as DOM nodes | Bug Fix | Merged | +| [#6841](https://github.com/sugarlabs/musicblocks/pull/6841) | fix: resolve planet sorting dropdown bugs | Bug Fix | Merged | +| [#6838](https://github.com/sugarlabs/musicblocks/pull/6838) | fix: reset stop and save buttons when playback completes | Bug Fix | Merged | +| [#6832](https://github.com/sugarlabs/musicblocks/pull/6832) | fix: persist project changes across reload | Data Integrity | Merged | +| [#6807](https://github.com/sugarlabs/musicblocks/pull/6807) | fix: unescape HTML project data on load | Data Integrity | Merged | +| [#6793](https://github.com/sugarlabs/musicblocks/pull/6793) | fix: resolve multi-click race condition on project likes | Data Integrity | Merged | +| [#6777](https://github.com/sugarlabs/musicblocks/pull/6777) | fix: fixed layout and colors of report submission form | UI/UX | Merged | +| [#6768](https://github.com/sugarlabs/musicblocks/pull/6768) | Fix/high contrast UI improvements | Accessibility | Merged | +| [#6748](https://github.com/sugarlabs/musicblocks/pull/6748) | fix: apply dynamic theme colors to Import MIDI dialog | Accessibility | Merged | +| [#6711](https://github.com/sugarlabs/musicblocks/pull/6711) | fix: use dynamic blueButtonText color in dialog | Accessibility | Merged | +| [#6681](https://github.com/sugarlabs/musicblocks/pull/6681) | fix: add confirmation dialog for New Project | UI/UX | Merged | + +### Cilium - `cilium/cilium.io` + +Improved frontend responsiveness and UX by resolving viewport-specific overflows, fixing z-index bugs, and enhancing accessibility. + +| PR | Title | Category | Status | +| :---- | :---- | :---- | :---- | +| [#934](https://github.com/cilium/cilium.io/pull/934) | fix: improve event card border contrast | Accessibility | Merged | +| [#932](https://github.com/cilium/cilium.io/pull/932) | fix: add missing noopener to rel attributes | Security | Merged | +| [#918](https://github.com/cilium/cilium.io/pull/918) | fix: search modal appears behind header | Bug Fix | Merged | +| [#914](https://github.com/cilium/cilium.io/pull/914) | fix: resolve horizontal overflow on blog page | Bug Fix | Merged | +| [#895](https://github.com/cilium/cilium.io/pull/895) | fix: improve accessibility for hash anchor links | Accessibility | Merged | + +### CHAOSS - `augurlabs/augur` + +Hardened backend API error handling. Reduced technical debt by consolidating Python configurations. + +| PR | Title | Category | Status | +| :---- | :---- | :---- | :---- | +| [#3650](https://github.com/augurlabs/augur/pull/3650) | Remove distributed from dependencies | Maintenance | Merged | +| [#3576](https://github.com/augurlabs/augur/pull/3576) | fix: cleanup TODO comments in frontend.py | Maintenance | Merged | +| [#3553](https://github.com/augurlabs/augur/pull/3553) | Deleted the augur-retired-sql.schema file | Maintenance | Merged | + +# **What I Built (Prototype)** + +Rather than submit only a plan, I built a UI prototype before writing this proposal. Here is what exists and works today: + +**Repository:** [github.com/Noaman-Akhtar/Tap-buddy](https://github.com/Noaman-Akhtar/Tap-buddy) + +## **What the Prototype Demonstrates** + +The prototype establishes the complete app scaffold, navigation architecture, and reusable component library. Every screen is functional and renders correctly on Android hardware. + +**Screens built:** + +| Screen | What it shows | +| :---- | :---- | +| **Onboarding** | 3-slide carousel with dot indicators, Skip/Next/Get Started buttons | +| **Login** | Phone number input with +91 prefix, simulated Frappe API auth point | +| **Home** | Personalized greeting, streak badge, progress bars, course grid, Continue Learning cards | +| **Learn** | Unit list with course filter pills, rigor badges, progress tracking per unit | +| **Chat** | AI Tutor with message bubbles, typing indicator, keyboard-aware input bar | +| **Progress** | Stats grid (Access Rate, Submissions, Quiz Avg), per-course breakdown, achievements carousel | +| **Profile** | User info section, settings menu, notification toggle, logout | + +**Reusable components built:** + +| Component | Purpose | +| :---- | :---- | +| `Button.tsx` | Multi-variant button (primary, secondary, ghost, danger) using StyleSheet | +| `Card.tsx` | Content card with variants (white, tinted, outline) using StyleSheet | +| `Badge.tsx` | Course and status label badges | +| `ProgressBar.tsx` | Animated progress visualization | +| `SyncBanner.tsx` | Connectivity-aware offline notification banner using NetInfo | + +**Architecture foundations:** + +| Module | Role | +| :---- | :---- | +| `app/_layout.tsx` | Root layout with auth redirect logic and mounted flag | +| `app/(auth)/_layout.tsx` | Auth stack navigator for onboarding and login | +| `app/(tabs)/_layout.tsx` | Tab navigator with 5 tabs and SyncBanner integration | +| `lib/stores/authStore.ts` | Zustand global state for auth and onboarding flags | +| `lib/db/database.ts` | SQLite schema definition for messages and activities tables | +| `constants/MockData.ts` | Placeholder data (to be replaced with real Frappe API calls) | +| `constants/Colors.ts` | Design token system for theming | + +**What is NOT yet implemented (planned for DMP):** + +* Real Frappe REST API integration (all screens use MockData.ts) +* Real WebSocket AI Tutor chat (currently uses setTimeout simulation) +* DIKSHA API content integration +* Offline sync logic (SyncBanner detects connectivity but does not trigger data sync yet) +* OTP-based phone authentication +* Push notifications + +# **Architecture** + +## System Architecture + +```mermaid +graph TB + subgraph Phone["Student Phone - Android"] + subgraph App["React Native App - Expo Router"] + subgraph Auth["(auth) Route Group"] + Onboard["Onboarding"] + Login["Login"] + end + subgraph Tabs["(tabs) Route Group"] + Home["Home"] + Learn["Learn"] + Chat["Chat"] + Progress["Progress"] + Profile["Profile"] + end + subgraph State["State and Persistence Layer"] + Zustand["Zustand - Auth State"] + SQLite["SQLite - Local Cache"] + end + SyncBanner["SyncBanner - NetInfo"] + end + end + + subgraph Backend["Backend Services"] + Frappe["Frappe REST API\n- Auth\n- Content\n- Submissions\n- Progress"] + WS["WebSocket Server\n- AI Tutor Chat"] + DIKSHA["DIKSHA API\n- Gov Content"] + end + + Auth -->|authenticated| Tabs + Home --> Frappe + Learn --> Frappe + Learn --> DIKSHA + Chat --> WS + Progress --> Frappe + Zustand --> Auth + SQLite --> Tabs + SyncBanner -->|connectivity status| Tabs +``` + +## Navigation Flow + +```mermaid +flowchart LR + Start(["App Launch"]) --> RootLayout["Root _layout.tsx"] + RootLayout -->|"Not onboarded"| Onboard["Onboarding\n3-slide carousel"] + Onboard -->|"Get Started / Skip"| LoginScreen["Login\nPhone + OTP"] + LoginScreen -->|"Auth success"| TabNav["Tab Navigator"] + RootLayout -->|"Already authenticated"| TabNav + + TabNav --> Home["Home Tab\nDashboard"] + TabNav --> LearnTab["Learn Tab\nUnits + DIKSHA"] + TabNav --> ChatTab["Chat Tab\nAI Tutor"] + TabNav --> ProgressTab["Progress Tab\nStats + Courses"] + TabNav --> ProfileTab["Profile Tab\nSettings"] + + LearnTab -->|"Tap unit"| LessonDetail["Lesson Detail"] +``` + +## Data Flow Pipeline + +```mermaid +flowchart TD + subgraph Online["Online Mode"] + FrappeAPI["Frappe REST API"] -->|"JSON response"| APIClient["API Client Layer"] + APIClient -->|"Write to cache"| SQLiteDB["SQLite Database"] + APIClient -->|"Update UI"| Screens["App Screens"] + SQLiteDB -->|"Read cached data"| Screens + end + + subgraph Offline["Offline Mode"] + SQLiteDB2["SQLite Cache"] -->|"Serve cached content"| Screens2["App Screens"] + UserAction["User Submission"] -->|"Queue in outbox"| Outbox["SQLite Outbox Table"] + end + + subgraph Sync["On Reconnect"] + NetInfo["NetInfo detects online"] -->|"Trigger"| SyncBanner2["SyncBanner"] + SyncBanner2 -->|"Flush"| Outbox2["Outbox Queue"] + Outbox2 -->|"POST each item"| FrappeAPI2["Frappe API"] + FrappeAPI2 -->|"Success: delete from outbox"| Done["Sync Complete"] + end +``` + +## Offline Sync Strategy + +```mermaid +sequenceDiagram + participant User + participant App + participant SQLite + participant NetInfo + participant Frappe + + User->>App: Opens app + NetInfo->>App: Reports connectivity status + + alt Online + App->>Frappe: GET /api/resource/TAP Unit + Frappe-->>App: Units JSON + App->>SQLite: Cache units locally + App->>User: Render units from API + + User->>App: Submit activity + App->>Frappe: POST /api/resource/TAP Submission + Frappe-->>App: 200 OK + else Offline + App->>SQLite: Read cached units + SQLite-->>App: Cached data + App->>User: Render units from cache + + User->>App: Submit activity + App->>SQLite: Queue in outbox table + App->>User: Show "Saved offline" indicator + end + + NetInfo->>App: Connectivity restored + App->>SQLite: Read outbox queue + loop For each queued item + App->>Frappe: POST queued submission + Frappe-->>App: 200 OK + App->>SQLite: Delete from outbox + end + App->>User: Hide SyncBanner +``` + +# **Detailed Implementation Plan** + +## **Goal 1: App Scaffold and Core Navigation (Completed in Prototype)** + +* expo-router file-based navigation with route groups `(auth)` and `(tabs)` +* Root layout uses a `mounted` flag + Zustand `isAuthenticated` to prevent redirect race conditions +* All layout-critical containers use explicit `style` props (not NativeWind className) for reliable Android rendering +* Button and Card components use StyleSheet objects for variant-based styling + +## **Goal 2: Frappe LMS Integration (To be built during DMP)** + +* **Authentication:** Replace mock login with real Frappe OTP flow using `expo-secure-store` for token persistence +* **Content API:** Wire Learn screen to `GET /api/resource/TAP Unit` and `GET /api/resource/TAP Activity` endpoints +* **Submission API:** Implement activity completion via `POST /api/resource/TAP Submission` +* **Progress API:** Connect Progress screen to `GET /api/method/tap.api.get_student_progress` +* **Caching:** Store API responses in SQLite tables for offline access + +## **Goal 3: AI Tutor WebSocket Chat (To be built during DMP)** + +The chat UI is already built and keyboard-aware. The setTimeout simulation will be replaced with a real WebSocket client: +* Full duplex WebSocket connection with exponential backoff reconnection +* Message persistence in SQLite for offline viewing of chat history +* Typing indicators via WebSocket events +* Offline fallback: input disabled, SyncBanner shown, previous messages remain visible from cache + +## **Goal 4: DIKSHA Integration (To be built during DMP)** + +* Evaluate DIKSHA Content Search API for grade and subject-level content +* Render DIKSHA content via react-native-webview (already in project dependencies) +* Map DIKSHA content IDs to TAP unit topics for contextual surfacing + +## **Goal 5: Offline-First Sync (To be built during DMP)** + +* Implement SQLite outbox table for queuing submissions when offline +* SyncBanner triggers `syncOutbox()` on connectivity restore +* Background content prefetch: cache next 3 units on WiFi for offline access + +# **Known Limitations** + +Being honest about what the prototype does not yet do: + +1. **All data is mock.** Every screen reads from `MockData.ts`. No real API calls exist yet. The Frappe API endpoints need to be wired in during DMP. + +2. **Chat is simulated.** The AI Tutor uses `setTimeout` to cycle through 5 pre-written bot responses. The real WebSocket endpoint URL is needed from TAP's backend team. + +3. **SQLite is defined but not active.** The database schema exists (`messages`, `activities` tables) but no screen currently reads from or writes to SQLite. This will be activated when real API integration begins. + +4. **SyncBanner is detection-only.** It correctly detects offline/online state using NetInfo, but does not trigger any data sync logic yet. + +5. **No real authentication.** Login accepts any 10-digit number. Real Frappe OTP integration needs TAP's auth endpoint. + +# **Timeline** + +### Community Bonding (Before Week 1) + +| Period | Tasks | +| :---- | :---- | +| Community Bonding | Set up development environment with access to TAP's Frappe instance. Get auth endpoint credentials and WebSocket server URL. Review Frappe LMS data model with mentor. Identify relevant DIKSHA content categories. | + +### Phase 1: API Integration (Weeks 1-4) + +| Week | Focus | Deliverables | +| :---- | :---- | :---- | +| Week 1 | Auth + Frappe Setup | Phone OTP login, secure token storage, Frappe API client | +| Week 2 | Content APIs | Wire Learn and Home screens to real units/activities, SQLite caching | +| Week 3 | Submissions + Progress | Activity completion API, progress tracking endpoints | +| Week 4 | Offline Sync | SQLite outbox, background prefetch, sync on reconnect | + +**Mid-point Milestone:** Fully functional app with Frappe LMS integration and core student onboarding flows functional end-to-end. + +### Phase 2: AI Chat + DIKSHA (Weeks 5-8) + +| Week | Focus | Deliverables | +| :---- | :---- | :---- | +| Week 5 | WebSocket AI Chat | Real WS client, reconnection logic, offline fallback | +| Week 6 | DIKSHA Integration | Content API, embedded playback, topic mapping | +| Week 7 | Push Notifications | FCM setup, streak and submission notification triggers | +| Week 8 | Whitelabel Config | Environment-based theming, partner config validation | + +### Phase 3: Testing and Documentation (Weeks 9-12) + +| Week | Focus | Deliverables | +| :---- | :---- | :---- | +| Week 9 | E2E Testing | Detox test suite covering onboarding to submission flow | +| Week 10 | User Testing | Test with actual TAP students, collect and implement feedback | +| Week 11 | Documentation | Deployment guide, API docs, partner onboarding runbook | +| Week 12 | Final Polish | Full regression run, mentor demo, PR cleanup and submission | + +# **Availability** + +I plan to dedicate 35-40 hours per week to this project throughout the program. + +**Daily schedule:** Most active between 9 AM and 11 PM IST. I check GitHub, email, and Discord multiple times daily and respond to mentor messages within a few hours. + +**Prior commitments:** No internship or part-time work during the program period. + +# **Progress Reporting** + +I am committed to full transparency throughout the program: + +* **Weekly:** Video call with mentors to demo progress and align on next steps +* **Weekly:** Short blog/devlog documenting decisions made and problems solved +* **Continuously:** Public GitHub repository with granular commits, every feature committed and pushed separately before moving to the next task + +I have maintained this discipline in my open source contributions with consistent review responses and actively testing feedback from maintainers. + +# **How to Run the Prototype** + +```bash +# Clone the repository +git clone https://github.com/Noaman-Akhtar/Tap-buddy.git +cd Tap-buddy/tap-buddy-mvp + +# Install dependencies +npm install + +# Start Metro bundler (clear cache) +npx expo start --clear + +# On Android: scan QR code in Expo Go app +# OR press 'a' to open on connected Android device +``` + +**Requirements:** Node.js 18+, Expo Go app installed on Android device. + +# **Conclusion** + +I built the UI prototype before submitting this proposal to demonstrate that I understand the problem and can deliver working software, not just describe it. + +The core design principle driving the architecture is **offline-first with sync**, not online-with-fallback. Government school students in India frequently have unreliable connectivity. The app must work completely offline and sync intelligently when connected. This distinction shapes every design decision: SQLite as the primary data store, the outbox pattern for submissions, SyncBanner as a first-class UI element, and background prefetch as a default behavior. + +TAP is solving one of the most important problems in Indian public education. I would love the opportunity to contribute to making it work at scale. + +Thank you for your time and consideration. + +*Noaman Akhtar - akhtarnoaman@gmail.com - [github.com/Noaman-Akhtar](https://github.com/Noaman-Akhtar)* diff --git a/tap-buddy-proposal/README.md b/tap-buddy-proposal/README.md new file mode 100644 index 0000000..2cf1d9a --- /dev/null +++ b/tap-buddy-proposal/README.md @@ -0,0 +1,54 @@ +# TAP Buddy - Native GovTech Learning App + +**Issue:** [#1 - Native GovTech Learning App for Public Education Systems](https://github.com/theapprenticeproject/C4GT_2026/issues/1) + +**Contributor:** Noaman Akhtar ([@Noaman-Akhtar](https://github.com/Noaman-Akhtar)) + +**Proposal Doc:** https://docs.google.com/document/d/1sD8qle5rOl09TcZebYINfF7RzrDnVDyA6ZPF1S_J3qU/edit?usp=sharing + +**Demo Video:** https://youtube.com/shorts/N9L6miAYUg0?si=h__TMux4Pchlx1Kb + +**Prototype Repository:** https://github.com/Noaman-Akhtar/Tap-buddy + +--- + +## Overview + +A native Android application for TAP Buddy - an AI-powered learning platform by The Apprentice Project. The prototype establishes the full app scaffold, navigation architecture, reusable component library, and state management patterns that the production app will build on. + +## What is Built + +| Screen | Description | +| :--- | :--- | +| Onboarding | 3-slide animated carousel with Skip/Next/Get Started | +| Login | Phone number input with simulated Frappe auth point | +| Home | Personalized greeting, streak badge, progress bars, course grid | +| Learn | Unit list with filter pills, rigor badges, per-unit progress | +| Chat | AI Tutor with message bubbles, typing indicator, keyboard-aware input | +| Progress | Stats grid, per-course breakdown, achievements carousel | +| Profile | User info, settings menu, notification toggle, logout | + +## Tech Stack + +| Component | Tool | +| :--- | :--- | +| Framework | React Native (Expo SDK 53) | +| Navigation | expo-router (file-based) | +| State | Zustand | +| Local DB | expo-sqlite | +| Connectivity | @react-native-community/netinfo | +| Styling | React Native StyleSheet + NativeWind | + +## How to Run + +```bash +git clone https://github.com/Noaman-Akhtar/Tap-buddy.git +cd Tap-buddy/tap-buddy-mvp +npm install +npx expo start --clear +# Scan QR in Expo Go on Android +``` + +## See Also + +- [Full Proposal](./PROPOSAL.md)