Generate conflict-free academic timetables in seconds. Free standalone app or Pro/Institution plans with multi-machine sync. Built with Rust, Tauri, Svelte, and SQLite.
Schedula is a desktop application that intelligently generates semester class routines for academic institutions. Instead of spending weeks manually resolving scheduling conflicts, admins input their courses, lecturers, rooms, and student batches β and Schedula generates an optimized, conflict-free timetable in seconds.
β Fully automated schedule generation using constraint-based optimization algorithms β 7 hard constraints ensuring no conflicts β Smart diversification spreading classes across weekdays β Support for diverse class types (lectures, labs, tutorials) β Biweekly scheduling for intensive courses β Semester calendars with exam/study blocks β Multi-organization support with role-based access
βββββββββββββββββββββββββββββββββββββββββββ
β Frontend (Svelte Components) β
β - App.svelte (main router) β
β - Views (Dashboard, Settings, etc.) β
β - Stores (session, prefs) β
β - API layer (Tauri invoke wrappers) β
ββββββββββββββββββ¬βββββββββββββββββββββββββ
β
ββββββββββΌββββββββββ
β Tauri IPC β
β invoke() β
ββββββββββ¬ββββββββββ
β
ββββββββββββββββββΌβββββββββββββββββββββββββ
β Backend (Rust Commands) β
β - commands.rs (35+ handler functions) β
β - scheduler.rs (constraint solver) β
β - models.rs (domain types) β
β - db.rs (migrations, helpers) β
ββββββββββββββββββ¬βββββββββββββββββββββββββ
β
ββββββββββΌβββββββββββ
β SQLite Database β
β (bundled) β
βββββββββββββββββββββ
v8 (Current) β 8 migrations with backward-compatible evolution
Core tables:
organizations β schools, universities, institutesusers β admin and super_admin accounts with bcrypt hashing, recovery code, security questionsemesters β semester definitions with teaching/exam/study blockscourses β courses with class type (lecture/lab/tutorial) and frequency (weekly/biweekly)lecturers β faculty with availability, load constraints, preferred time-of-day, blackout slots, max consecutive hoursrooms β classrooms and labs with capacities and day availabilitybatches β student groups linked to semestersbatch_courses β M:N courses for each batchSchedule tables:
schedules β generated timetables with status (draft/published), descriptionschedule_entries β individual class slots with week parity (for biweekly)System tables:
org_scheduling_settings β per-org scheduling defaultsapp_settings β global config (max admin quota)audit_log β all user actions with timestamp and entity referenceSee docs/ARCHITECTURE.md for schema diagram and v1βv8 evolution.
open Schedula-0.1.0.dmg
adminadmin123Note: Labs auto-link to lab rooms; biweekly courses get half the weekly hours per placement
Weekly Grid Tab:
List Tab:
Semester Calendar Tab (if linked):
Export:
| Shortcut | Action |
|---|---|
| Cmd + , | Open Settings |
| Escape | Close any modal |
Settings β Appearance:
8 preset colors + custom color picker:
Preferences auto-save to ~/Library/Application Support/Schedula/
Comprehensive system documentation is in the docs/ folder:
xcode-select --install
git clone https://github.com/yourusername/schedula.git
cd schedula
# Install frontend dependencies
npm install
# Backend builds automatically with Tauri
npm run tauri dev
This launches:
http://localhost:5173# Run 75 unit + integration tests (4 seconds)
cargo test
# Run benchmarks (3 profiles: tiny, small, medium, large, stress)
cargo bench
# Results: tiny (380Β΅s), small (747Β΅s), medium (2.3ms), large (3.9ms), stress (8.2ms)
See docs/TESTING_GUIDE.md for test coverage details.
# Release build (optimized)
npm run tauri build
# Output: src-tauri/target/release/bundle/macos/Schedula.dmg
Schedula supports optional subscription licensing for Pro and Institution plans:
Standalone Mode (always free):
Hub Server Mode (requires license):
To deploy the licensing server:
# Build license server
cd license-server
cargo build --release
# Run with environment variables
SCHEDULA_ADMIN_KEY=<secret> \
STRIPE_SECRET_KEY=<key> \
STRIPE_WEBHOOK_SECRET=<secret> \
./target/release/license-server
See license-server/ for complete setup instructions.
schedula/
βββ src/ # Frontend (Svelte, ~25 files)
β βββ App.svelte # Main router
β βββ app.css # Dark/light theme system
β βββ views/ # 12 page components (Dashboard, Lecturers, etc.)
β βββ lib/
β β βββ api.js # 40+ Tauri invoke wrappers (type-safe)
β β βββ stores/ # Svelte stores (session, preferences)
β β βββ toast.js # Toast notification system
β β βββ components/ # 7 reusable UI components
β βββ index.html
βββ src-tauri/ # Backend (Rust, ~2.9K LOC)
β βββ src/
β β βββ main.rs # App entry point
β β βββ lib.rs # Tauri setup, 35+ command registration
β β βββ commands.rs # 35+ command handlers, auth, CRUD
β β βββ db.rs # Database init, 8 migrations, seeding
β β βββ models.rs # 30+ domain types and constants
β β βββ scheduler.rs # Constraint-based scheduler (324 LOC)
β βββ benches/ # Criterion benchmarks (5 profile scales)
β βββ tauri.conf.json # Tauri configuration
β βββ Cargo.toml # Rust dependencies
βββ docs/ # System architecture documentation
β βββ ARCHITECTURE.md # System design overview
β βββ SCHEDULER_ALGORITHM.md
β βββ DATABASE_SCHEMA.md
β βββ API_REFERENCE.md
β βββ TESTING_GUIDE.md
βββ .github/workflows/ # GitHub Actions
β βββ release.yml # Automated cross-platform builds
βββ vite.config.js # Vite bundler config
βββ package.json # Node.js dependencies
βββ PRODUCTION_AUDIT.md # Gap analysis & university pitch
βββ README.md # This file
| Command | Params | Returns | Notes |
|---|---|---|---|
login |
{username, password} |
SessionPayload |
Sets in-memory session |
logout |
- | - | Clears session |
get_session |
- | SessionPayload | null |
Sync with Rust state |
change_password |
{oldPassword, newPassword} |
- | Must be logged in |
| Command | Params | Returns |
|---|---|---|
get_users |
- | User[] |
create_user |
NewUser |
i64 (id) |
delete_user |
{id} |
- |
admin_reset_password |
{userId, newPassword} |
- |
set_user_active |
{userId, active} |
- |
| Command | Params | Returns |
|---|---|---|
get_organizations |
- | Organization[] |
create_organization |
NewOrganization |
i64 (id) |
update_organization |
{id, org} |
- |
delete_organization |
{id} |
- |
| Command | Params | Returns |
|---|---|---|
get_semesters |
{orgIdFilter?} |
Semester[] |
create_semester |
NewSemester |
i64 (id) |
update_semester |
{id, sem} |
- |
delete_semester |
{id} |
- |
Standard CRUD operations:
get_* β *[]create_* β i64 (id)update_* β -delete_* β -| Command | Params | Returns |
|---|---|---|
generate_schedule |
{scheduleName, semesterId?} |
{schedule_id, entry_count, unscheduled} |
get_schedules |
- | Schedule[] |
get_schedule_entries |
{scheduleId} |
ScheduleEntry[] |
activate_schedule |
{id} |
- |
delete_schedule |
{id} |
- |
export_schedule_csv |
{scheduleId} |
CSV string |
| Command | Params | Returns |
|---|---|---|
update_display_name |
{newName} |
- |
get_scheduling_settings |
{orgId} |
OrgSchedulingSettings |
upsert_scheduling_settings |
{settings} |
- |
clear_schedules |
- | i64 (count cleared) |
backup_database |
- | base64 string |
get_app_info |
- | AppInfo |
| Command | Params | Returns |
|---|---|---|
get_stats |
- | {courses, lecturers, rooms, batches, ...} |
/Applicationssudo xattr -rd com.apple.quarantine /Applications/Schedula.appadmin / admin123The project uses conventional commits for clear, scoped changes:
# View recent changes
git log --oneline | head -20
# See details of a feature
git show <commit-hash>
Commit types:
feat β new featurefix β bug fixdocs β documentationchore β internal cleanup, dependency updatesrefactor β code restructuring without behavior changetest β testing# Build optimized binary
npm run tauri build
# Output DMG is at:
# src-tauri/target/release/bundle/macos/Schedula.dmg
# Optionally sign and notarize for macOS Gatekeeper
# (requires Apple Developer account)
Create a GitHub release:
gh release create v0.1.0 \
--title "Schedula v0.1.0" \
--notes "Initial release: AI-powered timetable generator"
Upload DMG:
gh release upload v0.1.0 \
src-tauri/target/release/bundle/macos/Schedula.dmg
Users can then download from: https://github.com/yourusername/schedula/releases
Contributions are welcome! To contribute:
git checkout -b feat/your-featurenpm run tauri devGuidelines:
This project is licensed under the MIT License β see LICENSE for details.
Free Tier β Single-machine standalone app
Pro Plan ($29/month or $276/year)
Institution Plan ($99/month or $948/year)
π View full pricing at schedula.app
Built with:
For issues, questions, or feature requests:
Made with β€οΈ for academics worldwide