ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
Essence는 대학 에세이를 읽어 감정을 선언한 부분을 찾아 한 번에 하나씩 정확한 질문을 제시하고, 모든 문장은 그대로 유지합니다
Essence reads your college essay, finds the moments where you declared a feeling instead of showing it, and asks one precise question at a time. Every word stays yours.
교육TypeScript · PLpgSQLGitHub @Shikitoafk온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Get sharper questions, not rewritten sentences. Every word stays yours.
Essence is a Socratic feedback tool for college application essays. It reads a
draft once, properly — a full structural diagnostic against a 20-point error
checklist and an admissions-consulting framework — then works through what it
found one question at a time, in chat.README 전문 보기 ↗Get sharper questions, not rewritten sentences. Every word stays yours.
Essence is a Socratic feedback tool for college application essays. It reads a draft once, properly — a full structural diagnostic against a 20-point error checklist and an admissions-consulting framework — then works through what it found one question at a time, in chat.
It never writes a sentence for the student. That isn't just a prompt instruction; the interface has no "insert", no "suggested text", and no way to paste the AI's words into the draft. Answers the student types back are raw material for them to write with.
structural, developmental, polish or done. This exists
because a tool built to find weaknesses will find them forever: without an
endpoint students loop between fixes and eventually sand away what made the
essay theirs. The engine is told which round it's on, instructed not to
invent a new tier of objections to justify a later read, and to flag fewer
spots or none once a draft is at rest. At polish and done the interface
stops inviting another round — the button reads "Read again anyway".Next.js 16 (App Router) · TypeScript · Tailwind CSS v4 · Supabase (auth + Postgres) · Gemini API · deployable to Vercel as-is.
npm install
Create a project at supabase.com, then:
supabase/schema.sql, and run it.
This creates every table, index and row-level-security policy. It's safe to re-run.supabase/migrations/002_readiness.sql.
New projects get those columns from schema.sql already.supabase/migrations in
numeric order. 008_growth_foundation.sql adds the privacy-safe product
funnel; 009_anonymous_trial.sql adds the rate-limited real-text trial on the
landing page. Until 008 is applied, growth events are discarded. Until 009
is applied, the trial shows an unavailable message; signed-in writing and
feedback still work.https://<your-domain>/auth/callback (and http://localhost:3000/auth/callback
for local work). Email/password works with no extra setup.Copy the example file and fill it in:
cp .env.example .env.local
| Variable | Where it comes from |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Supabase → Project Settings → API |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase → Project Settings → API |
GEMINI_API_KEY | aistudio.google.com/apikey |
TRIAL_RATE_LIMIT_SECRET | (optional) separate secret for anonymous-trial hashes; falls back to the Gemini key |
GEMINI_MODEL_DIAGNOSTIC | (optional) comma-separated model chain for the deep read |
GEMINI_MODEL_CONVERSATION | (optional) comma-separated model chain for chat turns |
NEXT_PUBLIC_SITE_URL | (production only) your deployed URL, for OAuth redirects |
npm run dev
Gemini generates the feedback. Which billing tier the key sits on is not a cost detail — it changes what happens to a student's essay:
| Trains on your text? | Human review? | |
|---|---|---|
| Gemini, paid tier | No | No |
| Gemini, free tier | Yes | Yes |
Google's unpaid-tier terms state: "Do not submit sensitive, confidential, or
personal information to the Unpaid Services." An application essay is personal
information, so a deployment serving real students belongs on a billed key with
GEMINI_PAID_TIER=true.
Before adding any provider, get its position on training and retention in
writing, and encode it in dataPolicy() — a vendor that will not answer that
question in writing defaults to safeForPersonalContent: false.
Whatever is configured, the app tells students the truth: dataPolicy() in
src/lib/ai/llm.ts drives both the privacy page and a
banner in the workspace, and warns prominently whenever the active provider may
train on what they paste. Its branches are covered by tests.
The two call types have very different costs, so they run on different models:
| Model tier | Free-tier ceiling | Per-user cap in this app | |
|---|---|---|---|
| Deep read (whole essay, once per draft) | Flash | ~5/min, ~20/day | 2/min, 8/day |
| Chat turn (one spot, short context) | Flash Lite | ~15/min, ~500/day | 8/min, 150/day |
Three things keep usage low:
ai_usage), not in memory, so they
hold across serverless instances.Drafts under 50 words never reach the API at all.
Model IDs change; the defaults live in src/lib/ai/gemini.ts
and are overridable by env var without touching code.
src/lib/ai/systemPrompt.ts holds the engine's
system instruction verbatim — the principles, framework, 20-point checklist,
5 nudge patterns, Mode A format, Mode B conversational rules, cross-essay
memory, and the "what to never do" list. Those rules are the product. Don't edit
them to change app behaviour — add to ENGINE_REFINEMENTS instead, so the
original spec stays diffable against its source file.
ENGINE_REFINEMENTS currently adds two things, both from reviewing real output:
Appended at call time are two further formatting-only contracts:
<<<SECTION:n>>> / <<<CARD>>>
markers, parsed by parseReport.ts into the
flagged_spots and essay_reports tables.resolved / needs_narrower / skipped verdict that drives the queue, and
any durable facts worth remembering.Every quoted line is re-anchored against the real draft before it is stored (tolerating smart quotes, dashes and collapsed whitespace). A card whose quote can't be found in the draft is dropped rather than shown — that's the guard against an invented quotation.
npm test # parser + quote-anchoring tests
npm run build # production build
Import the repo, add the same environment variables in Settings → Environment
Variables, and deploy. Set NEXT_PUBLIC_SITE_URL to the production URL so
OAuth redirects land correctly, and add that callback URL to both Supabase and
your Google OAuth client.
Essays live in your own Supabase project. Row-level security scopes every table to the signed-in owner. The only outbound path for essay text is the Gemini API call that generates feedback.
Vercel Analytics is enabled for page-view counts. It receives the URL path and
nothing else — no essay text, no conversation answers, no user identity — sets
no cookies and does no cross-site tracking. There is no advertising or ad
tracking. To remove it, drop <Analytics /> from
src/app/layout.tsx and uninstall @vercel/analytics —
and update the privacy page, which describes it to students by name.
The in-app Privacy & data page states all of this and lets students read and delete every remembered fact.
No essay generation, autocomplete, or "write this paragraph for me" — that is against the product's core philosophy, not a missing feature. No plagiarism/AI-detection scoring. No payments; the app is fully functional and free.