RORK LABJP
TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the roundTOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Articles/Dev Tools
Dev Tools/2026-03-19Advanced

Building a Full-Featured EdTech Learning App with Rork Max: Courses, Progress Tracking & Stripe Monetization

An advanced guide to building a production-ready EdTech app with Rork Max. Covers Supabase for course & progress management, Stripe for paywalls, offline downloads, and App Store publishing.

Rork Max229EdTech2Learning AppSupabase33Stripe17iOS109Course ManagementProgress TrackingIndie Dev36App Development33

Why Build an EdTech App?

The global EdTech market is projected to surpass $600 billion in 2026, driven by demand for skills-based learning in programming, languages, design, and professional development. Learning apps benefit from high retention rates, strong subscription economics, and a clear value proposition — users pay because they want to improve.

In this advanced guide, you'll build a fully functional EdTech app using Rork Max — Rork's native Swift builder. We'll cover a Supabase backend for course and progress data, a Stripe-powered content paywall, offline video downloads, and AI-driven personalization. By the end, you'll have a production-ready architecture you can launch on the App Store.

What you'll build:

  • Email + Apple Sign In authentication
  • Course catalog with category filtering
  • Lesson screens supporting video, text, and quiz formats
  • Per-lesson progress tracking with overall completion percentage
  • Stripe subscription + one-time purchase paywall
  • Offline video downloads with cache management
  • Push notification reminders for daily learning streaks

Who this is for: Developers comfortable with Rork basics who want to tackle a complete, production-grade implementation. Familiarity with Supabase and Stripe concepts is assumed.


Prerequisites and Setup

Required Accounts and Plans

  • Rork Max Plan ($200/month): Required for native Swift generation, AVKit integration, and all Apple platform APIs
  • Supabase Account (free tier available): Database, auth, real-time, and storage
  • Stripe Account (test mode): Checkout sessions and webhooks
  • Apple Developer Program ($99/year): Required for App Store distribution

Architecture at a Glance

Frontend:    Rork Max (native SwiftUI / Swift)
Backend:     Supabase (PostgreSQL + Edge Functions)
Auth:        Supabase Auth (Email + Apple Sign In)
Payments:    Stripe (Subscriptions + one-time purchases)
Media:       Supabase Storage (videos, thumbnails)
Push:        APNs via Supabase

Because Rork Max generates native Swift — not React Native — you get direct access to AVKit, CoreData/SwiftData, Swift Charts, Core ML, and every other Apple framework. This makes EdTech apps with rich video and offline features significantly more capable than what you could build with a standard React Native approach.


Data Model Design

Define your Supabase schema before prompting Rork Max. A clear data model leads to much better AI-generated code:

-- Courses
CREATE TABLE courses (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  title TEXT NOT NULL,
  description TEXT,
  thumbnail_url TEXT,
  category TEXT NOT NULL,
  level TEXT CHECK (level IN ('beginner', 'intermediate', 'advanced')),
  price_type TEXT CHECK (price_type IN ('free', 'subscription', 'one_time')),
  stripe_price_id TEXT,
  created_at TIMESTAMPTZ DEFAULT NOW()
);
 
-- Lessons
CREATE TABLE lessons (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  course_id UUID REFERENCES courses(id) ON DELETE CASCADE,
  title TEXT NOT NULL,
  content_type TEXT CHECK (content_type IN ('video', 'text', 'quiz')),
  content_url TEXT,
  duration_seconds INTEGER,
  order_index INTEGER NOT NULL,
  is_preview BOOLEAN DEFAULT FALSE
);
 
-- User progress
CREATE TABLE user_progress (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
  lesson_id UUID REFERENCES lessons(id) ON DELETE CASCADE,
  course_id UUID REFERENCES courses(id) ON DELETE CASCADE,
  completed BOOLEAN DEFAULT FALSE,
  progress_seconds INTEGER DEFAULT 0,
  completed_at TIMESTAMPTZ,
  UNIQUE(user_id, lesson_id)
);
 
