ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A modern web application for studying and preparing for US Amateur Radio license exams
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A modern web application for studying US Amateur Radio license exams. Open source, community-driven, born in North Carolina.檢視完整 README ↗A modern web application for studying US Amateur Radio license exams. Open source, community-driven, born in North Carolina.
Live App: app.openhamprep.com
Supports all three license classes: Technician, General, and Extra.
Prerequisites: Node.js 20+, Docker Desktop
git clone https://github.com/sonyccd/openhamprep.git
cd openhamprep
npm install
npm run dev:full
See LOCAL_DEVELOPMENT.md for details.
Frontend: React 18, TypeScript, Vite, MUI (Material UI) with Emotion, MUI X Charts & Data Grid (Community), TanStack Query, React Router, Framer Motion, lucide icons, next-themes
Backend: Supabase (PostgreSQL, Auth, Edge Functions)
Tooling: Vitest + Testing Library (happy-dom), Playwright (e2e), ESLint, Amplitude & Pendo (product analytics), Sentry (error tracking), Vercel Analytics & Speed Insights
useAppNavigationuseAuth contextsrc/hooks/The app wraps components in this provider order, outermost → innermost (see App.tsx):
light/dark class on <html>colorSchemeNode={null} so it follows next-themes instead of competing with itsrc/
├── components/ # React components
│ ├── ohp/ # Shared presentational primitives (PageContainer, Icon, ScoreRing, …)
│ ├── admin/ # Admin-only components
│ ├── <feature>/ # Sub-components grouped by feature (dashboard/, question/, …)
│ └── *.tsx # Feature components
├── hooks/ # Custom React hooks
├── pages/ # Route page components
├── services/ # Service layer + centralized query keys
├── theme/ # MUI theme (palette, typography, component overrides)
├── lib/ # Utilities
├── integrations/ # Supabase client (auto-generated)
├── assets/ # Static assets
├── test/ # Test setup and helpers
└── types/ # TypeScript types
Outside src/: supabase/ (migrations, seed data, Edge Functions), e2e/ (Playwright tests), website/ (static marketing site), docs/ (guides and design specs).
The UI is built entirely with MUI, styled through the sx prop. Use the library's components rather than hand-rolling your own, and never use direct colors — always use the theme's palette tokens so light and dark mode both work:
// Correct - palette tokens follow light/dark
<Box sx={{ bgcolor: "background.default", color: "text.primary" }}>
// Wrong - a literal color breaks theme switching
<Box sx={{ bgcolor: "#fff", color: "#000" }}>
| what you want | sx path |
|---|---|
| page background | background.default |
| card / surface | background.paper |
| body text | text.primary / text.secondary |
| hairlines, borders | divider |
| subtle surface / green accent | muted / accent (flat keys, no .main) |
| brand | primary.main, secondary.main |
| states | error.main, warning.main, info.main, success.main |
Colors live in src/theme/muiTheme.ts, which is the source of truth. Icons come from lucide and are rendered through ohp/Icon, which hides decorative icons from screen readers.
npm run dev # Start dev server
npm run dev:full # Start Supabase + dev server
npm run supabase:stop # Stop Supabase
npm run supabase:reset # Reset database
npm run lint # Run ESLint
npm test # Run unit tests (watch mode)
npm run test:run # Run unit tests once (CI mode)
npm run e2e # Run Playwright end-to-end tests
npm run build # Production build
Uses local Supabase via Docker - no hosted account needed:
npm run dev:full # Start Supabase + dev server
For production or if you have Supabase project access:
cp .env.example .env.local
# Edit .env.local with your credentials
npm run dev
npm install && npm run dev:fullSee CONTRIBUTING.md for guidelines.
Licensed under the GNU General Public License v3.0. © Brad Bazemore