ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Put a name to a portrait, a number to a name, years to a reign, or any other pairing. 47 US presidential terms in English and 31 Russian rulers in Russian, on one quiz engine.
https://github.com/user-attachments/assets/4868459c-415d-4b8a-a999-10c31e7e71a9
Both domains share every screen, component and grading rule. Each one is a registry of fields, modes, strings and an accent colour, and nothing in the UI names a language or a mode.
Android comes first; the web build works just as well in a mobile browser.
/ru has no numbers, so it offers four modes.?range=1-19,28-31.present / «н. в.», the bare start year, or the scheduled end.Barack Hussein Obama isn't #44, and Николай I
isn't Николай II.ё → е.1762-1796 can actually be typed.flowchart LR
D["DomainCore<br/><sub>src/domains/{us,ru}-core.ts</sub>"] --> P["pickGiven + answerFields<br/><sub>src/lib/quiz.ts</sub>"]
P --> Q["Question<br/><sub>{ rec, given, answers }</sub>"]
Q --> S["QuizScreen<br/><sub>prompt + AnswerField × n</sub>"]
S -- inputs --> G["grade()"]
G --> R["RevealPanel<br/><sub>one row per term</sub>"]
A mode names the prompt. pickGiven resolves it (mixed picks a different given piece
each time), and answerFields asks for every other field in the domain's order. Each field's
FieldSpec carries its label, placeholder, keyboard, how to show it and how to check it, so
QuizScreen just renders q.answers.map(...). grade scores each candidate term as a whole
and keeps the best one, which is how the two-row Cleveland reveal happens without any special
case.
The grading logic in src/lib/ and src/domains/*-core.ts imports no React Native values,
so the whole suite runs on bare Node with no test framework.
git clone https://github.com/l4nzel0d/US-Presidents-Quiz-App.git
cd US-Presidents-Quiz-App
npm install
npm run web # run in the browser
npm start # dev server for Android (needs a dev client, see below)
npm test # 127 grading assertions over both domains
npx tsc --noEmit # typecheck
[!NOTE] Expo Go won't work. The app links
react-native-keyboard-controller, a native module, so on a device you need a development build (expo-dev-clientis already a dependency):eas build --profile development, install it, thennpm start.
src/
├── app/ Expo Router routes: thin wrappers only
│ ├── index the chooser
│ ├── us/ _layout · index (menu) · list · quiz/[mode]
│ └── ru/ same shape
├── screens/ MenuScreen · ListScreen · QuizScreen, shared by both domains
├── lib/ pure logic: domain vocabulary, quiz, grading, ranges, storage
├── domains/ us-core / ru-core (pure, tested) + us / ru (adds images)
├── data/ us-presidents.ts (47) · ru-rulers.ts (31)
├── components/ UI pieces + portrait maps
├── state/ DomainContext · RangeContext
└── theme/ a translation of .legacy/styles.css
tests/ grading.test.ts + a tiny Node resolver hook
.legacy/ the original vanilla-JS web app this was ported from
Android APK (arm64-v8a) via EAS:
eas build --profile preview
Web: a static export, hosted on Vercel:
npx expo export --platform web # writes dist/
Static rendering emits the dynamic quiz routes as literal dist/us/quiz/[mode].html and
dist/ru/quiz/[mode].html, so vercel.json rewrites /us/quiz/:mode and /ru/quiz/:mode
onto them. Any other static host needs the same two rewrites.
Read AGENTS.md before you touch anything. It covers the architecture, the
grading rules worth keeping, and the pitfalls that have already bitten once: typed-route
poisoning, accent colours that can't live in a StyleSheet, the twin-thumb slider. Run
npm test after any change to src/lib/ or src/domains/.