ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Reading materials and exercises for the EA Netherlands Intro Fellowship
EducationTypeScript · CSSGitHub @ea-netherlandsOnlineOwner 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.
A web platform for managing the EA Netherlands Intro Fellowship programme. Participants work through a 5-week reading curriculum, facilitators track their group's progress and schedule sessions, and coordinators manage applications, groups, and participants through an admin panel.
Live URL: https://introcourse.effectiefaltruisme.nl
Stack: Next.js 15 (App Router) · Drizzle ORM · PGlite (dev) / Neon Postgres (prod) · Tailwind CSS v4Read the full README ↗A web platform for managing the EA Netherlands Intro Fellowship programme. Participants work through a 5-week reading curriculum, facilitators track their group's progress and schedule sessions, and coordinators manage applications, groups, and participants through an admin panel.
Live URL: https://introcourse.effectiefaltruisme.nl
Stack: Next.js 15 (App Router) · Drizzle ORM · PGlite (dev) / Neon Postgres (prod) · Tailwind CSS v4
npm install
npm run dev # starts on http://localhost:3000
On first run, the database is created automatically at data/introcourse-db/ (PGlite). No manual migration step needed in development — ensureMigrated() runs on the first incoming request.
To seed test data (participants, groups, sample progress):
npm run db:seed
To reset the local database:
rm -rf data/introcourse-db
src/
├── app/ # Next.js App Router pages & API routes
│ ├── admin/ # Coordinator-only admin panel
│ ├── apply/ # Public application form
│ ├── auth/ # Login, logout, magic-link verify
│ ├── group/[groupId]/ # Group chat + facilitator overview
│ ├── materials/ # Reading materials (sidebar layout)
│ ├── sessions/ # Session scheduling (facilitator)
│ └── account/ # Participant account page
├── components/
│ ├── sidebar.tsx # Main materials sidebar with nav links
│ └── ...
├── db/
│ ├── schema.ts # Drizzle schema (single source of truth)
│ └── index.ts # DB connection (PGlite / Neon dual-mode)
├── lib/
│ ├── auth.ts # Session cookie helpers
│ ├── lessons.ts # WEEK_DEFS, getAllWeeksWithLessons()
│ └── email.ts # sendEmail() wrapper (Resend + console fallback)
content/
└── modules/ # MDX lesson files (week-N-slug.mdx)
drizzle/ # SQL migration files
| Role | Access |
|---|---|
| participant | Materials, My account, Group chat |
| facilitator | All participant pages + Sessions, Group overview |
| admin | All pages + full admin panel |
Role is set in the participants table. Admins log in via the /admin/login password page; everyone else uses magic links.
/materialscontent/modules/lessonProgress table (by scroll depth / quiz submit)/group/[groupId]/accountThe left sidebar shows all relevant links for the logged-in user:
Facilitators see an extended navigation on all pages:
Materials | My account | Group chat | Sessions | Overview
/sessions/group/[groupId]/overview/materials)Access the admin panel at /admin (password login required).
/admin/participants/admin/groups/admin/applicationsparticipant record/admin/form-groups/admin/facilitators/admin/sessionsURL: /apply (public, no login required)
4-step form matching the Typeform intake questionnaire:
| Step | Fields |
|---|---|
| 1 — Motivation | Main reason for joining (multi-select, max 2); what prompted you |
| 2 — Background | Education level; career stage; occupation; work area; motivation essay (~120 words) |
| 3 — Logistics | Language preference (NL/EN); availability (Mon 17:30, Mon 19:30, Thu 17:30, Thu 19:30, Other); online/in-person preference |
| 4 — Contact | Name; email; phone; city; LinkedIn URL; how you heard about us; privacy consent checkbox |
Submissions are stored in the applications table. Privacy consent is required (400 error if unchecked).
/auth/loginlogin_tokens and emailed via Resend (or logged to console in dev)/auth/verify?token=... → session cookie set → redirect to /materialsDev shortcut: after requesting a magic link, fetch the token from:
GET /api/dev/latest-email
Returns { to, subject, links: [url] } — navigate to links[0] to sign in instantly.
/admin/loginADMIN_PASSWORD environment variablePOST /auth/logout — clears the session cookieSchema is defined in src/db/schema.ts. After changing the schema:
npm run db:generate # generates a new SQL migration in drizzle/
npm run db:migrate # applies pending migrations
Migrations run automatically on the first request in dev (via ensureMigrated()). In production they run on deploy via npm run db:migrate.
| Table | Purpose |
|---|---|
participants | All users (participants, facilitators, admins) |
groups | Cohort groups |
applications | Intake form submissions |
lessonProgress | Per-user per-lesson scroll/completion tracking |
fellowshipSessions | Scheduled group sessions |
groupPosts / groupPostReplies | Group discussion board |
login_tokens | Magic-link tokens (expire after 30 min) |
email_log | Dev-only email log for the /api/dev/latest-email endpoint |
Lessons live in content/modules/ as MDX files. The sidebar and navigation update automatically when files are added or removed.
---
title: "Week 1: Doing good better"
week: 1
description: "An introduction to effective altruism."
estimatedMinutes: 45
exercises:
- key: unique_key
question: "Your question here"
type: textarea # textarea | text | radio | checkbox
options: # required for radio / checkbox
- Option A
- Option B
required: true
---
content/modules/week-N-slug.mdx with the frontmatter above| Type key | Icon | Meaning |
|---|---|---|
reading | 📖 | Standard reading lesson |
objectives | 🎯 | Learning objectives |
quiz | ❓ | Comprehension quiz |
exercise | ✏️ | Interactive exercise |
wrap | ✅ | Week wrap-up |
appendix | 📎 | Optional extra reading |
Copy .env.example to .env.local and fill in the values:
| Variable | Required | Description |
|---|---|---|
DATABASE_URL | Prod only | Neon Postgres connection string. Omit to use local PGlite. |
RESEND_API_KEY | Optional | Resend API key for sending real emails. Falls back to console logging. |
ADMIN_PASSWORD | Yes | Password for the /admin/login page |
SESSION_SECRET | Yes | Secret used to sign session cookies (min 32 chars) |
NEXT_PUBLIC_BASE_URL | Yes | Full origin URL, e.g. https://introcourse.effectiefaltruisme.nl |
The app deploys to Vercel automatically on push to main.
git push origin main # triggers Vercel deploy
Database: set DATABASE_URL in Vercel environment variables to your Neon Postgres connection string.
Migrations: add a build command override in Vercel: npm run db:migrate && next build.
DATABASE_URL in VercelADMIN_PASSWORD, SESSION_SECRET, NEXT_PUBLIC_BASE_URL, and optionally RESEND_API_KEYmain — Vercel builds, runs migrations, and deploysean-office-main/ is a read-only reference folder. All changes go in this repository only.