ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Find your Cal Poly class space for chat, meetups, shared notes and voice memos, sourced Circle AI answers, and copy/paste Quizlet export.
EducationTypeScript · JavaScriptGitHub @benjamina107OnlineOwner 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.
StudyCircle is a mobile-friendly web app for Cal Poly students. Verified campus accounts join course/professor groups to organize meetups, chat, message classmates, and share notes. ClassAI uses those notes to answer questions with sources and generate cards for Quizlet import.Read the full README ↗StudyCircle is a mobile-friendly web app for Cal Poly students. Verified campus accounts join course/professor groups to organize meetups, chat, message classmates, and share notes. ClassAI uses those notes to answer questions with sources and generate cards for Quizlet import.
| Layer | Technology | Purpose |
|---|---|---|
| App | Next.js 16.3.4 App Router, React 19.2.8, TypeScript 5 | Server-rendered pages, interactive client components, API routes, and Server Actions in one app |
| Styling | Tailwind CSS 4, global CSS, CSS Modules | Responsive layouts and component styles |
| Runtime | Node.js 22.22.2 (.nvmrc), npm, tsx | Runs Next.js, TypeScript scripts, and the background worker |
| Backend | Supabase Auth, Postgres, Storage | Accounts, relational data, access policies, and private uploaded files |
| AI | OpenAI SDK, Postgres pgvector | Source extraction, embeddings, retrieval, and grounded answers |
| Supabase Auth email + Resend | Verification through configured SMTP; Resend HTTP API for notification testing | |
| Quality | ESLint 9, TypeScript, Node test runner, PGlite | Linting, type checks, unit tests, and local SQL tests |
Other runtime libraries are @supabase/ssr for cookie-based sessions, @supabase/supabase-js for database/storage calls, file-type for file-signature detection, pdf-lib for PDF inspection and page splitting, mammoth for DOCX text, yauzl for DOCX archive checks, and sharp for image processing. Audio validation requires the system executable ffprobe.
Browser
└─ Next.js pages + React client components
├─ API routes / Server Actions → Supabase Auth + Postgres
└─ Authorized file operations → private Supabase Storage
Postgres job queue
└─ Separate Node worker → Storage + OpenAI → passages / AI replies
└─ Browser polls APIs for messages and processing status
Server Components load the authenticated user and class context. Client components manage interactive forms, selected channels, messages, uploads, and previews with React hooks. API routes handle client requests; Server Actions handle operations such as profile edits, enrollment, and meetups. The active workspace uses HTTP polling for new messages and upload status.
The core data hierarchy is course → professor/term subspace → enrolled sections. A student's section enrollments determine access to the corresponding class group. Postgres also stores profiles, meetups and attendance, chat messages, direct messages, and notification preferences.
The active notes system separates each student's contribution (kb_uploads) from its deduplicated processing asset (kb_assets). Indexed passages and embeddings support retrieval. Shared class chat and private AI conversations use study_messages; human direct messages use class_direct_messages.
Supabase Row Level Security (RLS) and server-side authorization enforce class membership and private-message visibility. The browser uses a publishable key; privileged operations and worker jobs use a server-only secret/service-role key. Mutations validate inputs and origin where applicable, with database-backed quotas for messages, uploads, and AI requests. File downloads recheck access before issuing expiring signed URLs.
@calpoly.edu address, verifies through Supabase Auth email, and signs in with a cookie-based session. Protected pages require a verified account./spaces opens the remembered accessible class, or an enrolled fallback. /chats opens its chat. The class header switches between Meetups, Chat, Classmates, and Files; switching classes preserves the current tab. Students without enrollments go to Profile.@Circle AI, @AI, or @ClassAI in shared chat queues a class-visible AI response; messages in private AI chat queue a private response.class-notes bucket.pgvector.OpenAI integrations are the Responses API for extraction and answers (default gpt-5.4-mini, configurable), Embeddings API (text-embedding-3-small, 1,536 dimensions), and Audio Transcriptions API (whisper-1). Uploaded content is treated as untrusted reference material. Answers are probabilistic; citations let students check the original sources.
Supported inputs are PDF, images, plain text, DOCX, and audio. Main limits are 1–5 files per submission, 25 MB per file, a 30 MB request ceiling, 60 PDF pages, and one hour of audio. DOCX embedded images require separate uploads. Video, slides, spreadsheets, scheduled summaries, and automatic Quizlet publication are outside the current implementation. See AI setup and limits.
AI reply bodies render Markdown (including tables, lists, and code) with react-markdown and remark-gfm. remark-math, rehype-katex, and KaTeX render inline $…$ / \(…\) and display $$…$$ / \[…\] equations. Code stays literal; raw HTML and remote images are disabled. Human messages and Quizlet exports remain plain text. Run npm run test:markdown for rendering tests, or open /preview/markdown in development for a visual check. Restart the worker after deploying changes to its formatting instructions.
Paths below are relative to the app. Class-scoped study and classmates requests use a class query parameter containing the subspace ID.
| Endpoint | Methods | Responsibility |
|---|---|---|
/api/auth/{signup,login,logout,resend,verify,callback} | Varies by operation | Supabase account creation, sessions, and verification |
/api/study/messages | GET, POST, PATCH | Read/send shared or private AI messages; retry failed AI requests |
/api/study/uploads | GET, POST | List contributions and upload notes for indexing |
/api/study/uploads/[id] | GET, POST, DELETE | Preview/download, retry processing, or remove an owned contribution |
/api/classmates | GET, POST, PATCH | Class roster, paginated direct messages, sending, and read receipts |
/api/notifications/test | POST | Send the signed-in user a test email through Resend |
/api/chat/overview, /api/chat/messages | GET; GET/POST | Separate chat implementation retained in the repository |
/api/class-files, /api/class-files/[id]/download | GET/POST; GET | Separate file/attachment implementation retained in the repository |
The active Chat and Files pages use /api/study/*. The separate class_files APIs/components and legacy lecture code are not the active Files view. Old class Lectures URLs redirect to Files. Notification preferences and a test email endpoint exist, but automatic event notification dispatch is not wired up. Supabase handles verification emails; it does not use the placeholder verification helper in src/lib/email.ts.
| Location | Contents |
|---|---|
src/app/ | Landing/auth pages, protected workspace routes, API handlers, and Server Actions |
src/components/study/ClassWorkspace.tsx | Active class chat, private AI, and indexed Files UI |
src/components/classmates/ | Class roster and direct-message UI |
src/features/class-meetups/ | Meetup UI, validation/access, and actions |
src/lib/knowledge/ | Upload validation, extraction, retrieval, OpenAI integration, and worker logic |
src/lib/supabase/, src/lib/auth.ts, src/proxy.ts | Supabase clients, authentication, and session refresh |
scripts/ | Worker entry point, environment/hosted checks, and catalog validation |
supabase/migrations/ | Versioned SQL schema, functions, and access policies |
tests/, colocated *.test.* files | SQL, feature, and validation tests |
docs/ | Detailed setup, feature contracts, and verification notes |
nvm use
npm ci
cp .env.example .env.local
# Fill in .env.local, then:
npm run dev
Run the AI worker in a separate terminal:
npm run worker
| Environment variable | Purpose |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Supabase project URL |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Browser-safe Supabase key |
APP_URL | Canonical app origin; localhost for development, HTTPS in production |
SUPABASE_SECRET_KEY or SUPABASE_SERVICE_ROLE_KEY | Server/worker privileged Supabase access |
OPENAI_API_KEY | Server/worker OpenAI access |
OPENAI_RESPONSE_MODEL | Optional extraction/answer model override |
FFPROBE_PATH | Optional executable path; defaults to ffprobe |
RESEND_API_KEY, EMAIL_FROM | Optional notification test configuration with a verified sender |
Configure verification SMTP and Auth redirects in Supabase separately. SMTP_URL appears in the example environment file but is not used by the current mail implementation. Never put privileged keys in NEXT_PUBLIC_ variables or commit secrets. Follow team setup and email setup.
The repository currently contains 18 SQL migration files: 202609050001–202609050016 and 202609060001–202609060002. Version 202609050004 is a historical marker without executable SQL. Compare hosted migration history and apply only missing reviewed versions; do not reset the shared database. The database inventory describes the original 17-table baseline, not the complete current schema.
Production requires a server-capable Next.js deployment (npm run build, then npm start for Node hosting) plus a supervised persistent npm run worker process. Next.js alone does not drain AI jobs. Configure private Storage, Auth redirects/SMTP, server secrets, ffprobe on web and worker hosts, and suitable upload size/time allowances.
npm test
npm run test:auth
npm run test:knowledge
npm run typecheck
npm run lint
npm run build
Additional scripts cover feed, catalog, profiles, and email notifications. npm run check:supabase checks hosted Auth configuration and anonymous denial for the original 17-table contract; it does not validate all later migrations, Storage, or worker processing. Local tests and fictional preview pages do not establish hosted readiness. See remaining Files acceptance checks and the detailed setup guides before deployment. Some older feature documents describe historical implementations; the active route wiring and SQL migrations are the implementation reference.