Short-form educational videos with mandatory quizzes. Earn points, unlock badges, and actually learn something.
- ๐น Short Learning Videos - 2-5 minute skill-based content created by students
- ๐ง Mandatory Quizzes - Every video ends with a quiz to lock in learning
- ๐ Gamification - Earn points, unlock badges, and level up your skills
- ๐ฌ Creator Mode - Upload MP4 videos or YouTube links with auto-thumbnail generation
- ๐ Progress Tracking - Monitor your learning journey and skill development
- ๐ฌ Engagement - Like/dislike videos and comment on content
- ๐ Secure Authentication - Powered by Clerk with Supabase sync
- ๐จ Beautiful UI - Built with shadcn/ui and Tailwind CSS
- Frontend: React 18 + TypeScript + Vite
- UI Components: shadcn/ui + Tailwind CSS
- Authentication: Clerk
- Database: Supabase (PostgreSQL)
- State Management: TanStack React Query
- Routing: React Router v6
- Styling: Tailwind CSS with custom design tokens
- Node.js 18+ and npm
- Clerk account (Get started)
- Supabase account (Get started)
git clone <your-repo-url>
cd SkillUp
npm installCopy the example environment file:
cp .env.example .envEdit .env with your credentials:
# Clerk Configuration
VITE_CLERK_PUBLISHABLE_KEY=pk_test_your_key_here
# Supabase Configuration
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your_anon_key_hereGet your keys:
- Clerk: Dashboard โ API Keys โ Publishable Key
- Supabase: Project Settings โ API โ Project URL & anon/public key
Run migrations in your Supabase SQL Editor (or via CLI):
# Apply all migrations in order
supabase db execute -f supabase/migrations/000_initial_schema.sql
supabase db execute -f supabase/migrations/001_video_validation.sql
supabase db execute -f supabase/migrations/002_quiz_enforcement.sql
supabase db execute -f supabase/migrations/003_progress_enforcement.sql
supabase db execute -f supabase/migrations/004_feature_flags_rls.sql
supabase db execute -f supabase/migrations/005_video_feedback.sql
supabase db execute -f supabase/migrations/006_creator_delete_policies.sql
supabase db execute -f supabase/migrations/007_delete_video_function.sql
supabase db execute -f supabase/migrations/008_fix_delete_policy.sql
supabase db execute -f supabase/migrations/009_feedback_policies.sqlOr paste each .sql file manually into Supabase Dashboard โ SQL Editor.
Create two public storage buckets in Supabase Dashboard โ Storage:
- videos - for MP4 uploads
- thumbnails - for thumbnail images
Enable public access for both buckets.
npm run devVisit http://localhost:5173
- Sign up/Login with Clerk (Google, email, etc.)
- Browse videos by category or search
- Watch a short skill video (2-5 minutes)
- Complete the quiz to earn points
- Track progress on your Dashboard
- Unlock badges as you level up
- Go to /upload
- Choose MP4 upload or YouTube link
- Add title, description, category
- Upload a thumbnail or let auto-generation handle it
- Create 1-3 quiz questions
- Hit Publish - videos go live instantly
- Manage your uploads in /progress
SkillUp/
โโโ src/
โ โโโ components/ # Reusable UI components
โ โโโ pages/ # Route pages (Home, Browse, Upload, etc.)
โ โโโ services/ # API calls (videos, users, badges, progress)
โ โโโ hooks/ # Custom React hooks
โ โโโ lib/ # Utilities (Supabase client, utils)
โ โโโ types/ # TypeScript type definitions
โโโ supabase/
โ โโโ migrations/ # Database schema and RLS policies
โโโ public/ # Static assets (logo, favicon)
โโโ docs/ # Additional documentation
- User signs in via Clerk (OAuth or email)
- Frontend calls
syncUserFromClerk()automatically - User record created/synced in Supabase users table
- User can now upload videos, take quizzes, earn points
See docs/CLERK_SUPABASE_SYNC.md for details.
- MP4 uploads: Captures a frame at 10% mark, uploads to Supabase Storage
- YouTube links: Fetches default YouTube thumbnail
- Fallback: Uses stock placeholder image
- Creators can delete their own videos from Dashboard
- RPC function with
SECURITY DEFINERbypasses RLS safely - Cleans up quiz questions, reactions, comments, and storage files
- Like/dislike with counts
- Comment section with user avatars
- RLS policies allow anon key usage while validating ownership
npm run dev # Start development server
npm run build # Production build
npm run preview # Preview production build
npm run lint # Run ESLint- Create
supabase/migrations/XXX_description.sql - Apply:
supabase db execute -f supabase/migrations/XXX_description.sql - Commit the migration file
- Solution: Apply migrations 006, 007, 008 for RLS delete policies and RPC function
- Solution: Apply migration 009 for feedback RLS policies
- Check:
.envhas correctVITE_SUPABASE_URLandVITE_SUPABASE_ANON_KEY - Check: Migrations applied and storage buckets created
- Check:
VITE_CLERK_PUBLISHABLE_KEYin.env - Check: Restart dev server after updating
.env
- Clerk-Supabase Sync Guide
- Backend API Reference
- Upload Auth Fix
- Implementation Summary
- Quick Start Guide
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
This project is open source and available under the MIT License.
- shadcn/ui for beautiful components
- Clerk for seamless authentication
- Supabase for powerful backend infrastructure
- TanStack Query for data fetching excellence
Built with โค๏ธ for learners who want to actually learn something instead of endlessly scrolling.