ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Full Lyceon.ai monorepo
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
An AI-powered SAT practice application with RAG (Retrieval-Augmented Generation) capabilities, featuring quality practice questions, vector search functionality, and robust production deployment.
• Content Operations: Admin-managed question review and quality controls
• Vector Search: Semantic search using embeddings stored in PostgreSQL and Supabase
• AI Tutoring: Retrieval-Augmented Generation for personalized assistance
• Practice Sessions: Track progress and get instant feedback
• Admin Dashboard: Manage questions, review queues, and system health查看完整 README ↗An AI-powered SAT practice application with RAG (Retrieval-Augmented Generation) capabilities, featuring quality practice questions, vector search functionality, and robust production deployment.
Install pnpm:
# Recommended: Standalone installer
curl -fsSL https://get.pnpm.io/install.sh | sh -
# or via npm (if already installed)
npm install -g pnpm
Required:
DATABASE_URL=postgresql://... # PostgreSQL connection string
NODE_ENV=development # or production
Optional:
# AI/ML
GEMINI_API_KEY= # Google Gemini API key
OPENAI_API_KEY= # OpenAI API key for embeddings
EMBEDDINGS_MODEL=text-embedding-3-small # Embedding model to use
# Vector Search (Supabase)
SUPABASE_URL=https://...
SUPABASE_SERVICE_ROLE_KEY=...
# Security
ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5000 # CORS origins (comma-separated)
Important: This project uses pnpm exclusively. Do not use npm install or yarn install.
pnpm install
Development mode:
pnpm run dev
Production build:
pnpm run build
pnpm run preview
The app will be available at http://localhost:5000
The application provides comprehensive health monitoring:
/healthz - Primary Health CheckReturns system health status and diagnostics. This endpoint works even if the database is unavailable.
Response:
{
"ok": true,
"version": "1.0.0",
"nodeEnv": "development",
"uptime": 123.45,
"hostname": "server-name",
"hasDbUrl": true,
"dbReachable": true,
"hasSupabase": true,
"embeddingsModel": "text-embedding-3-small",
}
Fields:
ok: Overall health statusversion: Application versionnodeEnv: Current environment (development/production)uptime: Server uptime in secondshostname: Server hostnamehasDbUrl: Whether DATABASE_URL is configureddbReachable: Whether database connection is workinghasSupabase: Whether Supabase is configuredembeddingsModel: Active embeddings model/api/health - Legacy Health CheckReturns configuration details:
{
"config": {
"ocrProvider": "auto",
"embedProvider": "openai",
"vectors": false,
"llmQA": false
}
}
The application uses lazy database initialization to ensure it can start even when:
DATABASE_URL is not configuredBoot sequence:
/healthz endpoint (no DB required)If the database fails to connect:
/healthz shows dbReachable: falseThe app supports flexible authentication:
Local Auth (Default)
Rate Limiting:
Security Headers:
Request Monitoring:
Never write SQL migrations manually. Use Drizzle's schema push:
# Safe schema sync
pnpm run db:push
# Force sync (if data loss warning)
pnpm run db:push --force
To generate embeddings for questions that don't have them:
tsx scripts/backfill-embeddings.ts
Features:
To enable vector search in Supabase, run:
-- See database/supabase-vector-setup.sql
-- Creates pgvector extension and question_embeddings table
GET /api/health - API health checkGET /healthz - Service health checkGET /api/admin/questions/needs-review - Review queueGET /api/admin/questions/duplicates - Duplicate detection viewGET /api/admin/questions/statistics - Question quality metricsPOST /api/auth/signup - Email/password signupPOST /api/auth/signin - Email/password sign inPOST /api/auth/signout - Sign out (clears auth cookies)POST /api/auth/refresh - Refresh session from refresh cookiePOST /api/auth/consent - Submit guardian consent (under-13 flow)GET /api/auth/debug - Auth diagnostics endpointGET /api/auth/google/start - Start Google OAuth flowGET /auth/google/callback - OAuth callback endpointGET /api/profile - Canonical current-user profile payloadGET /api/auth/user and POST /api/auth/exchange-session (both return 404)The application uses structured logging with multiple channels:
NODE_ENV=productionpnpm run db:pushpnpm run build && pnpm run preview/healthz endpoint for health statusThe server binds to 0.0.0.0:5000 for container compatibility.
Health check command:
curl -f http://localhost:5000/healthz || exit 1
├── apps/api/ # Backend API
│ └── src/
│ ├── routes/ # API route handlers
│ ├── lib/ # Utilities (embeddings, etc.)
│ ├── db/ # Database client
│ └── middleware/# Express middlewares
├── client/ # React frontend
│ └── src/
│ ├── pages/ # Page components
│ ├── components/# Reusable components
│ └── lib/ # Frontend utilities
├── shared/ # Shared types and schemas
├── server/ # Express server bootstrap
├── scripts/ # Utility scripts
└── database/ # Database schemas
shared/schema.tsapps/api/src/routes/client/src/pnpm run test:e2e/healthz endpoint - it should work even with DB issuesDATABASE_URL is set correctlyNEXTAUTH_ENABLED matches your setupOPENAI_API_KEY or GEMINI_API_KEY is setEMBEDDINGS_MODEL configurationSUPABASE_URL and SUPABASE_SERVICE_ROLE_KEYSee the full runbook here: docs/SECURITY_RUNBOOK.md
To run the security regression tests locally (PowerShell):
# From the project root
pnpm install
pnpm run test:security
.env contains valid SUPABASE_URL and GEMINI_API_KEY for full test coverage.The Score Projection Engine calculates estimated SAT scores using College Board domain weights and student mastery data.
const SCORING_MODEL = {
baseScore: 400, // 200 per section minimum
rangePerSection: 600, // 800 max - 200 min
weights: {
math: {
'algebra': 0.35,
'advanced_math': 0.35,
'problem_solving': 0.15,
'geometry': 0.15
},
rw: {
'craft_structure': 0.28,
'information_ideas': 0.26,
'standard_english': 0.26,
'expression_ideas': 0.20
}
}
};
Section_Mastery = Sum(Domain_Mastery * Domain_Weight)Projected_Section = 200 + (600 * Section_Mastery)Variance = 100 / Math.cbrt(totalQuestions)Range_Low = Score - VarianceRange_High = Score + VarianceBefore calculation, mastery data is decayed based on inactivity:
Decay_Factor = 0.95 ^ Weeks_Inactive
This ensures students who neglect a domain see their projected score drop, incentivizing regular practice.
GET /api/progress/projection
Returns:
projection.composite: Total projected score (400-1600)projection.math: Math section score (200-800)projection.rw: Reading & Writing section score (200-800)projection.range.low/high: Confidence intervalprojection.breakdown: Per-domain contribution detailsMIT
projection.math: Math section score (200-800)