ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Interval — spaced reps for coding interviews. A free spaced-repetition trainer for the Blind 75 / NeetCode 150 / 250.
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Spaced reps for coding interviews — a local-first spaced-repetition trainer for the Pareto 49, Blind 75, NeetCode 150, and NeetCode 250, built on spacing-effect and retrieval-practice research.
Use it here → intervalreps.vercel.app
No account or install required. Your log starts in your browser; optional sync works with a pairing link alone, while Google sign-in makes that link recoverable.
Grinding the list front-to-back optimizes for finishing, not retaining. This app schedules each problem back into your queue right around when you'd otherwise forget it, so every rep is a real retrieval attempt instead of a warm re-read.
The Method tab in the app explains the research behind each rule.
The entire app is one static index.html — no framework, build step, or bundled client dependencies. State lives in localStorage. The page contains list metadata (names, categories, difficulty, and links) plus your own attempt log, Recall cards, and kata schedule; it never stores problem statements or solutions.
Cross-device sync is entirely optional. You can turn it on with a secret pairing link and no account, or sign in with Google. Both routes use the same random 128-bit sync key; Google only associates your account with that key so you can recover the log on a new device or after clearing browser storage. It is not a separate account-based data path.
The server (Convex, in backend/) stores the merged state under that key. Attempts have stable IDs, deletions stick via tombstones, and the newest deck edit wins, making merges commutative and idempotent. Devices can log offline and converge on the next successful round-trip. Anyone with a pairing link can access its log, so treat it like a password; if it leaks, rotate it in the sync panel to carry the state to a new key and revoke the old one.
Recall exercises run locally in the browser where supported, and recap text and images are generated locally without an upload.
The checked-in catalog is generated at maintenance time, never fetched by the app:
node scripts/update-neetcode-data.mjs
node scripts/update-neetcode-data.mjs --emit
The script reads NeetCode's current public bundle, preserves IDs 1–150 by LeetCode slug,
and validates list nesting, category and difficulty totals, slugs, IDs, order, and all
required fields before it emits the PROBLEMS declaration. The Pareto 49 is not part of
that nesting: TIER_INFO[49].ids lists its problem IDs (all within 1–150) in the order
the original PDF gives them.
The problem lists are curated by NeetCode / Navdeep Singh. NeetCode's videos, courses, and Pro membership support the original work. The Pareto 49 is Aman Manazir's Pareto Problem Set, a shorter ordered subset of the NeetCode 150. The seeded Katas follow ThePrimeagen's algorithms course and are inspired by the kata-machine workflow. Interval schedules the forms; the public kata-typescript harness runs them in a real editor and test runner. This repository does not bundle kata-machine code or tests.
Not affiliated with NeetCode or LeetCode.
Use Node 24. From a fresh checkout:
npm ci
npm run setup
npm run doctor
npm run dev
The server prints its URL and uses an available localhost port. Stop it with
Ctrl-C. It reloads index.html on each request, disables sync/Google by default,
and never changes the production configuration on disk. Use PORT=8000 npm run dev
for a stable browser-storage origin, or give each worktree its own port.
npm run verify # merge + rotation + TypeScript + browser checks
npm run test:e2e # desktop/mobile Chromium smoke tests
npm run test:report # inspect results; failures retain traces/screenshots
npm run worktree -- feature/my-change ../interval-my-change
Worktree creation starts from committed HEAD and installs dependencies; uncommitted
changes are not copied. Run npm run dev inside the new directory. Stop its server
before removing it with git worktree remove ../interval-my-change.
On a minimal Linux host, browser setup may also require
npx playwright install --with-deps chromium. CI runs the same verification gate
and retains browser reports for seven days.
For optional backend QA, set INTERVAL_SYNC_URL to your disposable deployment's
full /sync URL. INTERVAL_GOOGLE_CLIENT_ID enables real Google recovery; its
origin must also be configured in Google and the backend. The default smoke suite
uses an intercepted sync transport, so it does not establish real Convex or OAuth
correctness. See AGENTS.md for isolation, debugging, and coverage limits.
The static page works from any file host — or just open index.html locally. To self-host sync:
cd backend
npm install
npx convex dev # creates your own Convex deployment
Then point SYNC_URL in index.html at your deployment's .convex.site URL.
Pairing-link sync needs no account or OAuth setup. To offer optional Google recovery,
replace GOOGLE_CLIENT_ID in index.html, set the matching GOOGLE_CLIENT_ID in your
Convex environment, and add your site origin to RECOVER_ORIGINS in
backend/convex/http.ts.
After the development setup above, run the merge and key-rotation checks from the repository root:
node scripts/check-state-merge.mjs
node scripts/check-key-rotation.mjs
Interval is free, and staying that way. Sync runs on a small hosted backend; if the app is earning its keep, you can buy me a coffee ☕