ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A web application that generates conflict-free school timetables automatically.
School administrators upload their data (teachers, classes, subjects, rooms,
constraints) and the app produces an optimized, conflict-free schedule using a
constraint solver — instead of building timetables by hand in a spreadsheet.
Non-technical school administrators (initial target market: schools in India).
The product philosophy is "simple surface, powerful engine": the UI stays
minimal, and advanced scheduling rules are opt-in rather than required.檢視完整 README ↗A web application that generates conflict-free school timetables automatically. School administrators upload their data (teachers, classes, subjects, rooms, constraints) and the app produces an optimized, conflict-free schedule using a constraint solver — instead of building timetables by hand in a spreadsheet.
Non-technical school administrators (initial target market: schools in India). The product philosophy is "simple surface, powerful engine": the UI stays minimal, and advanced scheduling rules are opt-in rather than required.
| Layer | Technology | Why |
|---|---|---|
| Solver | Google OR-Tools (CP-SAT) | Purpose-built constraint solver; handles hard + soft scheduling constraints well |
| Backend | Python + FastAPI | Best-supported language for OR-Tools; FastAPI gives free auto-generated API docs |
| Frontend | React + Tailwind CSS | Component-based UI, fast to style, widely supported |
| Database | PostgreSQL | Relational data (schools, teachers, classes, constraints) with strong consistency guarantees |
| Import/Export | SheetJS (xlsx) | Reads/writes Excel files in-browser and on the server |
| Hosting | Railway or Render | Simple deploys for a Postgres + API + static frontend stack |
See docs/ARCHITECTURE.md for how the pieces fit
together, and docs/GETTING_STARTED.md to run the
project locally.
timetable-app/
├── backend/ FastAPI application + OR-Tools solver
│ ├── app/
│ │ ├── core/ config, database connection
│ │ ├── models/ SQLAlchemy database models
│ │ ├── schemas/ Pydantic request/response schemas
│ │ ├── routers/ API endpoints
│ │ └── services/ business logic, incl. the solver service
│ └── tests/
├── frontend/ React + Tailwind admin UI
└── docs/ Architecture and setup documentation
Full interactive docs (try-it-out included) are at /docs once the backend
is running. Currently available:
/api/auth/signup, /api/auth/login, /api/auth/me — email/password
auth, returns a JWT used as Authorization: Bearer <token> on every
other request/api/schools — create/list/get, scoped to the logged-in user
(owner_id)/api/subjects, /api/rooms, /api/periods, /api/teachers,
/api/class-groups, /api/constraints — full CRUD (create, list, get,
update, delete), each filterable by ?school_id=. Class groups also
carry a grade field (e.g. "Grade 8") for the Grade > Section hierarchy./api/class-groups/{id}/requirements — how many periods/week a class
group needs of a subject (nested under class groups)/api/constraints/parse (POST) — turns plain-English constraint text
into a structured Constraint row; see "NLP constraints" below/api/timetables/generate?school_id= (POST) — runs the real solver
against a school's teachers/class groups/subject requirements/periods
and saves the result as a draft timetable/api/timetables/{id} and /api/timetables?school_id= — fetch a
generated timetable with human-readable names filled in/api/solver/test — diagnostic endpoint that runs a small built-in
OR-Tools example, useful to confirm the solver install worksAlso built (this section previously said "not yet"): CSV/Excel bulk
import for subjects, rooms, teachers, and class groups
(/api/{resource}/bulk-import, app/services/bulk_import.py), and
best-effort room assignment as a second solver pass
(_assign_rooms in app/services/solver.py). Not yet built: Google
sign-in (needs an OAuth client only you can create).
POST /api/constraints/parse tries an LLM call first
(app/services/llm_constraint_parser.py, calls Claude with the school's
real teacher/subject/class-group names so it only ever returns names that
actually exist) and falls back to a pattern-matching parser
(app/services/constraint_parser.py) if no ANTHROPIC_API_KEY is set or
the call fails for any reason — same input/output shape either way, so
the rest of the router doesn't care which one produced a given result.
Most constraint types are read directly by the solver
(app/services/solver.py), not just recorded: workload limits
(Teacher.max_periods_per_week), availability
(Teacher.unavailable_period_ids, e.g. "not available on Fridays"),
subject-vs-first/last-period placement, subject-vs-day placement, max
consecutive periods (per subject or per teacher), minimum gap between two
subjects, and subject-sequencing ("Math can't immediately follow PE") are
all hard constraints in the CP-SAT model — see backend/tests/test_solver.py
for a couple of regression tests proving the availability and placement
cases actually hold. The one exception is the catch-all
scheduling_rule type: free-text that doesn't match any of the specific
patterns above is still saved and shown in the Constraints tab, but isn't
mechanically enforceable, so the UI marks that one honestly as "Not yet
enforced by the solver" (ConstraintOut.enforced, computed in
app/routers/constraints.py).
The admin UI matches the uploaded design: auth screen, then a Grade > Section sidebar with four tabs per section.
See frontend/src/api.js for the full list of API calls the UI makes, and
frontend/src/components/ for each screen. A few older components
(SubjectsPanel, TeachersPanel, ClassGroupsPanel, RoomsPanel,
TimetablePanel) are left in place but unused/superseded — each has a
comment saying so and is safe to delete.
Full auth (signup/login/JWT) is in place, schools are scoped to their
owner (plus invite-based admin/viewer memberships), and the frontend
matches the uploaded design end-to-end: sidebar grade/section tree,
combined subjects+teachers data entry, NLP-style constraint input, and a
generate flow with By Section / By Teacher views. The real solver reads a
school's actual data from the database, builds a CP-SAT model (subject
requirements met exactly, no teacher/class double-booking, teacher
max-hours and availability respected, plus the placement/consecutive/
sequencing constraint types described above), assigns rooms as a
best-effort second pass, and either returns a conflict-free schedule or a
clear reason it couldn't. CSV/Excel bulk import, Excel/PDF export, and a
manual same-day substitution log are also built. Scope is intentionally
generic (not locked to one curriculum or school type yet) — see
docs/ARCHITECTURE.md for the data model reasoning and open decisions.
Next up, roughly in priority order: Google sign-in (once you've created
OAuth credentials), per-resource ownership checks now that multiple
admins per school are possible (see "Open decisions" in
docs/ARCHITECTURE.md), and diagnosing infeasibility caused by an
interaction between several constraints rather than one alone.