ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.