ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Indonesia-first student opportunities platform (competitions-first MVP). Next.js 16 + TypeScript,
PostgreSQL + Drizzle ORM, Auth.js, Meilisearch, Redis + BullMQ, Cloudflare R2, Resend, Sentry.
The nightly badge reports the concurrency race scripts and the contrast auditor self-test, which the
unit suite structurally cannot check. It is here because fourteen nightly-failure notifications were
delivered in two weeks and thirteen were never opened: a badge is read where a notification is not.
Its state is also reported by /close-step, so a red night is seen at the moment a work unit closes.README 전문 보기 ↗Indonesia-first student opportunities platform (competitions-first MVP). Next.js 16 + TypeScript, PostgreSQL + Drizzle ORM, Auth.js, Meilisearch, Redis + BullMQ, Cloudflare R2, Resend, Sentry.
The nightly badge reports the concurrency race scripts and the contrast auditor self-test, which the
unit suite structurally cannot check. It is here because fourteen nightly-failure notifications were
delivered in two weeks and thirteen were never opened: a badge is read where a notification is not.
Its state is also reported by /close-step, so a red night is seen at the moment a work unit closes.
Project instructions and the durable truth files live in CLAUDE.md and
docs/.
npm install
cp .env.example .env.local # fill in values
npm run db:migrate:guarded # apply migrations (always use the guarded script)
npm run dev
Useful scripts: npm run lint, npm run typecheck, npm run test, npm run build,
npm run env:check, npm run connectors:status.
R2 backs competition submission uploads (activated at Step 4.6). Files are uploaded directly from the browser to R2 via short-lived presigned PUT URLs; the app stores only file metadata.
Required environment variables (see .env.example):
| Variable | Purpose |
|---|---|
R2_ENDPOINT | https://<account-id>.r2.cloudflarestorage.com — encodes the Cloudflare account id |
R2_BUCKET | Bucket name |
R2_ACCESS_KEY_ID | R2 access key id |
R2_SECRET_ACCESS_KEY | R2 secret access key |
R2_REGION | Optional; defaults to auto |
Graceful degradation. The submission upload-URL endpoint
(POST /api/v1/competitions/[competitionId]/registrations/[registrationId]/submission/upload-url)
checks isR2Available() before signing. When any of the four credentials above is missing it
returns HTTP 503 submission_upload_unavailable (never an uncaught 500), so the app remains
usable without R2 configured — only the upload step is unavailable. This mirrors the Meilisearch
degradation model (isMeilisearchAvailable()).
Security note (MVP boundary): submission file keys are server-generated as
submissions/{registrationId}/{uuid}and the metadata-record endpoint validates the key prefix before any DB write. The app does not verify the object actually exists in R2 — key-prefix validation is the MVP security boundary. Presigned download (GET) is deferred to a later step.