尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗| What | Link |
|---|---|
| The app (open this) | https://college-timetable-teal.vercel.app |
| Sign in (demo buttons for every role) | https://college-timetable-teal.vercel.app/login |
| Demo college's timetable, no sign-in (share link) | https://college-timetable-teal.vercel.app/c/4H7GM5 |
| Book a room (no account needed) | https://college-timetable-teal.vercel.app/book |
| Events calendar | https://college-timetable-teal.vercel.app/events |
| Backend API, interactive docs | https://college-timetable-api.onrender.com/docs |
| Backend health check | https://college-timetable-api.onrender.com/health |
The frontend runs on Vercel, the backend on Render (free plan, Singapore), and the database is Postgres on Supabase. The free backend sleeps after about 15 minutes without visitors, so the first visit can take up to a minute while it wakes up (the site says "Waking up the server"). Generating a timetable there takes about 20 seconds for the sample college and about a minute for the larger demo college.
One place for the whole college. The Dean's office generates a clash-free timetable in minutes. Everyone signs in with their own username and password and sees only their own pages. Departments prepare and approve their own data, teachers ask for leave and get covered, students see what's on now and next, and clubs book rooms with digital approval instead of paper letters.
Built for the Punjab Jobs AI Bootcamp hackathon (J-PAL South Asia). It works for any college: nothing about days, periods, breaks, rooms or departments is hard-coded.
Contents: Live links · About · Try it · Who it's for · What it does · How a Dean uses it · Screenshots · How it's built · Run it locally · Limitations
Open Sign in on the live site. Under "Evaluators: try it as", pick a person: their sign-in shows in grey in the boxes, so just press Sign in.
| Sign in as | Username | Password | What to try |
|---|---|---|---|
| Dean (super admin) | dean | demo1234 | Today (what needs doing), all timetables, Setup (change data, generate again, publish), People & sign-ins, Reports, room approvals |
| HOD of CSE | hod | demo1234 | Approve CSE's timetable data (or send it back with a note), approve leave and arrange cover, room requests, make the in-charge's sign-in |
| Timetable in-charge of CSE | incharge | demo1234 | Edit only CSE's rooms, teachers, sections and classes, then send them to the HOD |
| Teacher (Dr. Kulwinder Singh Mann) | teacher | demo1234 | Today's classes, their week, ask for leave, book a room |
| Student (CSE-3A) | student | demo1234 | "Now / Next", their section's week, today's changes, add it to their phone's calendar |
College code: 4H7GM5, the demo college Guru Nanak Institute of Technology, Ludhiana, built from docs/New_College_Data.xlsx (3 departments, 23 teachers, 8 sections, Monday to Saturday with a short Saturday, open electives).
These demo sign-ins are public and open only the demo college. If someone changes it, python backend/seed_demo.py https://college-timetable-api.onrender.com makes a fresh one; put its code in frontend/lib/demo.ts.
| Person | Where they land | What they get |
|---|---|---|
| Dean (super admin) | Today | A to-do list (publish, leave waiting, classes needing cover, bookings waiting); a 6-step setup or one Excel workbook; a timetable with 0 clashes, checked twice; plain-English reasons when something can't fit; one click to publish; everyone's sign-ins; reports |
| HOD | HOD page | Approves the department's data before the Dean generates, approves leave and arranges cover, decides room requests, makes the timetable in-charge's sign-in |
| Timetable in-charge | Department | Edits only their department's rooms, teachers, sections and subjects, and sends them to the HOD |
| Teacher | Teacher page | Their own week, today's classes, leave requests and room bookings |
| Student | My timetable | Their section's week, a "Now / Next" card and today's changes. Nothing to change, nothing else to see. |
| Clubs and organisers | Book a room (no account) | Book a seminar hall or room in a free slot, follow the approval on a tracking link, see the events calendar |
Each person's top bar shows only their own pages, and the server checks every request, so nobody can open someone else's page.
| Setup (desktop) | Department in-charge (phone) | My timetable (phone) |
|---|---|---|
| Timetables | Book a room | Events calendar |
|---|---|---|
flowchart TB
subgraph People["People (phones and laptops)"]
Dean
HOD
Incharge["Timetable in-charge"]
Teacher
Student
Club["Club / organiser (no account)"]
end
subgraph Vercel["Vercel: frontend/ (Next.js 16, React, Tailwind v4)"]
Pages["Pages: /login /today /setup /timetable /my /teacher /hod /department /people /book /approvals /events /reports"]
Browser["In the browser: Excel import (SheetJS), instant checks, grid layout, exports (.xlsx, .ics)"]
end
subgraph Render["Render: backend/ (Python, FastAPI)"]
API["app/: colleges · accounts · members · departments · bookings · changes · ask"]
Solver["solver/ (pure): precheck → CP-SAT → independent checker → diagnose"]
Assistant["assistant/ (pure): 6 read-only tools + Claude tool loop"]
end
DB[("Postgres on Supabase (SQLite locally)")]
Claude["Anthropic API: Claude Haiku"]
People -->|HTTPS| Pages
Pages -->|"JSON over HTTPS"| API
API --> Solver
API --> Assistant
Assistant -->|"tool use, backend only"| Claude
API -->|SQLAlchemy| DB
| Part | Technology | Where |
|---|---|---|
| Frontend | Next.js 16 (App Router), React, TypeScript (strict), Tailwind CSS v4, SheetJS for Excel in the browser | frontend/, on Vercel |
| Backend | Python 3.14, FastAPI, SQLAlchemy, Pydantic | backend/app/, on Render |
| Timetable engine | Google OR-Tools CP-SAT, plus an independent checker and a diagnoser | backend/solver/ (pure: no web or database code) |
| Assistant | Claude Haiku with tool use, backend only | backend/assistant/ (pure) |
| Database | Postgres on Supabase (SQLite locally) | via DATABASE_URL |
flowchart LR
In["College data<br/>(days, periods, rooms, teachers,<br/>sections, subjects, who teaches what)"] --> Pre["precheck<br/>invalid codes, overloads,<br/>room shortages"]
Pre -- problems --> Explain["Plain-English reasons<br/>+ how to fix them"]
Pre -- ok --> CP["CP-SAT solver<br/>hard rules = constraints<br/>preferences = weighted penalties"]
CP -- "no solution" --> Diag["diagnose<br/>switch one rule group off at a time<br/>to find the bottleneck"]
Diag --> Explain
CP -- solution --> Chk["independent checker<br/>(shares no code with the solver)"]
Chk --> Out["Timetable<br/>Verified: 0 clashes + quality score"]
flowchart LR
Login["Sign in<br/>college code + username + password"] --> Check{"password matches?<br/>(5 wrong tries → 5-minute lock)"}
Check -- no --> Wrong["Wrong username or password"]
Check -- yes --> Role{role}
Role -- Dean --> D["Today · Setup · Timetables · Reports<br/>People & sign-ins · Changes · Approvals"]
Role -- HOD --> H["HOD page · Department<br/>(approve data, leave, cover, room requests)"]
Role -- "In-charge" --> I["Department<br/>(only their department's rows)"]
Role -- Teacher --> T["Teacher page<br/>(classes, leave, room bookings)"]
Role -- Student --> S["My timetable<br/>(their section only)"]
DATABASE_URL, ANTHROPIC_API_KEY in Render's environment only).Full details: docs/ARCHITECTURE.md has the data model (all 15 tables), every API group, what the browser stores, and step-by-step diagrams for set up → generate → publish, department review, leave and cover, room booking, and Ask the timetable. More: context.md (design and decisions), progress.md (build log), CLAUDE.md (conventions), docs/DEMO_TESTCASES.md (22 demo test cases).
# Backend: http://localhost:8000 (API docs at /docs)
cd backend
python3 -m venv .venv && .venv/bin/pip install -r requirements-dev.txt
cp .env.example .env
.venv/bin/python -m uvicorn app.main:app --reload --port 8000
# Frontend: http://localhost:3000
cd frontend
npm install
cp .env.local.example .env.local
npm run dev
Without DATABASE_URL, the backend uses a local SQLite file. To try the sign-ins locally, make a demo college with cd backend && .venv/bin/python seed_demo.py http://localhost:8000 and put its code in NEXT_PUBLIC_DEMO_LOGINS (see Settings).
cd backend && .venv/bin/python -m pytest -q # 97 tests: solver, checker, API, sign-in, departments, bookings, leave, assistant
cd frontend && npm run lint && npm run build
cd frontend && npx playwright install chromium && npm run e2e # 16 real-browser tests
The end-to-end tests click through the app in a real browser:
UPDATE_SCREENSHOTS=1 npm run e2e refreshes the screenshots in this README.
These are set on the live Vercel and Render projects; locally they go in frontend/.env.local and backend/.env.
| Where | Variable | Purpose |
|---|---|---|
| Vercel | NEXT_PUBLIC_API_URL | The Render URL, without a trailing /. Baked in at build time. |
| Vercel | NEXT_PUBLIC_DEMO_LOGINS | Optional. JSON {"code": "...", "logins": [{"role", "label", "username", "password"}]} to override the evaluator demo sign-ins. |
| Render | FRONTEND_ORIGINS | Comma-separated CORS origins: the Vercel URL (and http://localhost:3000 for development). |
| Render | DATABASE_URL | Supabase Session pooler URI. Unset = SQLite, which Render wipes on restart. |
| Render | SOLVER_WORKERS | CP-SAT search threads. render.yaml sets 2 for the free plan. |
| Render | ANTHROPIC_API_KEY | Optional. Turns on "Ask the timetable". |
Secrets (DATABASE_URL, ANTHROPIC_API_KEY) go only in Render's Environment page, never in the code or in a NEXT_PUBLIC_ variable.
Every push to main redeploys both Vercel and Render automatically.
backend/seed_demo.py for a fresh one.ANTHROPIC_API_KEY on the server; without it, the box is hidden.