ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A timetable web app for FCIM UTM students in Anul I and Anul II, built from
schedule PDFs published on the official FCIM timetable page.
Choose your course year and group to see your classes on desktop or mobile.
This is an independent project, not an official UTM service.
The app turns FCIM's PDF tables into a searchable timetable. Each course year has its
own schedule and update status. You can follow the source link and check when the
displayed timetable was last updated.README 전문 보기 ↗An independent, unofficial timetable app for FCIM students at the Technical University of Moldova. Choose Anul I or Anul II and your group to read official PDF timetables on desktop or mobile, with day/week views, search, and source/update information.
Built with Next.js, React, and TypeScript. The engineering work is turning PDF table geometry into validated lessons and keeping accepted schedules available when updates fail.
Live demo · Engineering case study · Architecture · Run locally
Desktop: Anul I, FAF-261, Friday selected; lesson cards and source/update details.
Captured from the public application on 22 October 2026 (Europe/Chisinau). These are observed timetable views, not a claim that the displayed lessons are current. The UI reports data updated on 9 October; the deployment SHA was not established. Capture provenance and full-resolution images.
The app turns FCIM's PDF tables into a searchable timetable. Each course year has its own schedule and update status. You can follow the source link and check when the displayed timetable was last updated.
Official FCIM PDFs are transformed into structured timetable data. The parser reconstructs table geometry—group columns, day blocks, merged cells, and half-cell week patterns—rather than treating the PDF as one stream of text. New candidates pass course and schedule validation before replacing the currently accepted timetable.
The app checks for updates periodically (every 30 minutes by default). If fetching or validation fails, it can continue serving the last accepted schedule. Local storage, optional PostgreSQL recovery, broker accepted state, and verified bundled seeds provide layers of recovery across restarts. A recovered timetable may be older than the latest FCIM publication; check its source and update status when freshness matters.
The source acquisition migration is documented in the migration verification and deployment runbook.
Use Node.js 22, matching CI and the application container. From the repository root:
npm ci
npm run dev
Open localhost:3000. These commands work in PowerShell and POSIX
shells. Basic startup does not require an .env file, a database, or broker credentials.
Both course years are enabled by default. Startup attempts recovery before background updates.
.env.example is optional configuration. To customize it in PowerShell:
Copy-Item .env.example .env
Normal deployments require zero SCHEDULE_SEED_* variables: the release supplies the
verified seeds. Configure SCHEDULE_ODD_WEEK_ANCHOR for the semester's odd-week calendar
when needed. See configuration and deployment
for storage, Docker, and broker setup.
Run the checks appropriate to the change; the CI workflow combines these tiers with linting and builds.
| Tier | Commands and prerequisites |
|---|---|
| Application types and unit/parser tests | npm run typecheck, npm test (Vitest with local fixtures and mocked upstream requests) |
| PostgreSQL 16 integration | Set DATABASE_URL to a disposable test database; run npm run db:migrate, then npm run test:db |
| Browser E2E | npm run build, npx playwright install chromium, then npm run test:e2e (Playwright) |
| Worker | npm run typecheck:worker, npm run check:worker (Wrangler dry runs; no deployment) |
| MD Publisher | npm run typecheck:publisher, npm run build:publisher |
See testing and parser diagnostics for PowerShell database setup and PDF inspection commands.
The application uses Next.js, React, and TypeScript, with pdfjs-dist for PDF extraction
and Zod for structured data validation. Cloudflare Broker + R2 is the current recommended
production topology. MD Publisher supplies raw official source material; the Render
application remains the semantic authority that selects, parses, and validates it.
flowchart LR
FCIM[Official FCIM sources] --> Publisher[Publisher host / MD Publisher]
Publisher --> Broker[Cloudflare Broker / R2]
Broker --> App[Render application]
App -->|Accepted state| Broker
FCIM -.->|Direct when broker URL is unset| App
Seed[Verified bundled seeds] -.->|Fallback| App
App <-->|Optional history / recovery| DB[(PostgreSQL)]
App --> Readers[Web UI / JSON API]
The broker is optional: when SCHEDULE_BROKER_URL is unset, automatic updates use the
direct FCIM transport. SCHEDULE_BROKER_SECRET is needed for authenticated accepted-state
writes in broker mode, not for universal application startup. PostgreSQL is optional
history and recovery storage; browser/API reads use the current local schedule.
The effective cold-start recovery order is:
In-memory/current cache → scoped local schedule → compatible legacy cache adoption → PostgreSQL current/history recovery → broker durable accepted state → verified bundled seed.
The scheduler and cache coordination run within one process; deploy one application replica. See architecture for update ordering, recovery, and maintenance. The current production publisher runs on a dedicated Debian host under a user-level systemd timer; Windows Task Scheduler remains an optional deployment. See publisher operations for installation, diagnostics, and the manual update/rebuild procedure.
Read endpoints return JSON. Except for health, each accepts ?course=1 or ?course=2
when that course is enabled. Omitting it uses the configured default (Anul I with default
settings); invalid or repeated selectors return 400.
| Endpoint | Returns |
|---|---|
GET /api/health | Process liveness and per-course schedule availability |
GET /api/status?course=1 | Schedule summary and update diagnostics |
GET /api/groups?course=2 | Available groups and lesson counts |
GET /api/schedule?course=2 | Lessons and metadata; filters: group, day, teacher, subject, room, q |
GET /api/schedule/{group}?course=2 | A group's lessons, also grouped by day |
GET /api/schedule/{group}/today?course=2 | Lessons for today's weekday in Europe/Chisinau |
GET /api/source?course=2 | Source PDF URL, hash, timestamps, and update state |
See API behavior for response details and errors.
Repository source code is licensed under the MIT License. Timetable PDFs and data originate from UTM/FCIM sources; these third-party materials are not licensed under this project's MIT license. Bundled PDF provenance and hashes are recorded in architecture.
Optional bounded CORS for the FCIM map is documented in docs/map-02b-integration.md. The default allowlist is empty; existing API JSON and clients remain compatible.