ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
미국 아마추어 무선 면허 시험을 위한 무료 오픈소스 학습 플랫폼, 실제 FCC 문제 풀고 Technician용 쉬운 영어 강의 제공
A free, open-source study platform for the US amateur radio license exams. Practice against the real FCC question pools, with plain-English lessons for Technician. No paywall, ever.
교육TypeScript · PLpgSQLGitHub @sonyccd온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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