ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A private university for the things you actually learn from.
You file a transcript, a video link, or a document under a course, and Studiolo
turns it into two things you can use: highlights (what this material is
actually saying) and step by step (what to do to set it up). Everything
keeps its provenance — who made it, which course it came from, the link back to
the original.檢視完整 README ↗A private university for the things you actually learn from.
You file a transcript, a video link, or a document under a course, and Studiolo turns it into two things you can use: highlights (what this material is actually saying) and step by step (what to do to set it up). Everything keeps its provenance — who made it, which course it came from, the link back to the original.
Runs two ways. With no configuration it stores everything in one browser (IndexedDB) with no account — open it and it works. Add two Supabase env vars and the same app becomes account-backed and follows you between devices; see docs/supabase-setup.md.
Faculty A field you keep returning to → sidebar
└── Course One body of material, yours or someone else's
│ grouped by track: "Level 0", "Level 1", "Companion"
└── Lesson One transcript / video / document / post
grouped by section: the module inside the course
A lesson always records where it came from: creator, material type, video link, link to the original lesson, and the source file name when the text came from an upload.
It holds three kinds of text, deliberately kept apart:
| what it is | |
|---|---|
| Transcript | what was said |
| Lesson text | what the author wrote — key points, action item, workbook links |
| My notes | what you thought |
Video embeds when it can (YouTube, Vimeo, Loom). Platforms that block framing get a card naming the host, so the video opens in a tab while the transcript and your notes stay put.
npm install
npm run dev # http://localhost:3000
Other scripts: npm run build, npm run start, npm run typecheck.
The app opens with a small demo library so there is something to look at. Settings → Start empty clears it; Reset brings it back.
| Screen | What it is for |
|---|---|
| Discover | What you are mid-way through, your faculties, pinned courses, what came in recently |
| Faculty | The courses inside one field of study |
| Course | Its lessons, filtered by to study / studying / done, with progress and source |
| Lesson | The study view: video, highlights, step-by-step checklist, full transcript, your own notes |
| Library | Every course across all faculties |
| Creators | Who your material came from, and what you have of theirs |
| Search | Full text across titles, topics, notes and every stored transcript |
| Settings | Export / import your library as JSON, reset, clear |
The Add material dialog takes:
.txt, .md, .vtt, .srt. Subtitle files are stripped
of timestamps, cue numbers and the duplicate lines YouTube exports, then
re-flowed into paragraphs (lib/transcript.ts).lib/insights.ts is the seam where a model will eventually sit. Today it runs
offline and deterministically, so the interface is real without any key or
network call:
Swapping this for a model call means replacing the body of analyzeTranscript
and setting engine: "model" on the result. Nothing in the UI has to change.
app/
layout.tsx Provider + shell
page.tsx Discover
faculty/[facultyId]/ Courses in a faculty
course/[courseId]/ Lessons in a course
lesson/[lessonId]/ The study view
library/ creators/ search/ settings/
components/
AppShell, Sidebar, TopBar Frame
FacultyDialog, CourseDialog, LessonDialog, CreatorPicker
cards.tsx, ui.tsx, Icon.tsx Cards, primitives, icon registry
lib/
types.ts The whole domain model — read this first
store.tsx React context: selectors + every mutation
persistence.ts The storage boundary (localStorage today)
insights.ts Transcript → highlights, steps, tools
transcript.ts Caption cleanup, YouTube ids, word count
seed.ts The demo library
theme.ts Accent tokens
Two boundaries are deliberate and worth keeping:
useLibrary(),
which goes through persistence.ts.Database in lib/types.ts is the wire shape. It is what Settings
exports, and what the Supabase tables should mirror.docs/import-format.md describes a one-course JSON file. Drop files on
Settings → Add course files, several at once.
Importing merges — it never wipes. Re-importing a course updates it in
place, keeping your status and notes while refreshing the source material, so a
course can be imported as titles first and re-pulled once the transcripts exist.
docs/examples/ has a worked file.
supabase/schema.sql is already in place for
it.analyzeTranscript with a server
route. The result is already cached on the lesson (Lesson.study) and tagged
with which engine produced it.