ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
AI Socratic tutor for Singapore A-Level General Paper essay practice
Translation pending
AI summary · README
EducationJavaScript · PythonGitHub @surajparapillyOnlineOwner 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.
Socra — a Socratic tutor for General Paper
Socra is an AI tutoring app for the Singapore A-Level General Paper (GP). A
student submits a GP essay question and is guided through a structured Socratic
dialogue that makes their thinking visible and pushes against it. It never hands
over a model answer — instead it builds an Essay Blueprint alongside the
conversation and tracks the reasoning moves the student demonstrates.
Status: personal project, shared as a reference / portfolio piece. Not
affiliated with Cambridge Assessment or SEAB.Read the full README ↗Socra is an AI tutoring app for the Singapore A-Level General Paper (GP). A student submits a GP essay question and is guided through a structured Socratic dialogue that makes their thinking visible and pushes against it. It never hands over a model answer — instead it builds an Essay Blueprint alongside the conversation and tracks the reasoning moves the student demonstrates.
Status: personal project, shared as a reference / portfolio piece. Not affiliated with Cambridge Assessment or SEAB.
The dialogue moves through phases (current_phase in the per-turn metadata):
| Phase | Name | Focus |
|---|---|---|
| 1 | Question Autopsy & Thesis Lock | Command word, loaded terms, the two positions, iterating to a precise thesis |
| 2 | Argument Sketch | Skeleton-first — lock every topic sentence and the counter-argument claim before any paragraph development |
| 3 | Deep Dives | Student-selected: develop each paragraph, the counter-argument, and the conclusion independently |
| 6 | Complete | Session finished |
While the student works, the backend maintains a live blueprint (key terms, thesis, paragraphs, counter-argument, conclusion) and a cross-session memory profile (which of five thinking moves the student has mastered, recurring strengths and weaknesses, score history).
uv for packagingclaude-3-7-sonnet-20250219 by default; override with ANTHROPIC_MODEL)uvgit clone https://github.com/<you>/socra.git
cd socra
Create a project, then apply the schema:
backend/schema.sql → Runsupabase db execute --file backend/schema.sqlThis creates all tables with Row Level Security policies. Email/password auth is on by default in Supabase; no extra config needed.
To give an account access to the developer-only endpoints (eval viewer, session reset), set its metadata in Authentication → Users → (user) → Raw app metadata:
{ "role": "developer" }
cd backend
cp .env.example .env # then fill in the values (see below)
uv sync # creates .venv and installs dependencies
uv run uvicorn main:app --reload --port 8000
The API starts on http://localhost:8000 (GET /health to check).
cd frontend
cp .env.example .env # then fill in the values (see below)
npm install
npm run dev
Open http://localhost:5173.
backend/.env| Variable | Required | Notes |
|---|---|---|
ANTHROPIC_API_KEY | yes | All AI calls |
SUPABASE_URL | yes | Project URL |
SUPABASE_ANON_KEY | yes | Anon/public key — the backend builds a per-request client from the caller's JWT so RLS applies |
EXA_API_KEY | for Learn mode | Article search + cache seeding |
ANTHROPIC_MODEL | no | Model override; defaults to claude-3-7-sonnet-20250219 |
FRONTEND_URL | prod only | Added to the CORS allow-list; required when RENDER is set |
DEV_ACCOUNT_EMAIL | no | Bypasses the session rate limit for this one account |
SUPABASE_SERVICE_ROLE_KEY | no | Only used by the standalone maintenance scripts (query_db.py, fix_turn_db.py, …), not the app. Some scripts read it as SUPABASE_KEY |
frontend/.env| Variable | Required | Notes |
|---|---|---|
VITE_SUPABASE_URL | yes | Same project URL |
VITE_SUPABASE_ANON_KEY | yes | Same anon key |
VITE_API_URL | no | Backend base URL; defaults to http://localhost:8000 |
VITE_PUBLIC_POSTHOG_TOKEN | no | Analytics; analytics is skipped if unset |
VITE_PUBLIC_POSTHOG_HOST | no | Defaults to https://us.i.posthog.com |
backend/
main.py FastAPI app — session lifecycle, streaming chat, nudges
ai.py SocraAI — system prompt, SSE streaming, blueprint extraction
memory.py Cross-session student memory
plato.py "Plato" — greeting, insight notes, session reflection
learn_routes.py Article search via Exa, cached in Supabase
bank_routes.py Saved/archived blueprints (knowledge bank)
blueprint_routes.py Live blueprint CRUD (deep-merge PATCH)
article_cache.py Supabase-backed Exa cache
schema.sql Supabase schema + RLS policies
data/fixtures/ Scripted conversations for the eval framework
run_evals.py Replay-based evaluation harness
frontend/src/
App.jsx Routes + session re-hydration
components/ Screens (chat, blueprint, bank, profile, …)
context/ Auth + session providers
lib/supabase.js fetchWithAuth — injects the Supabase bearer token
# Backend — replay fixtures through SocraAI and check SSE / metadata shape
cd backend && uv run python run_evals.py # needs ANTHROPIC_API_KEY
# Frontend — Playwright
cd frontend && npm test
The repo includes a backend/render.yaml (Render web
service) and a frontend/vercel.json (Vercel). Set the
backend's FRONTEND_URL to the deployed frontend origin so CORS allows it, and
point the frontend's VITE_API_URL at the deployed backend.