ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Practice WCAG 2.2 accessibility audits on realistic pages with known, randomized violations, then compare your findings against an answer key.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A practice environment for WCAG 2.2 conformance audits. You audit a realistic web page with known, intentionally injected Level A/AA violations, document what you find, and then compare your report against an answer key to see exactly what you caught and what you missed.
Try it: https://daymond-blair.github.io/accessibility-audit-training-lab/. Select See a sample audit to see a finished, scored audit in one click.
Built with vanilla HTML, CSS and JavaScript. No frameworks, build step or backend.
A WCAG conformance audit is more than spotting problems. A professional audit follows a repeatable workflow:
The only way to get good at this workflow is repetition. The obvious way to practise is to pick a random website and audit it, but auditing a random site gives you no feedback. You never learn which violations you missed, so you can't tell whether a clean result means the site is accessible or your testing has gaps. Blind spots stay blind.
This lab closes that loop. Every violation on the audit page is known and documented. Everything else on the page has been verified to pass, so a missed item is a real gap in your process rather than an ambiguity in the test. After you submit, the answer key shows each violation with how to find it (reproduction) and how to fix it (remediation). You can compare your own documentation against that model, not just tick a box.
There are three scenarios, each covering a different kind of page that audits often focus on:
| Scenario | Page | What it exercises |
|---|---|---|
| Fernhill Coworking | Marketing landing page | Navigation, a pricing table, testimonials, a contact form |
| Larkspur Outdoor | E-commerce product page | An image gallery, product options, a quantity stepper, cart and size-guide dialogs, a tooltip, reflow and text spacing |
| Cedar Valley Rec Center | Registration form | Labels and instructions, validation, error messages and summaries, timing, re-entry and a review step before payment |
Each attempt is different. Every scenario has a pool of 20 possible defects, and each attempt randomly activates 10 of them, so you can practise repeatedly without memorising the answers.
It is also deliberately designed so that automated tools are not enough. Even with all 20 defects active, axe-core detects only 7 on Fernhill, 5 on Larkspur and 1 on Cedar Valley. The rest need manual keyboard, screen reader and visual testing, the same skills a real audit and an interview audit exercise test.
I wrote a structured brief before any code existed and used it to direct Claude Code (an AI coding agent) through the build. Before the build, I used v0 (Vercel's AI prototyping tool) to refine the brief and visualize how the app and audit pages might look. The full prompt is in docs/project-spec.md. Each section addresses one aspect of the problem:
| Section of the brief | What it pinned down | Why it mattered |
|---|---|---|
| Project overview | Simulate a real audit: examine, document, compare against known violations | Set the goal as practising a workflow rather than a quiz |
| Features | One page, 10 violations, a findings log (add, edit, delete), submit, answer key, manual marking, score, reset | Defined the minimum loop: audit, document, get feedback, repeat |
| WCAG reference library | All active 2.2 A/AA criteria from W3C sources, a fixed schema, AAA and obsolete criteria excluded, validated against the spec | Grounded every finding and answer in the official standard instead of AI recall |
| Scenario generation | Distinct, reproducible defects across keyboard, screen reader, semantics, forms and visual design; answer key kept separate and hidden | Required genuine, testable failures covering the full range of audit skills, not arbitrary bugs |
| Technical | Vanilla stack, JSON data, localStorage, static hosting, no backend or paid APIs | Kept it simple, free to run and easy to deploy for demos |
| Accessibility | The training app itself meets WCAG 2.2 AA; the defective page is kept separate; injected defects are never auto-fixed | An accessibility tool has to be accessible, and the defects must survive as test material |
| UI | QA-tool styling, responsive, a professional audit-report form, no gamification | Mirrors a professional audit, not a game |
| Development approach | MVP first, one scenario, no runtime AI, explain the plan before building, verify it runs | Scoped the AI's work and required a plan and verification instead of unchecked output |
After the MVP worked, I extended it in small, separately verified steps: reproduction and fix fields in the findings log, so reports mirror the answer key, then randomized defects for repeated practice, then e-commerce and form validation scenarios. Randomization reverses one MVP rule, "no randomized scenario creation", once the fixed version had proved the concept.
An AI agent wrote the code, injected the defects and drafted the WCAG library. None of that output was trusted without checks, and every check below can be re-run (see Run the tests):
tools/validate_wcag.py fetches the official W3C Recommendation and confirms that the JSON contains exactly the 55 active Level A and AA criteria, with matching ids, names and levels.This matters in accessibility work in particular. AI-generated code often introduces accessibility defects, so AI-assisted work is only useful when it's verified against the standard.
localStorage.Just looking? Select See a sample audit at the top of the app. It shows a finished audit of the current scenario, with example findings, a score and the answer key, including links to the page as audited and the corrected page. The sample is never saved and doesn't affect your own audit.
The app has light and dark themes. It follows your system setting until you pick one with the theme button in the header, and then it remembers your choice.
Each scenario's pool has 20 defects in five groups of four. Each attempt activates two from every group, so every audit has a balanced mix.
Fernhill Coworking (landing page)
| Group | Defects (WCAG success criterion) |
|---|---|
| Page structure | Missing page language (3.1.1) · fake headings (1.3.1) · meaningless page title (2.4.2) · zoom disabled (1.4.4) |
| Keyboard and interaction | No focus indicator (2.4.7) · div used as a button (2.1.1) · positive tabindex (2.4.3) · select that submits the form (3.2.2) |
| Screen reader | Unnamed close button (4.1.2) · image without alt (1.1.1) · unnamed icon links (2.4.4) · unannounced confirmation (4.1.3) |
| Forms | Placeholder-only labels (3.3.2) · missing autocomplete (1.3.5) · color-only errors (3.3.1) · faint field borders (1.4.11) |
| Visual | Color-only table (1.4.1) · low-contrast text (1.4.3) · auto-rotating content (2.2.2) · tiny tap targets (2.5.8) |
Larkspur Outdoor (e-commerce)
| Group | Defects (WCAG success criterion) |
|---|---|
| Layout and structure | Foreign-language review not marked (3.1.2) · table without headers (1.3.1) · fixed-width layout (1.4.10) · text clipped by spacing (1.4.12) |
| Keyboard and interaction | Swatches not keyboard operable (2.1.1) · size guide keyboard trap (2.1.2) · cart dialog doesn't take focus (2.4.3) · action on pointer-down (2.5.2) |
| Screen reader | Product image without alt (1.1.1) · unnamed quantity buttons (4.1.2) · unannounced add to cart (4.1.3) · name doesn't match label (2.5.3) |
| Options and controls | Option groups without fieldset or legend (1.3.1) · color-only link (1.4.1) · tiny quantity buttons (2.5.8) · faint selection ring (1.4.11) |
| Visual and content | Low-contrast stock text (1.4.3) · image of text (1.4.5) · sensory instructions (1.3.3) · tooltip can't be dismissed or hovered (1.4.13) |
Cedar Valley Rec Center (form validation)
| Group | Defects (WCAG success criterion) |
|---|---|
| Labels and instructions | Date format not explained (3.3.2) · hint not linked to field (1.3.1) · duplicate "Name" labels (2.4.6) · required shown by red only (1.4.1) |
| Error handling | Error shown by color only (3.3.1) · errors without suggestions (3.3.3) · error summary not announced (4.1.3) · errors not linked to fields (1.3.1) |
| Interaction and timing | No focus indicator (2.4.7) · radio change moves focus (3.2.2) · div used as a checkbox (2.1.1) · silent timeout (2.2.1) |
| Process and data entry | Address must be retyped (3.3.7) · no review before payment (3.3.4) · missing autocomplete (1.3.5) · toggle state not exposed (4.1.2) |
| Visual and layout | Low-contrast hints (1.4.3) · sticky bar hides focus (2.4.11) · sensory instructions (1.3.3) · faint checkbox borders (1.4.11) |
Each attempt has a six-character code, such as HUX8UX, and the app opens the page as scenarios/fernhill/index.html?attempt=HUX8UX. The same code always produces the same defects, so reloading the page never reshuffles them. There are 7,776 possible combinations.
Other URL options, for comparison and testing:
?defects=none: the corrected page, with no defects.?defects=all: all 20 defects at once.?defects=V03,V14: specific defects, by answer-key id.index.html Training app (scenario list, findings log, results)
css/app.css App styles (light/dark, visible focus, responsive)
js/app.js App logic: per-scenario state, findings CRUD, scoring
data/wcag-criteria.json All 55 WCAG 2.2 Level A/AA success criteria
data/scenarios.json Scenario list shown on the dashboard
data/answer-keys/<scenario>.json Answer keys (fetched only after submission)
scenarios/shared/attempt-engine.js Picks each attempt's defects (shared by pages and app)
scenarios/<scenario>/attempt.js The scenario's defect groups
scenarios/<scenario>/script.js Applies the active defects and runs the page
scenarios/<scenario>/index.html The audit page (accessible by default)
tools/validate_wcag.py Validates the WCAG data and answer keys
tests/ Browser test suites and their runner
docs/project-spec.md The original project brief
Each page in scenarios/ is built correctly, and its script.js breaks it on purpose according to the attempt. Do not remove the defect code, because the answer key depends on it. Apart from the active defects, the page passes, so testers aren't penalized for finding real issues that aren't in the key. If you add a defect, add it to attempt.js and the answer key together. tools/validate_wcag.py checks that the two match.
The app loads JSON with fetch, so it must be served over HTTP. Opening index.html directly from disk will not work.
git clone https://github.com/Daymond-Blair/accessibility-audit-training-lab.git
cd accessibility-audit-training-lab
python3 -m http.server 8000
Then open http://localhost:8000.
python3 tools/validate_wcag.py
This fetches the WCAG 2.2 Recommendation and confirms that data/wcag-criteria.json contains exactly the active Level A and AA criteria (31 A, 24 AA, with 4.1.1 Parsing excluded as obsolete), with matching ids, names and levels and all required fields. It also checks that every criterion referenced in the answer keys exists, and that each answer key lists exactly the defects in its scenario's attempt.js. To validate offline, pass a saved copy of the spec: python3 tools/validate_wcag.py spec.html.
The browser test suites behind the verification claims above are in tests/. They need Google Chrome (or Chromium) and an internet connection, because axe-core is loaded from cdnjs.
python3 tests/run_tests.py # all suites, about 2 minutes
python3 tests/run_tests.py app -v # one suite, printing every check
| Suite | What it checks |
|---|---|
app | Findings log: add, edit, delete, validation, persistence, submit, scoring, reset, focus management, axe and contrast |
fernhill | Randomizer properties, the corrected page, every Fernhill defect alone and all together, and the app's attempt flow |
larkspur-cedarvalley | The corrected e-commerce and form pages in all their interactive states, plus every defect alone and all together |
multi-scenario | Scenario switching, separate progress per scenario, persistence, reflow at 320px, and the 90-second timeout defect |
The runner serves the project on a random local port with a temporary browser profile, so it never touches findings you saved while practising. You can also open a suite in a browser through any local server, for example http://localhost:8000/tests/app.html, and read the results on the page. Don't do this on the address where you practise, because the suites clear that address's saved findings.
The project is a plain static site with no build step, so it runs on any static host.
The code is already on GitHub, so this needs no extra account and redeploys automatically on every push.
main and / (root), and click Save.https://<username>.github.io/<repo>/.All paths in the project are relative, so it works from that sub-folder URL.
Drag and drop (fastest):
From a Git repository (auto-deploys on push):
index.html (. if it is the repo root).localStorage.scenarios/ with an attempt.js that registers its defect groups, an answer key under data/answer-keys/ with the same name, and an entry in data/scenarios.json. The app picks it up automatically.Success criterion names and levels come from the W3C WCAG 2.2 Recommendation. Definitions and testing guidance are concise paraphrases. See Understanding WCAG 2.2 for the authoritative text. Fernhill Coworking, Larkspur Outdoor and Cedar Valley Recreation Center are fictional organizations.