All projects
Mobile app

GrowSmart

A training authority’s courses, moved off scattered links into a real, trackable product — with certificates people can verify.

GrowSmart — screenshot
Client
Education / training authority
Role
Full-stack mobile developer, solo
Platform
iOS + Android + web, one codebase
Scope
Student app + in-app admin panel
Status
v1.0.2 · production ready, store packs prepared
// overview

Small training institutes and course authorities usually have no learning platform of their own — they run on WhatsApp groups, shared drives and video links. The result is no progress tracking, no assessment, no proof of completion, and no secure access control on paid content.

GrowSmart replaces all of that. Built with React Native and Expo for iOS, Android and web from a single TypeScript codebase, it gives students a structured path: browse published courses, enroll instantly in free ones or pay through Stripe Checkout for premium tracks, work through text and video lessons, and validate their understanding with auto-graded quizzes.

Progress is tracked lesson by lesson, and once a course is completed the app issues a certificate with a unique verification ID that learners can preview, export as a PDF, and share straight from their phone.

Behind the app sits Supabase and PostgreSQL, where access control is enforced at the database layer through 48 row-level security policies — paid lesson content simply is not readable by users who have not been enrolled through a verified payment. The same app ships a full admin panel, so the client runs the platform day to day without developer involvement.

Scale
11.5k+
Lines of TypeScript & SQL
27
App screens
11
Database tables
48
Row-level security policies
2
Edge functions
3
Platforms from one codebase
// what it does

Key features

Learning

  • Browse published courses with search and free/paid badges
  • One-tap enrollment for free courses; Stripe Checkout for paid ones
  • Text and video lessons with attached downloadable files
  • Lesson-by-lesson progress tracking with a completion percentage

Assessment & certificates

  • Multiple-choice quizzes, auto-scored with a configurable passing score
  • Per-question answer storage, attempt history and best score
  • Certificates auto-issued on completion with a unique verification ID
  • In-app preview, PDF export and native share sheet

Student experience

  • Dashboard with live stats — enrolled courses, lessons completed, quizzes passed, certificates earned
  • Continue-learning shortcuts
  • Profile with account details, avatar and theme toggle
  • Full light/dark theming, system-aware and persisted

Admin panel (in-app)

  • Create, edit, publish and price courses; upload thumbnails from the gallery
  • Add text or video lessons, control order, attach documents via document picker
  • Quiz builder — questions, options, correct answers and passing score
  • User management and full Stripe payment tracking

Auth & access

  • Email/password signup and login with email verification
  • Forgot-password and reset over a growsmart:// deep link
  • Role-based routing — one app, separate student and admin route groups
  • Admin-only screens backed by admin-only database policies

Data model

  • 11 tables including courses, lessons, quizzes, attempts, progress, certificates and payments
  • 48 row-level security policies
  • Indexed foreign keys, updated_at triggers and cascading deletes
  • An auth trigger that auto-creates a profile on signup
// engineering

The hard parts

The problems that shaped the architecture, and how each one was solved.

01

Paid content that cannot be bypassed

Client-side "isEnrolled" checks are trivial to fake. Enrollment and payment verification happen server-side through an edge function and a Stripe webhook, and content access is enforced in RLS policies — so even a modified client cannot read paid lessons.

02

PDF certificates without a rendering backend

The certificate is generated from a styled HTML template and converted to a PDF on-device with expo-print — no server rendering cost, and it shares straight through the native share sheet.

03

Perceived performance

Every screen was running its own query, which made navigation feel slow. A centralised DataCacheContext bulk-fetches courses, lessons, enrollments, quizzes, attempts, certificates and payments at boot, then selectively refreshes after mutations — so screens open instantly and pull-to-refresh syncs the cache.

04

One codebase, two products

The student and admin experiences are built from separate route groups over a shared design system, with protected route guards keyed to the user’s role — so there is no second app to maintain.

05

Deep-link auth flows

Password reset and email verification links are handled inside the app through a custom growsmart:// scheme plus an Expo Linking callback route.

// stack

Built with

Frontend

React Native 0.81React 19Expo SDK 54Expo Router 6 (typed routes)TypeScript 5.9 (strict)react-native-web

UI & motion

React Navigation 7Reanimated 4Gesture HandlerLucide React NativeLight/dark theming with shadow tokens

Backend & data

Supabase PostgreSQLSupabase AuthSupabase Storage48 RLS policiesDeno Edge Functions7 versioned migrations

Payments

Stripe CheckoutStripe Webhookscheckout.session.completed / expired handling

Native modules

expo-print (PDF)expo-sharingexpo-image-pickerexpo-document-pickerreact-native-webviewexpo-web-browserexpo-linking

Delivery

EAS BuildSupabase CLI migrationsESLint + PrettierStrict typecheck
// screens

Inside the app

Tap any screenshot to open it full size.

The course catalog, a completed course with its certificate, and the quiz engine.
The catalog, with free and paid badges and enrollment state shown per course.
A completed course: progress bar, earned certificate with its verification ID, quizzes and lessons.
The generated certificate — rendered from an HTML template and exported to PDF on-device, with a unique ID and verification QR code.
A video lesson played through a WebView, with mark-as-complete progress tracking.
A text lesson with an attached document, viewable or downloadable in place.
Each quiz declares its question count, passing score and the learner’s attempts so far.
Auto-graded multiple choice, with every answer stored per question.
Free courses enroll in a single tap — no checkout step.
Available for hire

Ready to bring your
idea to life?

Let's discuss your project and build something exceptional together. Get in touch via Fiverr, WhatsApp, or send me a message.

> haseeb_

Full Stack Developer specializing in MERN, React Native, Supabase & Firebase. Turning ideas into production-ready applications.

Quick Links

Connect

© 2026 Haseeb Ansari. All rights reserved.

Built with React + TypeScript