ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
The leading online learning platform. Learn new skills, advance your career, and explore new hobbies with expert-led courses.
EducationTypeScript · CSSGitHub @alfredangOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Learnify: self-paced multi-tenant LMS (IESA spec) on Next.js 16, Prisma and PostgreSQL 17. Stripe payments with an immutable revenue ledger, auto-issued certificates, AI authoring on OpenAI gpt-6.1-sol with DeepSeek fallback, and a SCORM Studio that turns lecture videos into validated SCORM 1.2 packages. Docker on Coolify.
Taken from the repository README
Loading the full README.
Read the full README ↗An international, scalable, self-learning LMS built for academies, course developers, and learners.
Live Site · Report Bug · Request Feature
Live at learnify.tertiaryinfotech.com.
IESA LMS is a multi-tenant, self-paced Learning Management System built on Next.js 16. Forked from Learnify (Udemy-clone) and reshaped end-to-end against the IESA LMS product specification, it delivers a production-grade platform for academies to publish, sell, and certify online courses.
gpt-6.1-sol with automatic DeepSeek V4.1 Flash fallback (outlines, objectives, quizzes, voice-over text, metadata)| Category | Technology |
|---|---|
| Framework | Next.js 16 (App Router, Server Components, Server Actions, Turbopack) |
| Language | TypeScript (strict mode) |
| Database | PostgreSQL 17 (Coolify-managed container) via Prisma 5 ORM |
| Auth | NextAuth.js v5 (JWT, email+password for learners, OAuth for staff) |
| Payments | Stripe (Checkout Sessions, Connect, Webhooks) |
| Media | Cloudinary (signed uploads, video transcoding, CDN) or local disk under STORAGE_DIR, served by /uploads/[...path] |
| AI | OpenAI gpt-6.1-sol (primary) with DeepSeek V4.1 Flash automatic fallback — plain fetch adapters in src/lib/ai/providers.ts, no vendor SDK |
| Resend (invoices, access reminders) | |
| UI | Tailwind CSS 4 + shadcn/ui (Radix primitives) |
| Forms | React Hook Form + Zod validation |
| Data Fetching | TanStack React Query |
| State | Zustand |
| Rich Text | TipTap |
| Drag & Drop | dnd-kit |
| Charts | Recharts |
| Icons | Lucide React |
| Deploy | Docker (Next.js standalone, Node 22) on a Hostinger VPS managed by Coolify; Traefik + Let's Encrypt TLS |
┌──────────────────────────────────────────────────────────────────┐
│ Frontend │
│ Next.js 16 App Router · React 19 · Tailwind + shadcn/ui │
│ Server Components (default) · Client Components (opt-in) │
└──────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────────────┐
│ Backend │
│ API Routes (REST) · Server Actions · NextAuth v5 (JWT) │
│ Stripe Webhooks · Cron Jobs · xAPI LRS · AI Assist │
└──────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────────────┐
│ Data Layer │
│ PostgreSQL (Prisma ORM) · Cloudinary (Media) · Stripe │
│ Immutable Ledger · Audit Log · Feature Flags │
└──────────────────────────────────────────────────────────────────┘
src/
├── app/ # Next.js App Router
│ ├── (auth)/ # Login, register, password reset
│ ├── (browse)/ # Public catalogue, course detail, search
│ ├── (learner)/ # Learner dashboard & pages
│ ├── (instructor)/ # Course Developer editor, dashboard, SCORM Studio
│ ├── (academy)/ # Academy Admin tenant area
│ ├── (marketer)/ # Marketer dashboard
│ ├── (platform)/ # Platform Owner / Support dashboards
│ ├── api/ # 50+ REST endpoints, cron, webhooks, AI, xAPI, SCORM jobs
│ ├── actions/ # Server Actions
│ ├── checkout/ # Stripe checkout pages
│ ├── uploads/[...path]/ # Serves STORAGE_DIR files (HTTP Range support)
│ └── verify/ # Public certificate verification
├── components/ # UI components
│ ├── auth/ # Login/register forms
│ ├── courses/ # Editors, players, quiz builders
│ ├── layout/ # Header, footer, sidebars
│ ├── shared/ # AI assist, audit logs, reusable
│ └── ui/ # 22 shadcn/ui components
├── lib/ # Domain logic (33 modules)
│ ├── ai/ # AI Assist orchestration (OpenAI → DeepSeek)
│ │ ├── providers.ts # Plain fetch adapters: OpenAI Responses API, DeepSeek
│ │ └── harness/ # Traced agent runner + SCORM video agent
│ ├── scorm/ # SCORM 1.2 manifest, SCO template, validator, ZIP
│ ├── storage.ts # Local file storage (STORAGE_DIR) when Cloudinary is absent
│ ├── validations/ # Zod schemas
│ ├── ledger.ts # Double-entry ledger (spec §16)
│ ├── certification.ts # Cert eligibility engine (spec §12-13)
│ ├── access.ts # 90-day access enforcement
│ ├── tax.ts # Jurisdiction-aware tax calc
│ └── audit.ts # Append-only audit logging
├── i18n/messages/ # EN, ZH, MS translations
├── providers/ # Auth, React Query providers
└── types/ # TypeScript type definitions
prisma/
├── schema.prisma # 30+ models, 13 enums (1,289 lines)
├── seed.ts # Dev seed data
└── migrations/ # Database migrations
docs/ # 20 markdown docs (MkDocs)
scripts/ # 20 migration/verification utilities
Dockerfile # Node 22 standalone image (Coolify Dockerfile build pack)
docker-entrypoint.sh # Runs `prisma migrate deploy`, then starts server.js
# 1. Clone the repository
git clone https://github.com/alfredang/ai-learnify.git
cd ai-learnify
# 2. Install dependencies (postinstall runs prisma generate)
npm install
# 3. Configure environment
cp .env.example .env
# Fill in DATABASE_URL, AUTH_SECRET, NEXT_PUBLIC_APP_URL (others optional)
# 4. Push schema to database
npm run db:push
# 5. (Optional) Seed test data
npm run db:seed
npx tsx scripts/seed-filter-coverage.ts
# 6. Start dev server
npm run dev
npm run db:seed)| Role | Password | |
|---|---|---|
[email protected] | Platform Owner + Academy Admin | password123 |
[email protected] | Course Developer | password123 |
[email protected] | Course Developer | password123 |
[email protected] | Learner | password123 |
Warning: Do not run
npm run db:seedagainst a production database.
Every integration degrades gracefully when env vars are absent:
| Integration | Env Vars | Purpose |
|---|---|---|
| Stripe | STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET | Paid checkout |
| Cloudinary | CLOUDINARY_*, NEXT_PUBLIC_CLOUDINARY_* | File/video uploads |
| OpenAI | OPENAI_API_KEY — or ChatGPT OAuth via OPENAI_OAUTH_ACCESS_TOKEN (+ optional OPENAI_OAUTH_REFRESH_TOKEN, OPENAI_ACCOUNT_ID); OPENAI_MODEL overrides gpt-6.1-sol | AI Assist + SCORM Studio (primary provider) |
| DeepSeek | DEEPSEEK_API_KEY (+ optional DEEPSEEK_BASE_URL, DEEPSEEK_MODEL, default deepseek-flash) | Automatic fallback when OpenAI fails or is unset |
| Credential vault | CREDENTIAL_ENCRYPTION_KEY | AES-256-GCM encryption of per-academy AI credentials |
| Local storage | STORAGE_DIR (default ./storage; /app/storage volume in Docker) | Uploads + SCORM packages when Cloudinary is not configured |
| Resend | RESEND_API_KEY, EMAIL_FROM | Invoice + reminder emails |
| OAuth | AUTH_GOOGLE_*, AUTH_GITHUB_* | Staff OAuth (learners are email-only) |
| Cron | CRON_SECRET | Protects /api/cron/* endpoints |
Course Developers can turn a single lecture video into a conformant SCORM 1.2 package at /instructor/scorm-studio:
src/lib/ai/harness/runner.ts + scorm-video-agent.ts) runs traced steps: probe video → AI learning design (OpenAI → DeepSeek, self-repair, template fallback) → review → render SCO (index.html + scripts/scorm_api.js) → write imsmanifest.xml → SCORM 1.2 conformance validation → publish./uploads/scorm/<jobId>/; optionally attach the result as a SCORM lecture in one click.Jobs persist in the ScormBuildJob model. API: POST /api/scorm/jobs (multipart), GET /api/scorm/jobs, GET /api/scorm/jobs/[id], POST /api/scorm/jobs/[id]/attach. Modelled on workplacesafety-scorm.
| Command | Purpose |
|---|---|
npm run dev | Dev server with Turbopack HMR |
npm run build | Production build (prisma generate && next build) |
npm run start | Production server |
npm run lint | ESLint |
npm run db:push | Apply schema to DB (dev only) |
npm run db:migrate | Run Prisma migrations (production) |
npm run db:seed | Seed test data |
npm run db:studio | Open Prisma Studio GUI |
| Endpoint | Purpose |
|---|---|
GET /api/health | Liveness + DB ping + integration status |
GET /api/cron/ledger-invariant | Nightly check — fails if any transaction doesn't sum to zero |
GET /api/cron/access-reminders | Sends M1/M2/T-14d reminders when email is configured |
See docs/runbook.md for backup/restore procedures and incident playbooks.
Production runs at learnify.tertiaryinfotech.com as a Docker container managed by Coolify:
Dockerfile (Next.js standalone, Node 22); docker-entrypoint.sh runs prisma migrate deploy on every boot/app/storage (STORAGE_DIR) for uploads and SCORM packagesmain triggers a Coolify rebuild; GitHub Actions (.github/workflows/ci.yml) only lints, typechecks and test-builds the imageFull guide: docs/deployment/coolify.md.
See the deployment guides in docs/deployment/:
docs/deployment/coolify.mddocs/deployment/docker.mddocs/deployment/railway.mdThis is a closed-source project. External pull requests are not accepted at this time. Internal contributors should branch from main, follow the conventions in docs/contributing.md, and complete docs/uat-checklist.md before merge.
Tertiary Infotech Academy Pte. Ltd.
If you have access to this repository, please give it a star!
Proprietary / All Rights Reserved. This repo is not open-source — clone and modification rights are retained by the project owner.