TODO (Maybe or Maybe NOT)
- Likes/Dislikes: Add the ability for users to like or dislike courses, and display total likes/dislikes on course cards and course pages.
- Views: Track and display view counts for lessons and courses so popular content can be surfaced.
- Payments: Integrate a payment gateway (e.g., Stripe) to support subscriptions and one-time course purchases; include webhook handling for fulfillment.
- OAuth: Add OAuth providers (Google, GitHub) for one-click sign-in and easier onboarding.
- Notes Editor: Add a Monaco-based notes editor (per-lesson, persisted per-user) for personal notes and scratchpad functionality.
This Next.js (secure) and Xano Powered Application is your ultimate Learning and Skill Improving Platform. You can create content and distribute content as well as consume other people's helpful content. Track and Level Up.
The entire backend β database, auth, business logic, external integrations β runs on Xano. No separate Node.js/Python server needed.
π API Documentation (Swagger)
| Capability | How Xano Powers It |
|---|---|
| Database | PostgreSQL tables for users, courses, modules, lessons, progress |
| Auth | Built-in JWT authentication with role-based access |
| API Builder | Visual no-code endpoints with XanoScript logic |
| MUX Integration | External API calls for video upload & signed playback |
| Scalability | Production-ready infrastructure, zero DevOps |
Xano replaced what would typically be an entire backend codebase. All API logic lives in Xano's visual builder.
| Layer | Technology |
|---|---|
| Backend & Database | Xano |
| Frontend | Next.js 16, React 19, Tailwind CSS 4 |
| AI | Google Gemini 2.5 Flash |
| Video | MUX (streaming + direct uploads) |
git clone https://github.com/ARYPROGRAMMER/simply-learn.git
cd simply-learn
pnpm install
cp .env.example .env.local
pnpm devNEXT_PUBLIC_XANO_API_URL=https://your-instance.xano.io/api:CPmqNnhk
GOOGLE_GENERATIVE_AI_API_KEY=your-gemini-keyUse these test accounts to explore the app quickly (no sign-up required on some demo instances):
- Student:
student@gmail.com/Student@123 - Teacher:
teacher@gmail.com/Teacher@123
| Table | Fields |
|---|---|
users |
id, created_at, email, password, first_name, last_name, tier (enum), avatar_url, role (enum), updated_at |
categories |
id, created_at, title, slug |
courses |
id, created_at, title, slug, description, image_url, tier (enum), featured (bool), category (integer), teacher (integer), module_count (integer), lesson_count (integer), updated_at |
modules |
id, created_at, title, order_index (integer), course (integer) |
lessons |
id, created_at, title, slug, description, content, order_index (integer), mux_playback_id, duration (integer), module (integer) |
user_progress |
id, created_at, completed (bool), completed_at, user (integer), lesson (integer) |
π Full Documentation: Swagger
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/auth/signup |
POST | No | Register / create account |
/auth/login |
POST | No | Login / obtain auth token |
/auth/me |
GET | Yes | Get current authenticated user profile |
/auth/profile |
PATCH | Yes | Update authenticated user's profile |
/auth/upgrade-tier |
POST | Yes | Upgrade user's subscription tier |
/courses |
GET | No | List all courses (with modules/lessons) |
/courses/featured |
GET | No | Get featured courses |
/courses/{slug} |
GET | No | Get course by slug (includes modules) |
/lessons/{slug} |
GET | No | Get lesson by slug (full content) |
/progress/complete-lesson |
POST | Yes | Mark a lesson completed for current user |
/search |
GET | No | Search courses and lessons |
/mux/sign_playback |
POST | Yes | Generate signed tokens for MUX playback |
The frontend enforces input size limits, but these should also be validated server-side in Xano. Add matching precondition checks in your Xano endpoints (visual builder) using the limits below:
title: max 200 charactersslug: max 120 charactersdescription: max 4000 characterscontent: max 20000 charactersfirst_name/last_name: max 100 charactersavatar_url: max 2048 characters
Also ensure your middleware blocks extremely long URL paths (we added a guard in proxy.ts).
| /mux/upload-url | POST | Yes | Generate direct upload URL for teachers |
| /mux/get_asset | GET | Yes | Get Mux asset details by asset id |
| /mux/get_upload | GET | Yes | Check Mux upload status |
| /teacher/courses | GET | Teacher | Get teacher's courses |
| /teacher/courses | POST | Teacher | Create a new course |
| /teacher/courses/{course_id} | GET | Teacher | Get single teacher course (with modules) |
| /teacher/modules | POST | Teacher | Create module for a course |
| /teacher/lessons | POST | Teacher | Create lesson for a module |
See xanoscript/ for endpoint implementations.
Students: Browse courses, watch videos, track progress, AI tutor chat (Ultra tier)
Teachers: Create courses, manage modules/lessons, upload videos via MUX
Tiers: Free, Pro, Ultra subscription levels
app/
βββ (app)/ # Dashboard, courses, lessons, teacher portal
βββ auth/ # Login/signup
βββ api/chat/ # AI tutor endpoint
components/ # React components
lib/xano/ # Xano client & auth
xanoscript/ # Xano endpoint logic (20 endpoints)
- Create workspace at xano.com
- Create tables (schema above)
- Add endpoints from
xanoscript/folder - Set environment variables:
MUX_TOKEN_ID,MUX_TOKEN_SECRET
MIT License Β© 2025 Arya Pratap Singh
Built with Love and Speed, Thanks to Xano




















