ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
Concordia 학생을 위한 GPA·강의계획·과제·마감일 관리 도구, 모든 정보를 한 곳에 모아줍니다
A GPA calculator, syllabus tracker, and assignment & deadline tracker for Concordia students — every syllabus, deadline, and grade in one place.
교육TypeScript · PLpgSQLGitHub @gmazaratti온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
One calm home for everything a Concordia student has due — pulled out of the five different sites it's scattered across.
Not affiliated with Concordia University.
ConcordiaTracker is a school-specific academic hub: a single, fast, keyboard-driven app that lifts every deadline, grade, and course detail out of the half-dozen disconnected systems a student logs into — so the answer to "what's actually due?" is one glance, not five tabs.README 전문 보기 ↗One calm home for everything a Concordia student has due — pulled out of the five different sites it's scattered across.
The problem · The solution · Highlights · Tech stack · Getting started · Architecture · Roadmap
Not affiliated with Concordia University.
ConcordiaTracker is a school-specific academic hub: a single, fast, keyboard-driven app that lifts every deadline, grade, and course detail out of the half-dozen disconnected systems a student logs into — so the answer to "what's actually due?" is one glance, not five tabs.
Project status. This is a production-quality front-end foundation: every screen, interaction, and animation is real and runs on a single in-memory mock-data module. The architecture is deliberately built so the planned Supabase backend (auth, Postgres, Realtime) slots in behind one swappable provider per feature — no UI rewrites required. See Architecture.
A Concordia student's semester doesn't live in one place. The real information for a single term is fragmented across — at minimum — five different sites, each with its own login:
There is no single, trustworthy view of what's due this week. Dates get missed not because students don't care, but because "the schedule" is smeared across five systems that don't talk to each other — and the most important dates are stuck inside a PDF or a one-line email.
ConcordiaTracker collapses those five sites into one Concordia-specific home:
The front end is built in React + TypeScript; the backend is Supabase (Postgres, Auth, Realtime).
Things in here worth a closer look:
| Feature | What's interesting |
|---|---|
| Syllabus parse-reveal | A scripted, reduced-motion-safe extraction animation — drop a PDF, watch dates cascade into the course. |
| Provenance everywhere | official / confirmed-by-N / unverified is a reusable, first-class UI primitive on every date. |
| Command palette | Cmd/Ctrl + K is the real navigation spine — typeahead, full keyboard a11y, focus-trapped, mobile bottom sheet. |
| Three separate auth contexts | Public marketing site · student app · teacher portal — deliberately never blended into one nav. |
| Grade math | A single source of truth (lib/gpa.ts) drives the banner grade, the grade-needed solver, and the GPA projector. |
| Blueprint supply pipe | A teacher's published outline is the verified blueprint students import — one record, not a copy. |
| Theming in one file | Tailwind v4 CSS-first @theme tokens; a refined dark theme + a Concordia maroon/gold theme swap at runtime. |
| Accessibility & motion | Keyboard nav, visible focus, ARIA roles, focus traps; CSS-only motion that respects prefers-reduced-motion. |
| Built to scale to a backend | Each stub (auth, follows, teacher invites, calendar sync) sits behind a single swappable provider. |
There's also a self-running demo reel at /demo (a ~30-second auto-advancing tour built for screen recording).
| Layer | Technology |
|---|---|
| Framework | React 19 + TypeScript 6 (strict mode) |
| Build tooling | Vite 8 |
| Styling | Tailwind CSS v4 (CSS-first @theme, no tailwind.config.js) |
| Routing | React Router 7 |
| State | React Context + hooks (no Redux) |
| Icons | lucide-react |
| Backend (integration phase) | Supabase — Postgres, Auth, Realtime |
Data today is a single in-memory mock module so the whole app is explorable without a backend. Supabase is the designated production backend, and the codebase is structured to adopt it one provider at a time.
Prerequisites: Node.js 20+ and npm.
# 1. Clone
git clone https://github.com/<your-username>/concordiatracker.git
cd concordiatracker
# 2. Install
npm install
# 3. Run the dev server (http://localhost:5173)
npm run dev
| Script | What it does |
|---|---|
npm run dev | Start the Vite dev server with HMR |
npm run build | Type-check (tsc -b) and build for production |
npm run preview | Preview the production build locally |
npm run lint | Run ESLint over the project |
No environment variables are needed yet — everything runs on mock data. (Supabase keys land here in the integration phase.)
src/
├── app/ # Cross-cutting providers + hooks (the swappable backend seam)
│ └── providers/ # AppData, Theme, Settings, Follows, Teacher, …
├── components/ # Shared UI primitives (Card, Select, DateTimePicker, ModalShell, …)
├── data/ # The single mock-data module + domain types
├── features/ # Screen-level features, one folder each
│ ├── today/ # the launch view
│ ├── courses/ # course list, detail, grade editor, blueprint browser
│ ├── calendar/ # month / week / agenda, layered
│ ├── community/ # campus-events aggregator + org profiles
│ ├── teacher/ # the invite-based teacher portal
│ ├── settings/ # profile, billing, usage, legal
│ └── landing/ # the public marketing site
├── layouts/ # The three context shells (public / student / teacher)
├── lib/ # Pure logic: gpa, grade, date, course-color, …
└── index.css # ALL design tokens (colors, type, spacing) — reskin in one file
A few decisions that make the codebase pleasant to grow:
index.css, exposed to Tailwind via @theme inline; re-skinning or adding a theme is a one-file change.The front end is feature-complete on mock data. The next phase wires the backend:
Built with the assistance of Claude Code for refactoring and feature implementation.
Most blueprints are uploaded by students. A slice of them are read automatically from eConcordia, Concordia's online-course platform, which publishes the current term's outline for every online course as a public PDF.
Why this source. Concordia's Open Data has no outline endpoint at all, and its schedule feed currently stops at Winter 2026 — it cannot even tell us which sections are running this term. eConcordia can.
The outline URL is not derived from the course code. Each card on
courses.aspx carries a thumbnail whose filename is the key:
COMM 305 → /home/src/assets/images/courses/managerial_accounting.jpg
→ https://www.econcordia.com/outlines/managerial_accounting.pdf
So discovery has to go through the catalogue page; you cannot construct an outline URL from a code.
The semester filter is an ASP.NET postback (__doPostBack on
ctl00$main_content$CourseList$ddlSemester), so plain curl on the bare page
only ever returns the default term. The usual advice is to drive it with
Playwright.
Measured on 15 Sep 2026: that is not necessary. The page also accepts the
semester as an ordinary query parameter — courses.aspx?semester=123 returns
all 58 Winter cards with no cookies, no VIEWSTATE and no postback. That
matters beyond tidiness: Playwright cannot run in the serverless function this
job lives in, and the repo keeps exactly one runtime dependency on purpose.
One thing that does not work: ?semester=All Courses silently returns the
default set, so the semesters are walked one at a time — which is what we want
anyway, since the semester is how the term gets attributed. The year is read
off the option label (Fall/Winter (September 8, 2026 - April 12, 2027)), never
from our own clock.
| Path | What it does |
|---|---|
api/_econcordia.ts | Catalogue parsing, slug → URL, polite fetch, dependency-free PDF text extraction |
api/_outline-extract.ts | Outline text → assessment scheme (same model as /api/parse-syllabus) |
api/sync-outlines.ts | The job: discover, then parse a bounded batch |
db/outline_sync.sql | outline_sources ledger, source_url column, the 6-hourly cron |
scripts/scrape-outlines.mjs | Local runner — coverage report + PDFs + text, no keys needed |
npm run scrape:outlines -- --semester 121 # Fall, into .outlines/
npm run test:econcordia # the pure parsing, against captured markup
ok / missing / no_text / parse_failed)
so a silent regression is visible. select * from outline_coverage();user_id is null, author = 'Course outline'). Student uploads and the whole upload flow are untouched, and a
course with no eConcordia outline behaves exactly as it does today.© 2026 Alex Degryse — All rights reserved.
This repository is public for portfolio review only. It is not open source: you're welcome to read the code, but copying, modifying, redistributing, or reusing it in another project is not permitted without written permission. See LICENSE.