ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Upload a handwritten practice essay for the CSS English Essay paper and get AI-assisted feedback on your outline, thesis, argument and evidence.
EducationTypeScript · PythonGitHub @Abdullah-creator-altOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Photograph a handwritten CSS practice essay and find out where it loses marks: which passages are strong, weak or off-topic, why, and the three fixes that matter most.
Built for AICON'26 Build With AI, domain EdTech & Workforce.
• Live app: add the Vercel URL here
• Example report (no AI call, sample data): /report/example
• How the AI works, in the app: /how-it-worksRead the full README ↗Photograph a handwritten CSS practice essay and find out where it loses marks: which passages are strong, weak or off-topic, why, and the three fixes that matter most.
Built for AICON'26 Build With AI, domain EdTech & Workforce.
/report/example/how-it-worksPakistan's Central Superior Services (CSS) exam is the main route into the federal civil service. In CSS 2025, 354 of 12,792 candidates (2.77%) passed the written exam (Daily Pakistan). In June 2025, FPSC officials told a Senate committee that most candidates fail in English Essay and English Précis, and that many lack logical structure in their arguments (ProPakistani). In CSS 2016, 81% failed the essay paper (Dawn).
Candidates write the essay by hand, and good feedback means a tutor or an academy: slow, expensive and concentrated in big cities.
Problem → Input → AI → Output → Impact
| Input | Phone photos of a handwritten essay (1 to 12 pages) and the topic. |
| AI | Gemini vision reads the handwriting; Gemini embeddings and a classifier trained in this project measure topic drift, generic writing and claim-to-evidence links; Gemini labels each sentence's argument role; two separate Gemini examiner runs score seven CSS rubric dimensions; Gemini explains three fixes and rewrites one paragraph. |
| Checks (code) | Every examiner quote is checked against the essay, every highlight must match the text, the band is derived in code, measurement and examiner disagreements are shown, and invented figures in the rewrite are replaced by marked slots. |
| Output | A marked-up essay where every highlight opens its reason and how it was found, seven scores, a topic-drift chart, an argument map, three ranked fixes and a before-and-after for each weak paragraph (up to three). |
| Impact | Specific, explainable feedback in about a minute, from a phone, at no cost to the candidate. |
Expected impact, not yet measured with students.
The pipeline is "measure first, judge second, verify everything". AI is used where the task needs it; plain code checks every AI answer before it reaches the student.
| Step | What the AI does | What the code checks | Model |
|---|---|---|---|
| 1. Read | Transcribes the photos into paragraphs, outline, legibility and uncertain words | Schema check; uncertain words are shown with a dotted underline | gemini-3.6-flash (vision), 3 fallbacks |
| 2. Embed | Turns topic, paragraphs and sentences into 768-d vectors | One shared cache per request; max 95 texts per essay, the rest marked unassessed | gemini-embedding-001 |
| 3. Measure (parallel) | Labels sentence roles; our logistic regression scores genericness; vectors measure topic drift and benchmark coverage | Rules link claims to evidence (cosine 0.82 strong / 0.76 weak), check rebuttals, convert similarity to 0-100 relevance | gemini-3.6-flash + trained classifier |
| 4. Examine | Two runs score 7 rubric dimensions and must quote the essay | Every quote must appear in the essay (ignoring case, spacing and quote style, max 25 words); band derived in code; run disagreement shown | gemini-3.6-flash ×2 |
| 5. Blend | none | Per-sentence colour rules, examiner-vs-measurement conflicts, score = 40% measured + 60% examiner (20/80 for language) | none |
| 6. Coach | Explains 3 fixes and rewrites the weakest paragraphs (up to 3, one model call each, in parallel) | Code picks the problems and the paragraphs, only ones with measured problems; checks quotes, length and numbers on every rewrite; template fallback for fixes; a failed extra rewrite is skipped with a note | gemini-3.6-flash |
If a measuring step fails (for example, the free quota runs out), the report still opens and says which checks were unavailable instead of guessing. A busy AI service returns 503 with Retry-After.
Where the prompts are: lib/pipeline/steps.ts (handwriting), lib/structure/prompt.ts (sentence roles), lib/pipeline/examinerPrompt.ts (examiner), lib/pipeline/coachPrompt.ts (coach). Tuned thresholds: lib/config.ts and lib/pipeline/blendConfig.ts.
What one run costs: every analysis logs the Gemini calls and tokens it used per model (usageTotal in the server log, and the "Gemini usage" table under /new?debug=1 with ALLOW_DEBUG=true locally).
Small tests, mostly on synthetic data. They show each part works as designed. They do not show that the scores match FPSC examiners.
| Check | Result | Data |
|---|---|---|
| Topic drift: off-topic paragraphs caught | 97.5% correct on 80 paragraphs (95% of off-topic caught, 100% on-topic kept) | Synthetic (data/drift-eval.json) |
| Genericness classifier | 100% on 110 held-out sentences; a smoke test, the data is too clean | Synthetic (data/genericness-model.json) |
| Benchmark checklist matching | AUC 0.91 at threshold 0.80, 40 paragraphs | Synthetic (data/benchmark-eval.json) |
| Examiner quotes not in the essay | 1 of 11 caught and removed, one test run | Test essay (data/eval/examiner-metrics.json) |
| Coach quotes not in the essay | 2 of 3 caught and replaced, one test run | Test essay (data/eval/coach-metrics.json) |
| End-to-end time | 46 s for 2 pages / 178 words, one recorded run | Test essay |
tests/fixtures/). data/cache/, data/reference-raw/ and tests/assets/private/ are git-ignored.npm run build:data, npm run build:benchmark).npm install
cp .env.example .env.local # add GEMINI_API_KEY (server-only)
npm run dev # http://localhost:3000
Tests (no API key, no AI calls):
npm test # unit tests
npm run test:e2e # browser tests with saved fixtures (Chromium)
npx tsc --noEmit # type check
One real end-to-end run, and how to save it as a demo report: docs/LOCAL-TEST.md.