ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证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.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 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.