ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Short missions, real-world challenges and stories for anyone working out who they are and where they're heading.
EducationTypeScript · PLpgSQLGitHub @dfenwickspsOnlineOwner 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 mission-based, self-guided web app for teenagers that supports development of identity, purpose, connection, and meaning.
This repo contains the full MVP foundation:Read the full README ↗A mission-based, self-guided web app for teenagers that supports development of identity, purpose, connection, and meaning.
This repo contains the full MVP foundation:
groundwork), set a database password, choose a regionsupabase/schema.sql from this repoThis creates all tables, sets up Row Level Security, creates the user auto-creation trigger, and seeds the 8 stories.
Verify: After running, go to Table Editor and check that stories has 8 rows.
Already have a database from an earlier version? schema.sql is kept current, but an
existing project also needs the files in supabase/migrations/ run in order (002, 003,
004, 005, 006, …). Each one is idempotent, so running them again is safe. Features whose migration
hasn't been run show a "being switched on shortly" note rather than erroring — so if a
section of the Me page says that, a migration is outstanding.
If you skip this, email/password auth will still work.
In Supabase: Settings → API
Copy:
Project URL → NEXT_PUBLIC_SUPABASE_URLanon public key → NEXT_PUBLIC_SUPABASE_ANON_KEYservice_role key → SUPABASE_SERVICE_ROLE_KEY (keep this secret)In Anthropic Console: API Keys → create a new key → ANTHROPIC_API_KEY
cp .env.local.example .env.local
Fill in your values:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
ANTHROPIC_API_KEY=sk-ant-...
NEXT_PUBLIC_APP_URL=http://localhost:3000
npm install
npm run dev
Open http://localhost:3000.
In Supabase: Authentication → URL Configuration
Add to Redirect URLs:
http://localhost:3000/auth/callback
For production, also add:
https://your-domain.vercel.app/auth/callback
.env.localNEXT_PUBLIC_APP_URL to your Vercel URLsrc/
├── app/
│ ├── page.tsx # Landing page
│ ├── auth/
│ │ ├── page.tsx # Sign in / sign up
│ │ └── callback/route.ts # OAuth callback handler
│ ├── onboarding/
│ │ └── page.tsx # 3-step onboarding
│ ├── dashboard/
│ │ ├── page.tsx # Server component (data fetching)
│ │ └── DashboardClient.tsx # Client component (UI)
│ ├── missions/[id]/
│ │ ├── page.tsx
│ │ ├── MissionDetailClient.tsx
│ │ └── activities/[activityId]/
│ │ ├── page.tsx
│ │ └── ActivityClient.tsx # Handles all activity types
│ ├── journal/
│ ├── stories/
│ ├── support/
│ ├── settings/
│ └── api/
│ └── reflect/route.ts # AI reflection endpoint
├── components/
│ └── layout/
│ └── AppShell.tsx # Nav + page wrapper
├── lib/
│ ├── supabase.ts # Client + server Supabase instances
│ ├── missions.ts # Mission/activity data (content layer)
│ └── utils.ts # Utility functions
├── types/
│ └── database.ts # Full TypeScript types for Supabase schema
└── middleware.ts # Route protection
Typography
Colour palette
| Name | Hex | Used for |
|---|---|---|
| Navy | #1B3A5C | Primary, Mission 1 |
| Teal | #2E7D8C | Accent, Mission 2, interactive states |
| Gold | #C8982A | Challenges, milestones, Mission 4 |
| Sage | #4A7C59 | Success, Mission 3 |
| Surface muted | #F8F8F6 | App background |
Component classes (defined in globals.css)
.card — standard card with soft shadow.card-elevated — raised card.btn, .btn-primary, .btn-secondary, .btn-teal — button variants.input — form input.journal-textarea — writing area.progress-bar / .progress-fill — mission progress[data-animate="N"] — staggered fade-up on mountPhases not yet built (from the original spec):
To see where students stop, run migration 015_completion_counts.sql, then:
npm run report:completion
It prints totals only: sign-ups, each mission step and each program week. Counts under five are
shown as "fewer than 5". It reads NEXT_PUBLIC_SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY from the
environment or .env.local, and it won't run before COUNTS_START in src/lib/completionCounts.ts,
because students were told about the counts in the app (and on the privacy page) two weeks before they
could be read.
When running this as a school pilot: