ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
Certification store and exam platform: US$20 Practice Exams (Exam and Practice modes, domain-weighted pools) and official Exam Vouchers. USD/SGD prices at live FX, GST invoices, HitPay/Stripe/PayPal/PayNow checkout, AI question generation (OpenAI, DeepSeek, MiniMax fallback) with human review. Next.js, Prisma, PostgreSQL.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Practice smarter for your next certification.
Tertiary Exams is a full-stack certification practice-exam platform designed for commercial training and certification-preparation providers. It allows users to browse certifications, take free teaser attempts, buy a certification's practice exam on its own or with a real-exam voucher, and take timed or practice-mode exams — every attempt drawn fresh from a question pool weighted by the official exam domains — with per-domain result breakdowns. The platform includes a robust admin backend with AI-assisted question generation, dynamic e-commerce features (Stripe, PayPal, HitPay, PayNow), invoicing, and voucher fulfillment.
Tertiary Exams is built to provide an end-to-end e-commerce and exam-taking experience. It solves the problem of managing certification preparation platforms by selling one practice exam per certification — as practice-only or with a real-exam voucher included — backed by a question pool grouped by exam domain. The platform is designed for scalable content generation using OpenAI (with DeepSeek and MiniMax fallbacks), enabling administrators to quickly author and maintain a large library of high-quality, blueprint-aligned practice questions.
Current Status: The core application features, checkout flows, exam runners, and admin dashboards are implemented and functioning.
/practice-exams/<vendor>/<slug> and /exam-vouchers/<vendor>/<voucher-slug> — and buying the voucher grants the linked Practice Exam automatically.prefers-reduced-motion support./practice-exams and /exam-vouchers with Vendor/level search and pagination; each card shows the Practice Exam price and the Exam Voucher option. The voucher pages carry how it works and a voucher FAQ (with FAQ structured data for search).src/lib/instructor-led.ts); certifications without a matching course show no card.src/lib/exam-blueprints.ts); a short domain's seats are re-apportioned to the others.Tertiary Exams covers 12 vendors and 195+ practice exams across cloud, security, networking, data, DevOps, AI, and project-management certifications. Each certification ships with one practice exam drawn from a domain-weighted question pool, sold on its own or with the real-exam voucher.
| Code | Certification | Level |
|---|---|---|
| CLF-C02 | AWS Certified Cloud Practitioner | Foundational |
| AIF-C01 | AWS Certified AI Practitioner | Foundational |
| SAA-C03 | AWS Certified Solutions Architect – Associate | Associate |
| DVA-C02 | AWS Certified Developer – Associate | Associate |
| SOA-C03 | AWS Certified CloudOps Engineer – Associate | Associate |
| DEA-C01 | AWS Certified Data Engineer – Associate | Associate |
| MLA-C01 | AWS Certified Machine Learning Engineer – Associate | Associate |
| SAP-C02 | AWS Certified Solutions Architect – Professional | Professional |
| DOP-C02 | AWS Certified DevOps Engineer – Professional | Professional |
| AIP-C01 | AWS Certified Generative AI Developer – Professional | Professional |
| ANS-C01 | AWS Certified Advanced Networking – Specialty | Specialty |
| SCS-C03 | AWS Certified Security – Specialty | Specialty |
| Code | Certification | Level |
|---|---|---|
| AZ-900 | Microsoft Azure Fundamentals | Foundational |
| AI-900 | Microsoft Azure AI Fundamentals | Foundational |
| DP-900 | Microsoft Azure Data Fundamentals | Foundational |
| SC-900 | Microsoft Security, Compliance & Identity Fundamentals | Foundational |
| MS-900 | Microsoft 365 Fundamentals | Foundational |
| AZ-104 | Microsoft Azure Administrator | Associate |
| AZ-204 | Developing Solutions for Microsoft Azure | Associate |
| AZ-500 | Microsoft Azure Security Technologies | Associate |
| AI-102 | Microsoft Azure AI Engineer Associate | Associate |
| DP-100 | Microsoft Azure Data Scientist Associate | Associate |
| DP-203 | Microsoft Azure Data Engineer Associate | Associate |
| DP-300 | Microsoft Azure Database Administrator | Associate |
| MD-102 | Microsoft Endpoint Administrator | Associate |
| MS-102 | Microsoft 365 Administrator Expert | Associate |
| PL-300 | Microsoft Power BI Data Analyst | Associate |
| SC-200 | Microsoft Security Operations Analyst | Associate |
| AZ-305 | Designing Microsoft Azure Infrastructure Solutions | Expert |
| AZ-400 | Designing & Implementing Microsoft DevOps Solutions | Expert |
| Code | Certification | Level |
|---|---|---|
| 220-1101 / 220-1102 | CompTIA A+ (Core 1 & Core 2) | Foundational |
| N10-009 | CompTIA Network+ | Associate |
| SY0-701 | CompTIA Security+ | Associate |
| DA0-001 | CompTIA Data+ | Associate |
| CV0-004 | CompTIA Cloud+ | Associate |
| SK0-005 | CompTIA Server+ | Associate |
| XK0-005 | CompTIA Linux+ | Associate |
| CS0-004 | CompTIA CySA+ (V4) | Professional |
| PK0-005 | CompTIA Project+ | Associate |
| PT0-003 | CompTIA PenTest+ | Advanced |
| CAS-005 | CompTIA SecurityX | Expert |
CompTIA voucher-tier prices track CompTIA's official exam-voucher list price (USD; charged GST inclusive, so the invoice shows the 9% GST within it) — e.g. Security+ / CySA+ / PenTest+ 439, SecurityX 544, Network+/Cloud+/Linux+/Server+/Project+ 399, A+ 274 (per core), Data+ 264.
| Code | Certification | Level |
|---|---|---|
| CDL | Google Cloud Digital Leader | Foundational |
| ACE | Google Associate Cloud Engineer | Associate |
| PCA | Google Professional Cloud Architect | Professional |
| PDE | Google Professional Data Engineer | Professional |
| PMLE | Google Professional Machine Learning Engineer | Professional |
| PCSE | Google Professional Cloud Security Engineer | Professional |
| Code | Certification | Level |
|---|---|---|
| 200-201 | Cisco Certified CyberOps Associate (CBROPS) | Associate |
| 200-301 | Cisco Certified Network Associate (CCNA) | Associate |
| 350-401 | Implementing Cisco Enterprise Network Core (ENCOR / CCNP) | Professional |
| Code | Certification | Level |
|---|---|---|
| 1Z0-1085 | Oracle Cloud Infrastructure Foundations Associate | Foundational |
| 1Z0-071 | Oracle Database SQL Certified Associate | Associate |
| 1Z0-1072 | Oracle Cloud Infrastructure Architect Associate | Associate |
| 1Z0-1127 | Oracle Cloud Infrastructure Generative AI Professional | Professional |
| 1Z0-997 | Oracle Cloud Infrastructure Architect Professional | Professional |
| Code | Certification | Level |
|---|---|---|
| CKA | Certified Kubernetes Administrator | Associate |
| CKAD | Certified Kubernetes Application Developer | Associate |
| Vendor | Code | Certification | Level |
|---|---|---|---|
| ISC2 | CISSP | Certified Information Systems Security Professional | Associate |
| PMI | PMP | Project Management Professional | Associate |
| Scrum.org | PSM I | Professional Scrum Master I | Associate |
| GitHub | Foundations | GitHub Foundations | Associate |
| Anthropic | CCAR-F | Claude Certified Architect – Foundations (3 practice exams) | Foundational |
| Anthropic | CCAR-P | Claude Certified Architect – Professional | Professional |
| Anthropic | CCDV-F | Claude Certified Developer – Foundations | Foundational |
| Anthropic | CCAO-F | Claude Certified Associate – Foundations (60-question exam + 3 timed 15-question mock exams¹) | Foundational |
¹ CCAO-F mock exams 1–3 are adapted from CLAUDE-CERTIFICATIONS by Amey Thakur (MIT License).
Additional vendor slugs (AXELOS, IASSC, Tableau) are registered for upcoming catalog expansion.
| Area | Technology |
|---|---|
| Frontend | Next.js 16 (App Router), React 19, Tailwind CSS |
| Backend | Node.js, Next.js API Routes |
| Database | PostgreSQL, Prisma ORM |
| Authentication | Auth.js (NextAuth v5 beta), Argon2 |
| Payments | Stripe, PayPal, HitPay, PayNow |
| AI / Integrations | OpenAI SDK (gpt-6.1-sol default) with DeepSeek (deepseek-flash) and MiniMax (MiniMax-M3.1-Flash) fallbacks, Nodemailer, PDF-lib |
| Deployment | Docker, Coolify-ready |
Tertiary Exams uses a monolithic architecture built entirely on the Next.js App Router. It leverages Server Actions for form submissions and Next.js Route Handlers for webhooks, external integrations, and cron workers. Data is persisted in PostgreSQL using Prisma.
flowchart TD
User[User / Visitor] --> NextUI[Next.js Frontend]
Admin[Administrator] --> NextUI
NextUI --> RouteHandlers[Next.js API & Server Actions]
RouteHandlers --> Prisma[Prisma ORM]
Prisma --> Postgres[(PostgreSQL Database)]
RouteHandlers --> Payments[Stripe / PayPal / HitPay]
RouteHandlers --> Email[Nodemailer / Gmail OAuth]
RouteHandlers --> AI[OpenAI / DeepSeek / MiniMax]
Cron[Cron Workers] --> RouteHandlers
prisma/: Database schema, migrations, and seed scripts.src/app/: Next.js App Router pages (public marketing, checkout, exam runner, user dashboard, admin dashboard, API routes).src/components/: Shared UI components for frontend and dense admin data tables.src/lib/: Core business logic (analytics, invoice generation, payments, AI integration, coupons, settings, etc.).scripts/: Bulk question seeding, content generation, and utility scripts..claude/: Project-specific Claude Code setup — path-scoped rules (.claude/rules/: API, payments, exam runtime, questions/seeds, storefront copy, auth/security, schema/deploy), skills (custom-practice-exam, seo-audit) and agents (question-bank-generator — Opus-authored MCQ / multiple-select / sequencing questions per exam domain; security-scanner — writes a local Word security assessment to the git-ignored docs/security/).public/: Static assets and logos.docs/: API spec for partners, PRD, audits and session notes; docs/images/ holds the README screenshots. Root-level images, decks and scratch output are git-ignored — keep the repo root for config and source only.Clone the repository:
git clone https://github.com/alfredang/ai-exams.git
cd ai-exams
Install dependencies (requires --legacy-peer-deps due to some React 19 incompatibilities):
npm install --legacy-peer-deps
Copy the environment configuration:
cp .env.example .env
Start the local database and mail server using Docker Compose:
docker compose up -d postgres mailhog
(Postgres is exposed on port 55432, MailHog on port 8025)
Open the .env file and configure the DATABASE_URL to point to the local instance (e.g., postgresql://aiexams:[email protected]:55432/aiexams?schema=public — note the host port is 55432, not the default 5432).
Note that most application configuration (Stripe keys, PayPal keys, Auth providers, SEO, Company Info, Email credentials) is managed at runtime via the Admin Dashboard Settings rather than environment variables.
Apply database migrations:
npx prisma db push
# Or npm run db:migrate if managing dev migrations
Seed the database with the initial admin user and catalog exams:
npm run db:seed
Start the Next.js development server:
npm run dev -- -p 3040 -H 127.0.0.1
The application will be available at http://localhost:3040.
npm run dev: Starts the development server.npm run build: Generates the Prisma client and builds the Next.js application for production.npm run start: Starts the Next.js production server.npm run typecheck: Runs TypeScript compiler check without emitting files. (npm run lint is currently broken — the installed Next.js version removed next lint; rely on typecheck + build.)npm run db:migrate: Creates and applies development database migrations.npm run db:deploy: Applies pending database migrations (for production).npm run db:seed: Seeds the database with default vendors, exams, products (with their question pools), and admin users.npm run db:studio: Opens Prisma Studio to visually inspect the database.npm run generate:exam: CLI question generation (scripts/generate-questions.ts) — bulk-author blueprint-aligned questions with Claude outside the admin UI.npm run seed:prod -- <bundle> [expected-exam-slug ...]: Runs a bundle's idempotent seed endpoint (POST /api/admin/seed-<bundle>) on production via scripts/seed-prod.sh. Reads PROD_ADMIN_EMAIL / PROD_ADMIN_PASSWORD from the git-ignored .env (never the local ADMIN_PASSWORD), verifies the admin session before seeding, and fails if the expected exam slugs are missing (deploy not live yet). See CLAUDE.md → Seeding a new exam bundle to production./practice-exams catalog./exam-vouchers, the Exam Voucher (practice exam included free); sign up, proceed to /checkout/bundle/[bundleId]?tier=PRACTICE|VOUCHER, and pay with Stripe, PayPal, or HitPay./user-dashboard shows your practice exams as badges — choose Exam mode (timed, the default) or Practice mode to go straight into the runner; each attempt is a new domain-weighted draw. /user-dashboard/attempts tracks every attempt's score, your trend and your performance by exam domain; use the trash icon on a row to delete an attempt you don't want to keep./exam/[attemptId] (test-centre style runner), end it from the Review Screen, and read the score report at /results/[attemptId] (?view=missed / ?view=flagged filter the answer review; Retake exam starts a new attempt)./admin-dashboard to view KPIs and manage the catalog./admin-dashboard/settings to configure Payment Providers, Email Transports, and Social Logins — the Payment Setup Guide page there walks through PayPal, HitPay, and Stripe setup with live status checks and webhook URLs./admin-dashboard/enquiries (filter by status and topic; reply by email or WhatsApp, then mark Contacted / Closed)./admin-dashboard/users: create the account (name + email), grant practice exams on its Entitlements tab, then Send welcome email (template editable under Settings → Email templates).gpt-6.1-sol) under /admin-dashboard/settings/credentials, plus DeepSeek and/or MiniMax keys as fallbacks. In any question bank, use Add manually in the Question pool (published straight away) or Generate questions & answers with AI at the top of the page. AI questions wait in the Review queue until you approve them; edit or reject any you don't want./admin-dashboard/exams (Question Banks) list shows each bank's total questions (with any drafts called out) and its number of exam domains. Open any question bank to generate, review and browse its whole question pool (#questions, filterable by domain, status and type, with bulk Publish / Unpublish / Delete). Each certification's details (exam title, code, duration, pass %, questions per exam, description), exam domains & weights (#domains: exam %, pool size, per-attempt draw) and SEO meta are edited on its Practice Exam page (/admin-dashboard/bundles/[id]). /admin-dashboard/bundles (Practice Exams) lists every Practice Exam (fixed US$20) with its question bank and linked Exam Voucher; /admin-dashboard/bundles/vouchers (Exam Vouchers) manages voucher prices, titles, slugs and on-sale status.The project uses PostgreSQL with Prisma ORM.
prisma/schema.prisma.prisma/seed.ts file (run on every deploy) populates vendors, exams, products and admin users, then folds legacy "Practice Exam N" variants into each certification's single question pool and applies the official domain weights (src/lib/pool-consolidation.ts). Idempotent.ADMIN_GRANT assignments, including exams outside the default team set, so admin/API assignments survive deployments.npm run db:migrate or npx prisma db push to apply schema changes.There is no automated test runner configured in the repository (e.g., Jest/Cypress).
http://127.0.0.1:8025 to intercept outbound emails.The application is built for deployment on platforms like Vercel or self-hosted Docker environments (Coolify-ready).
The repository includes a multi-stage Dockerfile tailored for Next.js standalone output.
NEXTAUTH_URL, DATABASE_URL, WORKER_SHARED_SECRET, etc.) are configured in the deployment platform.prisma migrate deploy, then prisma/seed.ts, then the server — anything the seed imports must be in the runner image (the Dockerfile copies src/lib for this). If a push never shows up live, check the boot log for a seed crash first.[!WARNING] Existing administrator passwords are never changed by database seeds. Set the required password environment variables only when bootstrapping a new account.
NEXTAUTH_SECRET and WORKER_SHARED_SECRET are randomly generated and securely stored.Setting database table and decrypted at runtime.+tag / Gmail dots), and one-time codes that burn after 5 wrong guesses. Mobile sign-up requires an emailed verification code.security-scanner agent for a static security review; its Word report stays in the git-ignored docs/security/ folder and must never be uploaded.DATABASE_URL port matches the exposed port (55432 by default).npx prisma generate and restart the dev server — a running server keeps the old client.--legacy-peer-deps flag to npm install to avoid conflicts with React 19.SINGLE, MULTI, TRUE_FALSE and ORDERING (sequencing); HOTSPOT exists in the schema but is not rendered yet.ADMIN enforcement at the API proxy layer.HOTSPOT question type.docs/security/, not in git): Next.js / next-auth upgrades, session revocation, security headers, PayPal capture checks.FINANCE, SUPPORT, CONTENT).git checkout -b feature/amazing-feature).git commit -m 'Add amazing feature').git push origin feature/amazing-feature).Please ensure your code passes npm run typecheck and npm run build before opening a pull request.
Tertiary Infotech Academy Pte. Ltd. — building AI-assisted certification preparation tools.
If you find this project useful, please consider giving it a ⭐ on GitHub.
© Tertiary Infotech Academy Pte. Ltd. All rights reserved.
correct / total against the pass mark, a four-band readiness scale, a weakest-first exam-domain breakdown that marks study targets, and a Review your answers section (All / Missed or blank / Flagged) that lists every option with the correct one and your pick marked, plus an answer-key box that leads with the exam domain, then the explanation and references when available. Manually authored questions without references are supported. Download summary (PDF) exports the score, domain breakdown and every question with answers, explanations and domains. Retake exam (in the action bar under the score, next to the PDF download) starts a fresh draw from the pool in the same mode. Signed-in learners read the report inside the dashboard with Exam history highlighted in the sidebar./user-dashboard shows every practice exam the learner owns as a badge with their best and last score and a Choose a mode pair — Exam mode (timed, primary) or Practice mode. One click opens the exam runner directly, resuming an unfinished attempt in that mode. Recent attempts are listed underneath in fixed columns (score, Pass / Fail / In progress, Resume or Review answers), and on phones the sidebar becomes a scrollable tab strip./user-dashboard/attempts (sidebar: Exam history) lists every attempt with its score, correct / total, pass result and time used, filterable by certification. Each certification shows best / average / latest score, a score-per-attempt trend against the pass mark, and performance by exam domain across all attempts (domains below the pass mark are tagged Focus here). Every row opens the full answer review, and a trash button (with a confirm dialog) lets learners delete any attempt from their history./p/support is a lead page — a "free study plan & quote" enquiry form (study plan, Exam Voucher quote, teams & corporate, order help, question feedback), WhatsApp / email / phone cards, a free-teaser offer and self-help links. Enquiries are stored even if email is down, raise an admin notification, email the sales inbox, and are worked at Admin → Enquiries (New → Contacted → Closed). Protected by Turnstile, a honeypot, minimum fill time and rate limits.3, 5, 1, 2, 4). These single-answer questions appear under the admin Sequencing filter and show Select the correct sequence in the candidate runner; option ids and scoring remain unchanged.CN- credit note that references the original invoice, email it to the customer, cancel undelivered vouchers and revoke access on a full refund./admin-dashboard/api-tokens with the assign:practice-exams scope. GET /api/v1/practice-exams?q= lists assignable practice exams; GET/POST/DELETE /api/v1/assignments lists, grants (idempotent ADMIN_GRANT) or removes a user's practice-exam access by email — paid access is never touched. A token stops working once its issuing admin is no longer an active admin, and every change is audited as that admin./login opens on Email code (a one-time code by email) with Password as the second tab, plus Google, GitHub, Microsoft and LinkedIn (configurable in settings). Admin-created users who sign in with Google skip the set-a-password prompt.