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.