ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Know your grade before you submit. See your grade before your transcript does.
GradingView is an AI-powered grading estimator for high school and college
students. A student uploads how their work will be graded (rubric,
instructions, answer key, point breakdown…) plus their completed work
(essay, worksheet, practice test, quiz, multiple-choice, short/long answer, or a
mix), and GradingView estimates the likely grade with a full breakdown and
prioritized fixes — before they submit.README 전문 보기 ↗Know your grade before you submit. See your grade before your transcript does.
GradingView is an AI-powered grading estimator for high school and college students. A student uploads how their work will be graded (rubric, instructions, answer key, point breakdown…) plus their completed work (essay, worksheet, practice test, quiz, multiple-choice, short/long answer, or a mix), and GradingView estimates the likely grade with a full breakdown and prioritized fixes — before they submit.
Every result is a rough AI estimate based on the materials provided. It is not a guarantee and your instructor's actual grade may differ. Not for use during an active or proctored exam.
All secrets are server-only. Nothing sensitive is shipped to the browser.
src/
app/
page.tsx Landing page
login/ Supabase Auth (password + magic link)
auth/callback|signout Auth route handlers
dashboard/ Plan, usage meter, grading history
grade/ Core grading form (two sections + re-grade)
results/[attemptId]/ The grade hero + full structured feedback
pricing/ Free / Student / Student Plus + paywall
api/grade/ Upload → extract → grade → validate → persist → meter
api/assignments/[id]/ Delete an assignment + its files
api/stripe/ checkout · portal · webhook
lib/
grading/ ⭐ The grading engine (see below)
entitlements.ts + -core.ts Server-authoritative usage limits (pure core is unit-tested)
extraction/ PDF (pdf-parse), DOCX (mammoth), TXT, image/HEIC → vision
uploads.ts Validate + store + extract one file (order-preserving)
subscriptions.ts Stripe ⇄ DB sync, billing-period usage windows
stripe.ts · env.ts · analytics.ts · rate-limit.ts · billing-guard.ts
supabase/migrations/ 0001 schema · 0002 RLS · 0003 storage bucket + policies
src/lib/grading/)Cleanly separated so prompts/models can be tuned without touching app code.
| File | Responsibility |
|---|---|
prompt.ts | System + user prompt. Edit this to tune grading behavior. |
llm.ts | Provider-agnostic call (LLM_PROVIDER, LLM_MODEL, LLM_VISION_MODEL). Handles multi-image, captioned + ordered. |
schema.ts | Zod schema + TS types for the structured result. Supports rubric essays and mixed-format work (sections, per-section scoring_basis, written-response feedback). |
normalize.ts | Parses model JSON, recomputes the percentage from section points (authoritative), recomputes the letter grade, derives scoring_basis and a defensible range, then re-validates. Throws GradingValidationError on unrecoverable output. |
grade-math.ts | Pure helpers: letter bands, percentFromSections (handles non-100-point scales), estimated range. |
service.ts | gradeSubmission() — orchestrates the call, one safe retry on malformed output. |
Scoring basis is always surfaced: rubric, answer_key, ai_inferred, or
mixed. If no answer key is provided and the model judged correctness itself,
that section is clearly labeled AI-inferred — it never pretends a key existed.
usage_events is
written only after a valid, persisted result).getEntitlement() always recomputes
from subscriptions + usage_events.FREE_GRADE_IP_LIMIT (default
3x the free allotment, i.e. 9). Blunts throwaway-email farming without an email-verification step. Free
tier only; paying users are never IP-limited. Fails open if the client IP is
unknown or the count query errors. Set IP_HASH_SALT in production.BILLING_MODE=dev (only honored when NODE_ENV !== "production") —
unlimited local grades, no limits enforced. Use while iterating.BILLING_MODE=live (the default; forced in production) — real limits:
STRIPE_* env set) → paid plans activate
automatically; Checkout, webhooks and the Customer Portal come online.Entitlement is always decided server-side by getEntitlement(); the dashboard
meter is display-only.
Set NEXT_PUBLIC_TIKTOK_PIXEL_ID (and TIKTOK_EVENTS_API_TOKEN for server-side
events) to enable; unset means nothing loads. Browser events
(CompleteRegistration, InitiateCheckout) are mirrored to the Events API via
/api/tiktok/event with a shared event_id so TikTok counts each once. The
purchase (CompletePayment) is sent from the Stripe webhook using attribution
(ttclid, _ttp, IP, user agent) stored on the Checkout Session metadata.
Nothing loads or is sent for EEA/UK/CH visitors or when Global Privacy Control is
on (src/lib/tiktok-consent.ts). Never send grading content or work to TikTok.
Use TIKTOK_TEST_EVENT_CODE while verifying in Events Manager > Test Events.
npm install
NEXT_PUBLIC_SUPABASE_URLanon public key → NEXT_PUBLIC_SUPABASE_ANON_KEYservice_role key → SUPABASE_SERVICE_ROLE_KEY (server-only!)Apply the files in supabase/migrations/ in order. Either:
Supabase CLI (recommended):
npm i -g supabase
supabase link --project-ref <your-ref>
supabase db push
Or paste each file into the Supabase SQL Editor in order:
0001_init.sql, 0002_rls.sql, 0003_storage.sql.
Migrations create: profiles, subscriptions, assignments,
grading_attempts, submission_files, usage_events; all RLS policies; the
on_auth_user_created trigger; and the storage bucket + policies.
0003_storage.sql creates a private bucket named gradingview-uploads
with owner-scoped policies (path prefix = the user's uid). If you use a
different name, set SUPABASE_STORAGE_BUCKET and update the policy in the
migration.
http://localhost:3000 (dev) / your domain (prod)http://localhost:3000/auth/callback and
https://YOUR_DOMAIN/auth/callback
Email confirmation. Supabase's built-in email sender is heavily
rate-limited and isn't meant for production. Migration 0005 installs a
dev_autoconfirm_email trigger that auto-confirms new signups so password
auth works instantly in development with no emails sent.Before production: set up custom SMTP (Authentication → Emails → SMTP, e.g. Resend / SendGrid), then drop the trigger to enforce real verification:
drop trigger if exists dev_autoconfirm_email on auth.users;
drop function if exists public.dev_autoconfirm_email();
LLM_PROVIDER=anthropic # or "openai"
LLM_MODEL=claude-sonnet-5
LLM_VISION_MODEL=claude-sonnet-5
ANTHROPIC_API_KEY=sk-ant-...
# For OpenAI-compatible providers instead:
# LLM_PROVIDER=openai
# OPENAI_API_KEY=sk-...
# OPENAI_BASE_URL= # optional gateway override
cp .env.example .env.local # fill in Supabase + LLM values
# keep BILLING_MODE=dev to skip Stripe for now
npm run dev
Open http://localhost:3000, create an account, and grade something.
In the Stripe Dashboard (test mode):
STRIPE_STUDENT_PRICE_ID.STRIPE_STUDENT_PLUS_PRICE_ID.STRIPE_SECRET_KEY,
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY.No extra config — Checkout Sessions are created in
src/app/api/stripe/checkout/route.ts. Just set NEXT_PUBLIC_SITE_URL so the
success/cancel URLs resolve.
Local:
stripe listen --forward-to localhost:3000/api/stripe/webhook
# copy the printed whsec_... into STRIPE_WEBHOOK_SECRET
Production: Stripe Dashboard → Developers → Webhooks → Add endpoint →
https://YOUR_DOMAIN/api/stripe/webhook. Subscribe to:
checkout.session.completed, customer.subscription.created,
customer.subscription.updated, customer.subscription.deleted,
invoice.paid. Copy the signing secret → STRIPE_WEBHOOK_SECRET.
Stripe Dashboard → Settings → Billing → Customer portal → activate it and allow customers to update payment methods and cancel subscriptions. The "Manage billing" button on the dashboard opens it.
Set every variable from .env.example on your host, plus:
NODE_ENV=production
BILLING_MODE=live # dev bypass is ignored in prod anyway
NEXT_PUBLIC_SITE_URL=https://YOUR_DOMAIN
Production fails closed: grading is unavailable until
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_STUDENT_PRICE_ID and
STRIPE_STUDENT_PLUS_PRICE_ID are all set.
Deploy to any Node host (Vercel recommended — it's a standard Next.js app):
npm run build && npm start
Then point the Stripe webhook and Supabase redirect URLs at the deployed domain.
npm run dev # local dev server
npm run build # production build
npm run start # serve the production build
npm run lint # eslint
npm run typecheck # tsc --noEmit
npm test # vitest (grade math, schema, entitlements)
npm test covers: