尚未检测到更新。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.