ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Your EPITA ZEUS timetable, in English, on your phone. Load your group's
calendar export from ZEUS once, and after that the app opens straight to
your next class and works offline.
Amphi is an unofficial student project. No login handling, no server, no
external services: it's a handful of plain files that run in any browser.
Live at https://amphi-app.github.io/.
Amphi was built by Dev Vashisth with the help of an AI coding assistant
(Claude). Dev designed the features, tested it with real ZEUS data, and is
responsible for maintaining it.README 전문 보기 ↗Your EPITA ZEUS timetable, in English, on your phone. Load your group's calendar export from ZEUS once, and after that the app opens straight to your next class and works offline.
Amphi is an unofficial student project. No login handling, no server, no external services: it's a handful of plain files that run in any browser. Live at https://amphi-app.github.io/.
Amphi was built by Dev Vashisth with the help of an AI coding assistant (Claude). Dev designed the features, tested it with real ZEUS data, and is responsible for maintaining it.
Get your group's ZEUS data (once). Log into zeus.ionis-it.com
(Office 365), open Groupes in the left sidebar and narrow down to your
own group (e.g. EPITA → CLASSES PREPARATOIRES → PREPA PARIS → SPE PARIS →
tick your group), then click "Générer un ICS" and download the
file (on iPhone: open the link, tap download; it lands in Files →
Downloads). Choose that file in Amphi. The app has a built-in "How do I
get the file?" guide for classmates. ZEUS changes during the semester,
so download a fresh file every week or two; Amphi shows how old your
copy is.
Hide anything you don't take (optional). The app shows your whole group's timetable straight away. If your group has a course you didn't choose (an elective, say), tap Edit courses and untick it. The app remembers what you hid, so a course ZEUS adds to your group later still shows up automatically.
Don't use the whole-school export (ticking just "EPITA"): many courses share a name across groups ("Algorithmique" alone covers 491 sessions), and nothing in the file tells them apart, so you'd get other groups' classes mixed in. The app warns you if you load one.
Use it. The app opens on Home: your name (tap it to enter your
EPITA login, e.g. dev.vashisth), a Now / Next card (the class
that's on and what comes after it, or your next class, with its room;
tap it to open that day) and your courses, each with its next
session — tap one to jump to that day. Exams, events (forums,
hackathons, EPI'ACK…) and days off are kept out of that list and shown
in Coming up instead; ZEUS doesn't say which is which, so
kinds.js works it out from the titles. If something lands in the
wrong place, add its title to tests/kinds.test.js and adjust the
word lists. ZEUS titles are in French, so cards show the English for
the words they contain ("Rattrapages = Resits · S3 = Semester 3"), and
ZEUS words in English at the bottom of Home lists them all (the list
is GLOSSARY in kinds.js). Swipe left for the timetable,
right to come back (or use the tabs at the bottom). The timetable opens
on your next class. On today, a red line with the time shows where
you are in the day: inside the class that's on (as far down as the
class has got) or in the gap between classes. Day tabs show how many
classes each day has (today is outlined in green); arrows move between
weeks. "Updated today / 3 days ago" shows how fresh your copy is — it
turns yellow after a week as a reminder to reload.
Friends (third tab) shows where each friend's timetable says they
are: in class (which one, until when), free until their next class, or
done for the day, plus when you're both free today. Tap Share my
timetable to send a link; a friend who opens it (or pastes it into
their Friends tab) adds you. The link carries class names and times for
the rest of the semester, never rooms, and travels after the # of the
address, which browsers never send to any server. Friends are added only
from links they sent you, and each shows when it was shared (yellow after
two weeks, as a hint to share again). On iPhone, links open in Safari,
not the installed app, so paste them into the Friends tab instead.
Free rooms (fourth tab) lists rooms with no class booked right now,
or in 1–3 hours, at Kremlin-Bicêtre or Villejuif, with how long each
stays that way. Nothing to set up: the room data ships with the app
(see "Weekly data update"). It says "no class booked", not
"free": a room can still be locked or used informally, and the list is
only as fresh as the last update (about 2% of room bookings change per
week). On Sundays and outside 8:00–20:00 (Paris time) the list is
hidden and it says "Campus likely closed", since almost every room looks
free when nothing is booked; later-time choices that fall in those hours
aren't offered. Campuses are recognised from room names by CAMPUS_RULES in
rooms.js; rooms on other campuses and sites are left out.
Install it (once it's online): on iPhone, Safari → Share → "Add to Home Screen"; on Android, Chrome → menu → "Install app". It then opens full-screen like an app, and works without internet.
Treat your ZEUS link like a password. The code at the end of it is enough by itself to read the timetable, no login needed. The app keeps it only in your own browser's storage and sends it nowhere except ZEUS. Never paste it into the code or anywhere public.
Service workers (offline mode) and home-screen install only work from a
real https:// address, not a double-clicked file. GitHub Pages hosts this
for free:
main and the / (root) folder, Save.amphi-app
organisation and is named amphi-app.github.io, so its address is
https://amphi-app.github.io/ (a repo with any other name would be at
https://amphi-app.github.io/<repo-name>/; the app works at either).After changing any app file, bump CACHE_NAME in sw.js (amphi-v8 →
amphi-v9) so installed copies pick up the new version cleanly.
npm run data -- path/to/that-file.ics. It writes:
data/rooms.json: which rooms are booked when (Rooms tab).data/updates.json: the latest time and room, by ZEUS ID, of every
entry at Kremlin-Bicêtre or Villejuif (or with no room). Entries at
other sites are left out (servedLocation in rooms.js), and the app
never flags a class elsewhere as missing.
Neither contains course names, groups or people. Real ZEUS IDs are kept
out of tests/ too (the tests use made-up ones).data folder. Everyone's app picks it up the next
time it opens with internet: rooms refresh, and each student's own
timetable is corrected where ZEUS moved a class or changed its room,
with an alert on Home for changes in the next 7 days.What the weekly update can't do: add classes that are new to a student's group (a new ZEUS entry doesn't say which group it's for; the student's own fresh file still catches those), and it never overrides a timetable file the student loaded after the weekly data was made. Entries that disappear are flagged "Not in ZEUS", not deleted, since ZEUS sometimes re-creates an entry under a new ID.
Two sets, and GitHub runs both on every push and pull request
(.github/workflows/test.yml). A red cross next to a commit on GitHub means
a test failed: fix it before students pick up the change.
npm test: the logic (reading ZEUS files, kinds, glossary, rooms,
friends, weekly updates). Nothing to install.
npm run test:browser (tests/browser/): opens Amphi on a
phone-sized screen in Chromium and uses it like a student would: Home,
timetable and the red now line, setup and Edit, messages, Rooms and its
opening hours, Friends, change alerts, the install card, and self-updating.
It needs Playwright once:
npm install --no-save [email protected]
npx playwright install chromium
npm run test:browser
The browser tests run at a fixed moment (Wednesday 7 Oct 2026, 10:15
Paris time) on made-up ZEUS data from tests/browser/fixtures.js: invented
courses, rooms and IDs. Never put a real ZEUS export in the repository; if a
test needs a new situation, add it to the fixtures.
Nobody reinstalls anything. Bump CACHE_NAME in sw.js and APP_VERSION
in app.js together (a test fails if they differ), then push. Each phone
picks up the new version the next time Amphi opens, or when it comes back on
screen from the background (it reloads by itself, unless the student is
typing). Weekly data (data/) needs no version bump: it is re-checked every
time Amphi opens or comes back on screen.
index.html. Everything works except
offline mode/installing. To test those too, run
python3 -m http.server in this folder and open http://localhost:8000.npm test (needs Node.js; nothing to install). They
cover reading the calendar format, including the ZEUS quirks
below. Run them after every change to ics.js.| File | What it does |
|---|---|
index.html | Page structure: setup screens (link/upload, course picker) and the app itself (Home + Timetable pages, tab bar). |
style.css | All the looks — dark, mobile-first. Colors are tokens at the top. |
ics.js | Reads the .ics calendar format. No page code, so it's testable. |
kinds.js | Decides whether an entry is a course, exam, event or day off, from its title, and holds the English glossary for ZEUS words. Testable too. |
rooms.js | Works out which rooms have no class booked at a given time, and which campus each room is on. Testable too. |
friends.js | Packs a timetable into a share link and reads it back; works out a friend's status and when you're both free. Testable too. |
updates.js | Matches a student's classes to the weekly data by ZEUS ID and works out what moved. Testable too. |
data/ | rooms.json and updates.json, built weekly by tools/build-data.js (npm run data). |
app.js | Everything on screen: setup, Home page, timetable, swiping, saving, startup. |
sw.js | Service worker: keeps copies of the app files so it opens offline. |
manifest.webmanifest, icons/ | Name and icons used when installed to a home screen. |
tests/ | Automated tests for ics.js, kinds.js (real ZEUS titles), rooms.js, friends.js, updates.js, and a check that no two browser scripts clash. |
parseICS (ics.js) turns the file's text into a list of events:
{ uid, summary, location, description, start, end }. It un-wraps long
lines, un-escapes text, trims stray spaces, and drops nonsense dates.loadScheduleFromText (app.js) decides what's next: a file for
one group goes straight to the timetable; a whole-school file (over 100
different course names) opens the course picker first.getUniqueCourses / renderCoursePicker list every distinct course
with a tick box; saveHiddenCourses remembers the unticked ones.showFilteredSchedule drops hidden courses, saves the rest
(saveMySchedule), and opens the week view.showWeekView → renderWeek → renderDay → renderCard draw the
day tabs and the cards. All dates and times are computed in Paris time
(parisDateKey), because ZEUS stores UTC and a phone may be set to
another time zone.classify colors each card: exam-sounding titles in red, every other
course a stable color derived from its name (colorForCourse).Checked against a real 11,519-event export and EPITA's own ZEUS guide:
examen, partiel, contrôle), and group labels like
"GR A1" are read from the title too.ZEUS doesn't let other websites read its links: the response has no
Access-Control-Allow-Origin header for https://amphi-app.github.io, so
browsers block the app from reading it (the browser rule called CORS).
Opening the link yourself still works; only a website's code is blocked.
Until ZEUS allows Amphi, students download the file and upload it. The
link-loading code is already in the app and works as soon as ZEUS allows it.
The code is under the MIT licence (see LICENSE): anyone may use, copy and
change it, keeping the copyright notice. The licence covers the code only.
The files in data/ are built from EPITA's ZEUS timetable and are not
covered by it.