尚未检测到更新。GitHub 发布版本后会显示在这里。
A timetable optimizer for VIT FFCS that helps students build clash-free schedules, compare faculty options, and find timetables that fit their preferences. Supporting VIT campuses with intelligent scheduling, course catalog search, and timetable sharing.
翻译准备中
正在加载完整 README。
查看完整 README ↗FFCS (Fully Flexible Credit System) is VIT's biannual course registration system where students race to register for the best professor-slot combinations before they fill up — manually cross-checking hundreds of possible timetable arrangements. Ultimate FFCS Planner automates that entirely.
Generation
Course input
Results
Onboarding
Export & share
Multi-campus
| Framework | Next.js 14 App Router |
| Language | TypeScript |
| Styling | Tailwind CSS + in-house fp-ui primitives (theme tokens in src/app/fp-tokens.css) |
| State | Zustand + localStorage persistence |
| Database | Supabase (Postgres + RLS) |
| Generation | Web Worker (backtracking DFS) |
| Parsing | PapaParse, SheetJS, LZ-string |
| Export | html-to-image, jsPDF |
| Hosting | Vercel |
src/
├── app/ # Next.js App Router
│ ├── [campus]/ # Static slot-timing pages per campus (SEO)
│ ├── planner/ # Courses + preferences, "Find my weeks"
│ ├── results/ # Browse, swap, export, share generated weeks
│ ├── compare/ saved/ settings/ support/
│ ├── timetable/[id]/ # Shared timetable view (public, no auth)
│ ├── admin/ # Bulk catalog upload + usage stats (developer only)
│ └── api/
│ ├── catalog/search/ # Whole campus/semester catalog (edge-cached)
│ ├── catalog/semesters/ # Semester metadata
│ ├── share-timetable/ # Share link creation + resolution
│ ├── events/ # Anonymous usage events (allowlisted props)
│ ├── vtop-import/ # VTOP bookmarklet hand-off
│ └── admin/ # Bulk course upload, auth
│
├── engine/ # Generator, conflicts, zero-result analysis,
│ # metrics, ranking, per-campus slot catalogs, worker
│
├── components/fp-ui/ # Design-system primitives, app shell, program picker
│
├── features/
│ ├── planner/fp/ # Search, paste, file, manual tabs; preferences
│ ├── programs/ # Program names + "Your program / All courses" scoping
│ ├── courses/ # Merging catalog options into the plan
│ ├── import/ paste-import/ # CSV/XLSX pipeline, free-text parser
│ ├── results/ # Slot matrix, block details, iCal dialog
│ ├── tour/ # Guided tour + sample courses
│ ├── landing/ campus/ # Home page, campus pages
│ └── vtop-scraper/ # VTOP bookmarklet
│
├── lib/ # Supabase clients, catalog cache, usage events, iCal
├── utils/ # Share encoding, PNG/PDF export
├── store/useAppStore.ts # Zustand store — app state + persistence
└── hooks/ # useGenerator, useMediaQuery
supabase/migrations/ # Versioned SQL migrations
Generation algorithm in brief: courses are sorted by ascending option count (MRV) before search. At each DFS node, violatesOptionHardConstraints prunes infeasible options immediately; conflictsWithExisting prunes time overlaps against already-placed courses. Soft constraints (max gap) are deferred to complete-timetable checks to avoid premature pruning. Results are scored through a weighted metric pipeline (src/engine/ranking.ts) and returned sorted by descending score.
Catalog and programs: the client fetches a campus's whole active catalog once (src/lib/catalogCache.ts) and filters it locally per keystroke. Each professor option carries a program code (BCE, BYB, … or ALL for untagged); the program picker lists only codes present in the catalog, and friendly names live in src/features/programs/programCatalog.ts.
Prerequisites: Node.js 18+, a Supabase project
git clone https://github.com/mrRR7/ffcsmaker
cd ffcsmaker
npm install
Copy .env.local.example to .env.local and fill in your Supabase URL, anon key, service role key, and an ADMIN_SECRET_KEY.
Run the SQL files in supabase/migrations/ against your Supabase project, then:
npm run dev
Checks: npm run typecheck, npm run lint, npm test (Node's built-in test runner).
The admin panel at /admin handles semester and course data upload — developer-only, protected by ADMIN_SECRET_KEY. Re-uploading a semester updates courses in place and replaces options only for the program codes present in the upload.
Kill switch: NEXT_PUBLIC_PROGRAM_PICKER=off hides the program picker and searches every course. It's read at build time, so changing it needs a redeploy.
Source-visible. Not actively seeking contributions — but bug reports via issues are welcome.