Powered by constraint programming β’ Built with love for educators
Smooth β’ Stable β’ Alive
Quick Start β’ Features β’ Documentation β’ Demo
Smart Timetable Builder is a next-generation scheduling solution that transforms the complex task of school timetable creation into an elegant, visual experience. Combining Google's OR-Tools constraint solver with a beautifully animated dark-themed interface, it generates mathematically guaranteed clash-free schedules while providing real-time analytics, scenario simulation, and stunning visualizations.
| Constraint programming ensures zero conflicts. No manual checking needed. | Fluid animations, glowing transitions, and a modern dark theme. | Visual heatmaps and energy fields reveal insights at a glance. |
- Zero Conflicts Guaranteed - Mathematical proof via constraint programming
- 5 What-If Scenarios - Test disruptions without touching base timetable
- 4 Visual Analytics - Heatmaps for load, fatigue, congestion, clashes
- 4 Energy Maps - Animated Plotly fields with glowing orbs and wave motion
- Auto-Save Everything - 8 JSON files persist all data across sessions
- Chrome-Style History - Full audit trail with timestamps
- Demo Data Included - 12 teachers, 6 classes, 164 periods ready to go
- Professional PDFs - Print-ready A4 exports for classes and teachers
| Clash-Free Generation | No teacher or class double-booking (hard constraint) |
| Priority Scheduling | Important subjects scheduled earlier in the day (optional) |
| Teacher Constraints | Respect max periods per day + max periods per week |
| Break Periods | Configurable breaks (e.g., "4, Lunch Break" or "7, Tea Break") |
| Weekly Rotation | 3-week automatic rotation for fairness |
| OR-Tools Solver | Google's constraint programming solver (CP-SAT) |
Simulate disruptions without modifying the base timetable:
| Scenario | Description | Use Case |
|---|---|---|
| Teacher Absent | Mark teacher unavailable, auto-substitute or free period | Sick leave, training |
| Substitute Teacher | Assign replacement teacher for specific classes | Planned absence |
| Lab Unavailable | Mark lab subjects (Physics, Chemistry, Biology) as free | Maintenance, exams |
| Shortened Day | Reduce max periods for the day | Half-day schedule |
| Emergency Free | Force specific class/period to be free | Assembly, event |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Teacher Load β Periods per teacher per day β
β Day Congestion β Total teaching periods per day β
β Class Fatigue β Heavy subject clustering β
β Clash Risk β Overload and conflict detection β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Teacher Load β Glowing orbs sized by workload β
β Fatigue Flow β Ripple effects show heavy clustersβ
β Congestion β Pulsing gradients per day β
β Impact Diffusion β Wave propagation from changes β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Controls: Animation Speed β’ Glow Intensity β’ Motion Toggle
All data automatically saves to data/ directory:
data/
βββ teachers.json # Teacher definitions
βββ classes.json # Class and subject assignments
βββ priority_configs.json # Priority settings per class
βββ config.json # School configuration
βββ history.json # Activity log (last 500 entries)
βββ demo_loaded.json # Demo data flag
βββ base_timetable.json # Generated timetable
βββ scenario_state.json # What-If Lab scenarios
|
Smooth Animations
|
Intuitive Interface
|
Modern, eye-friendly design:
- Background:
#0f0f0f - Containers:
#18181b - Borders:
#27272a - Text:
#fafafa/#e4e4e7/#a1a1aa
Python 3.8 or higher
pip package manager
4GB RAM recommended# Clone the repository
git clone https://github.com/yourusername/smart-timetable-builder.git
cd smart-timetable-builder
# Install dependencies
pip install -r requirements.txtstreamlit run app.pyApplication opens at: http://localhost:8501
|
1. Load Demo Click "Load Demo Data" in sidebar 12 teachers + 6 classes ready to use |
2. Generate Navigate to "Class Timetables" tab Click "Generate Timetable" Solver runs ~2-5 seconds |
3. Explore View results, try scenarios, check analytics All features now unlocked! |
| Stream | Teacher | Subjects | Max/Day |
|---|---|---|---|
| Science | Eric Simon | Physics | 5 |
| Aisha Khan | Chemistry | 5 | |
| Rahul Mehta | Mathematics | 5 | |
| Neha Verma | Biology | 5 | |
| Commerce | Priya Nair | Economics | 5 |
| Arjun Patel | Accountancy | 5 | |
| Kavita Rao | Business Studies | 4 | |
| Humanities | Sofia Mendes | History | 5 |
| Aman Gupta | Political Science | 5 | |
| Ritu Chawla | Geography | 4 | |
| Common | Daniel Brooks | English (all streams) | 4 |
| Marcus Lee | Physical Education (all) | 3 |
βββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββ
β Class β Subjects (periods/week) β Total β
βββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββ€
β 11SCI β Physics(6) β’ Chemistry(6) β’ Math(6) β 30 β
β β Biology(6) β’ English(4) β’ PE(2) β β
βββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββ€
β 12SCI β Physics(6) β’ Chemistry(6) β’ Math(6) β 30 β
β β Biology(6) β’ English(4) β’ PE(2) β β
βββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββ€
β 11COM β Accountancy(6) β’ Business(6) β’ Economics(6) β 28 β
β β Math(4) β’ English(4) β’ PE(2) β β
βββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββ€
β 12COM β Accountancy(6) β’ Business(6) β’ Economics(6) β 28 β
β β Math(4) β’ English(4) β’ PE(2) β β
βββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββ€
β 11HUM β History(6) β’ PolSci(6) β’ Geography(6) β 24 β
β β English(4) β’ PE(2) β β
βββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββ€
β 12HUM β History(6) β’ PolSci(6) β’ Geography(6) β 24 β
β β English(4) β’ PE(2) β β
βββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββ
Total: 164 periods/week across 6 classes
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Teachers & Saved History Class Teacher β
β Classes Data Timetables Timetables β
β β
β Rotation What-If Insights Energy PDF β
β Lab Maps Export β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Days: Mon,Tue,Wed,Thu,Fri
Periods per day: 8
Break Periods:
4, Lunch Break
7, Tea BreakClick "Apply Config" to save.
Navigate to "Teachers & Classes" tab:
βββββββββββββββββββββββββββββββββββββββ
β Teacher ID: Eric Simon β
β Subjects: Physics β
β Sections: 11SCI, 12SCI β
β Max Periods/Day: 5 β
β β
β [Save] [Cancel] β
βββββββββββββββββββββββββββββββββββββββ
Result: Toast notification " Teacher Eric Simon added"
Scroll to "2. Add Classes" section:
βββββββββββββββββββββββββββββββββββββββ
β Class ID: 11SCI β
β β
β Add Subjects: β
β β’ Physics: 6 periods β Eric Simon β
β β’ Chemistry: 6 periods β Aisha Khan β
β β’ Math: 6 periods β Rahul Mehta β
β ... β
β β
β [Save] [Cancel] β
βββββββββββββββββββββββββββββββββββββββ
Expand each class to configure:
Priorities for 11SCI:
βββββββββββββββββββββββββββββββββββββββ
β Priority (early) subjects: β
β Physics, Chemistry, Mathematics β
β β
β Weak subjects: β
β Physics, Chemistry β
β β
β Heavy subjects: β
β Physics, Chemistry, Math, Biology β
β β
β [Save] β
βββββββββββββββββββββββββββββββββββββββ
Navigate to " Class Timetables" tab:
- Click " Generate Timetable"
- Spinner appears: "Solving..."
- Toast: " Timetable generated!"
- View results in tables below
Navigate to " What-If Lab" tab:
Day: [Monday βΌ]
Scenarios:
β Teacher absent today
ββ Absent teacher: [Eric Simon βΌ]
β Shortened school day
ββ Max periods today: [6]
Live timetable updates below β
Heatmaps ( Insights tab):
Heatmap: [Teacher load βΌ]
Displays: Styled dataframe with color gradients
- Green β Yellow β Orange β Red
- Darker = Higher load
Energy Maps ( Energy Maps tab):
Energy Map Type: [Teacher Load Energy Field βΌ]
Animation Speed: βββββββββ 0.5
Glow Intensity: βββββββββ 1.0
Motion: β
Displays: Animated Plotly chart with:
- Glowing orbs (teacher workload)
- Smooth gradients
- Wave motion effects
Navigate to " PDF Export" tab:
ββββββββββββββββββββββββββββββββββββ
β Download Class PDFs β
β Download Teacher PDFs β
ββββββββββββββββββββββββββββββββββββ
Format: A4, print-ready
@dataclass
class Teacher:
teacher_id: str # Unique ID (e.g., "Eric Simon")
subjects: List[str] # ["Physics"]
sections: List[str] # ["11SCI", "12SCI"]
max_periods_per_day: int = 6 # Daily limit
@dataclass
class ClassSubject:
subject: str # "Physics"
weekly_periods: int # 6
teacher_id: str # "Eric Simon"
@dataclass
class Class:
class_id: str # "11SCI"
subjects: List[ClassSubject] # List of subjects
@dataclass
class SchoolConfig:
days: List[str] = ["Mon", "Tue", "Wed", "Thu", "Fri"]
periods_per_day: int = 8
break_periods: Dict[int, str] = {} # {3: "Lunch", 6: "Tea"}
@dataclass
class ClassPriorityConfig:
class_id: str
priority_subjects: List[str] = [] # Early scheduling
weak_subjects: List[str] = [] # Morning only
heavy_subjects: List[str] = [] # Avoid consecutiveβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. Session State Init (_init_session) β
β ββ Load from JSON (all 8 files) β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β 2. Render UI (10 tabs) β
β ββ Streamlit components + custom CSS β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β 3. User Actions (add/edit/delete/generate) β
β ββ Form submissions, button clicks β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β 4. Business Logic β
β ββ Solver (OR-Tools CP-SAT) β
β ββ Scenarios (overlay, no mutation) β
β ββ Analytics (heatmaps, energy maps) β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β 5. Auto-Save (storage.py β JSON) β
β ββ Persist to data/ directory β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β 6. Update UI + Show Toast Notification β
β ββ Fragment reruns, smooth animations β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Hard Constraints (MUST be satisfied)
β No teacher conflicts # Teacher can't be in 2 places
β No class conflicts # Class can't have 2 subjects
β All periods satisfied # Sum matches weekly_periods
β Teacher max per day # Respect daily limit
β Teacher max per week # Respect weekly limit
# Soft Constraints (Optimization - if priority configs exist)
β‘ Priority subjects early # Morning scheduling
β‘ Weak subjects morning # When students fresh
β‘ Heavy not consecutive # Avoid back-to-backSolver Performance:
- Small (6 classes): ~2 seconds
- Medium (20 classes): ~5-10 seconds
- Large (50+ classes): ~20-60 seconds
# Core Functions
load_teachers() β List[Teacher]
save_teachers(teachers: List[Teacher])
load_classes() β List[Class]
save_classes(classes: List[Class])
load_config() β SchoolConfig
save_config(config: SchoolConfig)
load_priority_configs() β List[ClassPriorityConfig]
save_priority_configs(configs)
# History & State
append_history(action, target, summary, details)
load_history() β List[dict] # Last 500 entries
load_scenario_state() β dict
save_scenario_state(state: dict)
load_base_timetable() β Optional[dict]
save_base_timetable(serialized: dict)
# Utility
is_demo_loaded() β bool
set_demo_loaded()
clear_demo_loaded()
clear_base_timetable()
clear_scenario_state()/* Color Palette */
--bg-primary: #0f0f0f
--bg-secondary: #18181b
--border: #27272a
--text-primary: #fafafa
--text-secondary: #e4e4e7
--text-muted: #a1a1aa
/* Gradients */
--sidebar: linear-gradient(180deg, #18181b 0%, #0f0f0f 100%)/* Fade In */
@keyframes cardFadeIn {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
/* Glow (Changed Cells) */
@keyframes glow {
0% { box-shadow: 0 0 8px 2px #ffd700; }
100% { box-shadow: 0 0 16px 6px #ffec99; }
}
/* Toast Slide */
@keyframes toastFadeIn {
from { opacity: 0; transform: translateY(-10px); }
to { opacity: 1; transform: translateY(0); }
}Stackable toast notifications with live countdown:
show_toast("Timetable generated!", duration_sec=3)Display:
βββββββββββββββββββββββββββββββββββ
β Timetable generated! 3s β
β Teacher added 2s β
β PDF exported 1s β
βββββββββββββββββββββββββββββββββββ
Fragment reruns every 1 second via @st.fragment(run_every=timedelta(seconds=1))
Class 11SCI
βββββββββββββ¬βββββββββββ¬βββββββββββ¬βββββββββββ¬βββββββββββββ¬βββββββββββ¬βββββββββββ¬βββββββββββ¬βββββββββββ
β Day β P1 β P2 β P3 β P4 (Lunch) β P5 β P6 β P7 (Tea) β P8 β
β β 08:00 β 08:45 β 09:30 β 10:15 β 11:00 β 11:45 β 12:30 β 13:15 β
βββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββ€
β Monday β Physics β Chemistryβ Math β BREAK β Biology β English β BREAK β Free β
βββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββ€
β Tuesday β Chemistryβ Math β Biology β BREAK β Physics β English β BREAK β PE β
βββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββ€
β Wednesday β Math β Physics β Chemistryβ BREAK β English β Biology β BREAK β Free β
βββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββ€
β Thursday β Biology β Chemistryβ Physics β BREAK β Math β PE β BREAK β Free β
βββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββββΌβββββββββββΌβββββββββββΌβββββββββββΌβββββββββββ€
β Friday β English β Math β Chemistryβ BREAK β Physics β Biology β BREAK β Free β
βββββββββββββ΄βββββββββββ΄βββββββββββ΄βββββββββββ΄βββββββββββββ΄βββββββββββ΄βββββββββββ΄βββββββββββ΄βββββββββββ
Teacher: Eric Simon (Physics) - Max 5 periods/day
βββββββββββββ¬ββββββββββ¬ββββββββββ¬ββββββββββ¬βββββββββββββ¬ββββββββββ¬ββββββββββ¬βββββββββββ¬ββββββββββ
β Day β P1 β P2 β P3 β P4 (Lunch) β P5 β P6 β P7 (Tea) β P8 β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌβββββββββββββΌββββββββββΌββββββββββΌβββββββββββΌββββββββββ€
β Monday β 11SCI β Free β 12SCI β BREAK β Free β Free β BREAK β Free β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌβββββββββββββΌββββββββββΌββββββββββΌβββββββββββΌββββββββββ€
β Tuesday β Free β 12SCI β Free β BREAK β 11SCI β Free β BREAK β Free β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌβββββββββββββΌββββββββββΌββββββββββΌβββββββββββΌββββββββββ€
β Wednesday β Free β 11SCI β Free β BREAK β Free β 12SCI β BREAK β Free β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌβββββββββββββΌββββββββββΌββββββββββΌβββββββββββΌββββββββββ€
β Thursday β Free β Free β 11SCI β BREAK β Free β Free β BREAK β Free β
βββββββββββββΌββββββββββΌββββββββββΌββββββββββΌβββββββββββββΌββββββββββΌββββββββββΌβββββββββββΌββββββββββ€
β Friday β Free β Free β Free β BREAK β 12SCI β Free β BREAK β Free β
βββββββββββββ΄ββββββββββ΄ββββββββββ΄ββββββββββ΄βββββββββββββ΄ββββββββββ΄ββββββββββ΄βββββββββββ΄ββββββββββ
Summary:
β’ Total periods: 10/40 (25%)
β’ Periods per day: 2.0 average
β’ Max daily: 2 periods
β’ Free periods: 30
Chrome-style activity tracking (last 500 entries):
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 2024-02-15 14:30 β Generated clash-free timetable β
β Action: generate | Target: Timetable β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 2024-02-15 14:25 β Exported class timetables PDF β
β Action: export | Target: PDF β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 2024-02-15 14:20 β Updated teacher Eric Simon β
β Action: edit | Target: Teacher Eric Simon β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 2024-02-15 14:15 β Added class 11SCI β
β Action: add | Target: Class 11SCI β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Automatic 3-week rotation system:
Week 1: Original schedule
Week 2: All subjects shifted +1 period (with wraparound)
Week 3: All subjects shifted +2 periods (with wraparound)
Result: Same subject doesn't always fall at same time of day
Benefits: Fairer for students, accounts for energy variations
What-If scenarios auto-save:
{
"selected_day": 0,
"scenarios": {
"teacher_absent": {
"active": true,
"teacher_id": "Eric Simon"
},
"shortened_day": {
"active": true,
"max_periods": 6
},
"substitute": {
"active": false
}
}
}Base timetable never modified - scenarios create live overlay view.
Q: "No solution found" error when generating
Possible Causes:
- Too many periods required vs. available slots
- Teacher max_periods_per_day too restrictive
- Conflicting teacher-subject assignments
Solutions:
# Check math:
total_required = sum(subject.weekly_periods for class in classes
for subject in class.subjects)
available_slots = periods_per_day Γ days_per_week
# Must satisfy: total_required β€ available_slots Γ num_classes
# Check teacher capacity:
teacher_capacity = sum(teacher.max_periods_per_day Γ days_per_week
for teacher in teachers)
# Must satisfy: total_required β€ teacher_capacityQuick Fix:
- Reduce subject weekly_periods
- Increase teacher max_periods_per_day
- Add more teachers
Q: Data disappeared after browser refresh
Answer: Check data/ folder exists and has write permissions.
Verify:
ls -la data/
# Should show 8 JSON filesIf missing: Click "Load Demo Data" to restore sample data.
Q: Timetable won't generate (button does nothing)
Verify Prerequisites:
- β At least 1 teacher exists
- β At least 1 class exists
- β Days and periods configured (sidebar)
- β Teachers can teach assigned subjects
Check Console: Press F12 β Console tab β Look for errors
Q: Energy maps not animating
Solutions:
- Toggle "Motion" switch ON in Energy Maps tab
- Use modern browser (Chrome 90+, Firefox 88+, Safari 14+)
- Disable browser extensions that block JavaScript
- Check browser console for errors
Q: PDF download shows blank pages
Solutions:
- Regenerate timetable first
- Try different PDF viewer (Adobe Reader, Chrome, Firefox)
- Check if timetable has data:
# In Class Timetables tab, verify table shows data - Update ReportLab:
pip install --upgrade reportlab
# Core Framework
streamlit>=1.28.0 # Web UI framework
ortools>=9.5.0 # Constraint programming solver
# Data Processing
pandas>=1.5.0 # DataFrames and tables
numpy>=1.23.0 # Numerical operations
# Visualization
plotly>=5.14.0 # Interactive charts (energy maps)
matplotlib>=3.7.0 # Static charts (heatmaps)
# PDF Generation
reportlab>=4.0.0 # Professional PDF documents
# Scientific Computing
scipy>=1.10.0 # Gaussian filters, image processing
# Utilities
python-dateutil>=2.8.2 # Date/time handlingInstallation:
pip install -r requirements.txt| Layer | Technology | Version | Purpose |
|---|---|---|---|
| Frontend | Streamlit | 1.28+ | Reactive web interface |
| Custom CSS | - | Dark theme, animations | |
| Solver | OR-Tools CP-SAT | 9.5+ | Constraint programming |
| Visualization | Plotly | 5.14+ | Interactive energy maps |
| Matplotlib | 3.7+ | Static heatmaps | |
| Data | Pandas | 1.5+ | DataFrames, tables |
| NumPy | 1.23+ | Array operations | |
| ReportLab | 4.0+ | Document generation | |
| Scientific | SciPy | 1.10+ | Filters, effects |
| Storage | JSON | stdlib | Lightweight persistence |
We welcome contributions! Here's how to get started:
# Fork and clone
git clone https://github.com/YOUR_USERNAME/smart-timetable-builder.git
cd smart-timetable-builder
# Create virtual environment
python -m venv venv
source venv/bin/activate # macOS/Linux
venv\Scripts\activate # Windows
# Install dependencies
pip install -r requirements.txt
# Run in development mode
streamlit run app.py|
Google OR-Tools Constraint programming solver |
Streamlit Web app framework |
Plotly Interactive visualizations |
ReportLab PDF generation |
Special Thanks:
- All contributors
- Educators who provided feedback
- Open source community
|
Found a bug? Let us know! |
Questions? Ideas? Let's talk! |
Direct contact for sensitive issues |
If this project helps your school, please consider:
Starring the repository on GitHub
Sharing on social media
Contributing improvements
Writing about your experience
Β© 2024 Smart Timetable Builder
Made using Python, Streamlit, and OR-Tools