-- Access control (purchased / subscribed courses)
CREATE TABLE user_course_access (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
  course_id UUID REFERENCES courses(id) ON DELETE CASCADE,
  access_type TEXT CHECK (access_type IN ('free', 'subscription', 'purchased')),
  stripe_subscription_id TEXT,
  expires_at TIMESTAMPTZ,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

Enable Row Level Security on all tables:

ALTER TABLE user_progress ENABLE ROW LEVEL SECURITY;
CREATE POLICY "progress_self_only" ON user_progress
  FOR ALL USING (auth.uid() = user_id);
 
ALTER TABLE user_course_access ENABLE ROW LEVEL SECURITY;
CREATE POLICY "access_self_only" ON user_course_access
  FOR SELECT USING (auth.uid() = user_id);

For detailed auth configuration with Supabase, see the Firebase & Supabase Auth Guide.


Step-by-Step Implementation

Step 1: Course Catalog Screen

Prompt Rork Max with this instruction:

Build a course catalog screen.

Layout:
- 2-column LazyVGrid with vertical scroll
- Each course card shows: thumbnail (AsyncImage), title, category badge,
  level indicator, lesson count, and price type badge (Free / Paid)
- Category filter bar at the top (All / Programming / Languages / Design / Business)
- Skeleton loading state while fetching from Supabase
- Tap on a course navigates to the course detail screen

Data source: Supabase "courses" table
Columns: id, title, description, thumbnail_url, category, level, price_type

Rork Max will generate a LazyVGrid, AsyncImage integration, @State filtering, and skeleton shimmer animations automatically.

Step 2: Lesson Player Screen

Build a course detail and lesson player screen.

Structure:
1. Header: full-bleed thumbnail with gradient overlay, title, description,
   circular progress indicator showing overall completion %
2. Lesson list: grouped by section, each row shows title, duration, content
   type icon, and a checkmark when completed
3. Access gate: query user_course_access — if the user lacks access, show a
   lock icon on paid lessons and trigger a paywall bottom sheet on tap
4. Video player (AVKit): tap a video lesson to open fullscreen AVPlayer,
   auto-save playback position to user_progress.progress_seconds every 30s
5. Text lesson: ScrollView with Markdown rendering
6. Quiz lesson: multiple-choice with animated correct/incorrect feedback

On lesson completion: set user_progress.completed = true, then recalculate
and refresh the course completion percentage using Supabase Realtime

The native AVKit integration — with automatic position saving — is only possible because Rork Max generates native Swift. This level of polish is a meaningful competitive advantage over hybrid approaches.

Step 3: Stripe Paywall Integration

First, deploy a Supabase Edge Function to create Stripe Checkout sessions:

// supabase/functions/create-checkout/index.ts
import Stripe from "https://esm.sh/stripe@14.0.0";
 
const stripe = new Stripe(Deno.env.get("STRIPE_SECRET_KEY")!, {
  apiVersion: "2024-06-20",
});
 
Deno.serve(async (req) => {
  const { courseId, priceId, userId, accessType } = await req.json();
 
  const session = await stripe.checkout.sessions.create({
    mode: accessType === "subscription" ? "subscription" : "payment",
    line_items: [{ price: priceId, quantity: 1 }],
    success_url: `rorklab://purchase-success?courseId=${courseId}&sessionId={CHECKOUT_SESSION_ID}`,
    cancel_url: `rorklab://purchase-cancel`,
    metadata: { courseId, userId, accessType },
    client_reference_id: userId,
  });
 
  return new Response(JSON.stringify({ url: session.url }), {
    headers: { "Content-Type": "application/json" },
  });
});

Then prompt Rork Max to build the paywall UI:

Build a paywall bottom sheet that appears when a user taps a locked lesson.

Content:
- Course name and key selling points (3 bullet points)
- Two purchase options:
    Option A: Monthly subscription — $9.99/mo (access all courses)
    Option B: One-time purchase — $49.99 (this course only)
- On purchase tap: call Supabase Edge Function "create-checkout" to get a
  Stripe Checkout URL, then open it in SafariViewController
- Handle deep link "rorklab://purchase-success": write to user_course_access
  table and reload the lesson screen with full access unlocked
- Show Apple Pay button via Stripe PaymentSheet as an alternative
- Include subscription terms and cancellation instructions below the CTA

For a deeper dive on Stripe subscription setup, see the Rork Max Stripe Subscription Guide.

Step 4: Learning Dashboard and Streaks

Prompt Rork Max to build the home dashboard:

Build a home dashboard screen with learning analytics.

Sections:
1. Daily goal progress: target minutes vs today's actual study time (donut chart)
2. Learning streak: consecutive days shown as a compact calendar grid,
   calculated via Supabase RPC (not client-side)
3. In-progress courses: up to 3 courses with progress bars
4. Recommended courses: category-based suggestions
5. Weekly activity chart: bar chart of last 7 days' study time using Swift Charts

Data: aggregate user_progress for today's sessions; use a Supabase RPC function
to compute the streak server-side so it's consistent across devices

For state management patterns that keep this dashboard performant, see the Rork Max State Management Guide.


Advanced Patterns

Offline Video Downloads

Add offline download support for video lessons.

Requirements:
- "Download" button on each video lesson row
- On tap: fetch a signed URL from Supabase Storage and download with URLSession
- Show download progress with a circular progress indicator
- Save the file to the app's Documents directory using FileManager
- On app launch: check Documents for cached files; play locally if available
- Track downloaded lessons in SwiftData (DownloadedLesson entity)
- Settings screen section showing storage used with a "Delete All Downloads" option

For the full offline-first architecture pattern, refer to the Offline-First Architecture Guide.

On-Device AI Recommendations (Core ML)

Add a personalized recommendation engine.

Implementation:
- Use Create ML to train a recommendation model on course completion data
- Embed the .mlmodel in the app bundle
- "For You" section on the dashboard uses on-device inference to rank courses
- Fallback to category-based rules if model is unavailable
- Add a Privacy settings toggle: "Use my learning history for recommendations"

All inference runs on-device — no user data leaves the phone.

Troubleshooting

RLS blocking queries: Verify the authenticated user's JWT is being sent in the Supabase client request headers. Unauthenticated requests return 0 rows when RLS is enabled, which can look like an empty table.

Stripe webhooks not arriving: Set the Stripe Dashboard webhook endpoint to your Supabase Edge Function URL (https://<project-ref>.supabase.co/functions/v1/stripe-webhook). Always verify the Stripe-Signature header to prevent spoofed events.

AVPlayer not playing Supabase Storage URLs: Supabase Storage buckets are private by default. Generate a signed URL server-side (via Edge Function) with a short expiry (1 hour), and pass that to AVPlayer rather than the raw storage URL.

Push notifications not delivering: APNs tokens must be refreshed on every app launch and sent to Supabase. Test only on physical devices — simulators cannot receive push notifications.


App Store Submission Tips

Free preview is essential. App Store guidelines prohibit paywalling an app before users experience its core value. Set is_preview = true for the first 2–3 lessons of every course. Users who see value before hitting a paywall convert at dramatically higher rates than those who encounter it immediately.

Subscription disclosure. Any subscription must clearly display the price, billing frequency, and cancellation instructions on the paywall screen. Include this text in your Rork Max prompt: "Add a disclosure text below the CTA explaining the subscription price, auto-renewal, and how to cancel."

Age-appropriate content. If your courses target minors, you'll need to comply with COPPA (US), GDPR-K (EU), and similar regulations. Set the appropriate age rating in App Store Connect and avoid collecting personally identifiable information from under-13 users.


Monetization Strategy

ModelBest ForMonthly Revenue Predictability
Monthly subscriptionContent-heavy platforms with ongoing updatesHigh (MRR)
Annual subscriptionUsers committed to long-term learning goalsHigh (reduces churn)
One-time purchaseSingle-topic courses, exam prepLow (requires constant acquisition)
Freemium + upsellBuilding an audience firstMedium

The most effective EdTech monetization combines freemium acquisition (a few free lessons) with a monthly subscription for full access. This keeps acquisition costs low while building predictable recurring revenue.


Push Notification Strategy for Retention

One of the biggest challenges in EdTech is keeping users engaged after the initial excitement fades. Push notifications, implemented thoughtfully, are one of the highest-ROI retention tools available.

Prompt Rork Max to add a streak reminder system:

Add daily learning reminder push notifications.

Implementation:
- On first app launch, request push notification permission
- Register device token with Supabase (store in a user_push_tokens table)
- User selects their preferred reminder time in Settings (default: 7:00 PM)
- Supabase Edge Function runs daily via cron: check users who haven't
  completed a lesson today, send APNs push via Apple's HTTP/2 API
- Notification copy: "Day [N] streak — keep it going! 🔥 5 minutes is enough."
- Deep link the notification to the user's in-progress course
- If the user completes a lesson, cancel that day's pending reminder

For retention, the single most important metric is the Day 7 retention rate — the percentage of users who return on day 7 after first use. Industry benchmarks for EdTech apps hover around 20–30%. A well-tuned streak system combined with email drip campaigns can push this to 40%+.

Analytics and Iteration

After launch, instrument key events to understand where users are dropping off:

Add analytics event tracking throughout the app.

Track these events:
- course_viewed (courseId, source: catalog/search/recommendation)
- lesson_started (lessonId, courseId, contentType)
- lesson_completed (lessonId, courseId, durationSeconds)
- paywall_shown (courseId, priceType)
- purchase_started (courseId, priceId, accessType)
- purchase_completed (courseId, revenue)
- download_started (lessonId, fileSizeMB)

Use a lightweight analytics client that batches events and sends to
a Supabase table "analytics_events" with columns:
  user_id, event_name, properties (JSONB), created_at

This keeps all data first-party — no third-party SDK required.

With this data, you can calculate your funnel: catalog view → course detail → paywall → purchase. Most apps lose 80% of users between catalog and paywall. Test different thumbnail images, pricing, and preview lesson selection to improve conversion.


Next Steps

You now have a complete blueprint for a production-grade EdTech app built with Rork Max. The combination of native Swift performance, Supabase's real-time backend, and Stripe's battle-tested payments gives you infrastructure that can scale from your first 10 users to your first 10,000.

The most effective way to use this guide is to start narrow: pick one course topic, implement the MVP without the advanced features (skip offline downloads and Core ML recommendations for v1), launch it, and let real user behavior guide your next iteration. Rork Max makes it fast enough to ship a v2 within weeks of your initial launch.

EdTech success is less about technology and more about niche selection and content quality. Pick a specific, underserved audience — a particular certification, skill level, or learning style — and build something exceptionally useful for them. Rork Max handles the engineering; your competitive advantage comes from understanding your learners.

Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

Dev Tools2026-04-12
to Building Marketplace App Payments with Rork and Stripe Connect
A comprehensive guide to integrating Stripe Connect into a Rork-built marketplace app. Covers seller account onboarding, destination charges, platform fee distribution, Webhook handling, and launch compliance.
Dev Tools2026-04-01
Building a B2B SaaS App with Rork: Multi-Tenant Architecture, RBAC, and Stripe Organization Billing
A complete guide to building production-grade B2B SaaS apps with Rork. Learn multi-tenant architecture, role-based access control (RBAC), organization-level Stripe billing, and invitation flows with real code examples.
Dev Tools2026-03-17
Build a Full E-Commerce App with Rork Max: Supabase + Stripe + Push Notifications
A step-by-step guide to building a production-grade e-commerce app with Rork Max, Supabase, and Stripe—complete with real-time inventory, checkout, and push notifications.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →