🍊 Clementime - Oral Exam Scheduling and Management System
8.4K
Available as a full-stack Rails/React web application with Slack integration and real-time notifications, and as a native Swift macOS app with CloudKit sync. Both platforms feature constraint-based scheduling, instructor dashboards, and cloud recording support.
This repository contains two independent implementations of Clementime, each with distinct strengths:
Native macOS Application (Swift + SwiftUI + CloudKit)
A modern, offline-first Mac app designed for instructors who prefer native tools and iCloud integration.
Key Features:
.clementime.json files)Requirements: macOS 15.0+
Status: ✅ Active development - Core features implemented
Screenshots:
Main course dashboard with cohort management and exam sessions
Constraint-based schedule generation
Full-Stack Rails + React (PostgreSQL + Redis)
A comprehensive web-based solution with multi-user collaboration, real-time notifications, and LMS integration.
Key Features:
Requirements: Ruby 3.4.6+, Rails 8.1.1+, PostgreSQL, Node.js
Status: ✅ Stable production deployment
Note: Web app code is located in the root directory (/app, /client, /config, etc.). Not currently in a subfolder.
Screenshots:
Multi-user admin dashboard with real-time updates
Automated Slack notifications for schedule changes
Both implementations share the same core scheduling algorithm but operate completely independently:
| Use the Mac App if you... | Use the Web App if you... |
|---|---|
| Want native macOS performance | Need cross-platform browser access |
| Prefer iCloud sync | Already use web servers / S3 storage |
| Work offline frequently | Want Slack-API notifications support |
| Need unlimited cohorts | Need Canvas LMS integration |
| Want granular permissions | Have an existing Rails infrastructure |
| Prefer standalone desktop-first (local) workflow | Need multi-user real-time collaboration (online) |
💡 Tip: Both platforms can export/import course data, so you can experiment with either approach.
While both platforms solve the same problem, they take different architectural approaches:
cd clementime-mac
open ClemenTime.xcodeproj
cd clementime-web
bin/setup
bin/dev
Ready to deploy Clementime at your institution?
Recommended platforms:
Both platforms support CSV roster imports, but use different formats:
sis_user_id,email,full_name,section_code
student001,[email protected],Alice Johnson,F25-PSYCH-10-01
student002,[email protected],Bob Smith,F25-PSYCH-10-02
student003,[email protected],Carol Williams,F25-PSYCH-10-01
student004,[email protected],David Brown,F25-PSYCH-10-02
Student,SIS User ID,SIS Login ID,Section
"Johnson, Alice Marie",student001,[email protected],F25-PSYCH-10-01
"Smith, Bob Thomas",student002,[email protected],F25-PSYCH-10-02
"Williams, Carol Ann",student003,[email protected],F25-PSYCH-10-01
"Brown, David Lee",student004,[email protected],F25-PSYCH-10-02
Note: The web app format matches Canvas LMS gradebook export format.
To export from Canvas: Go to your Canvas course → Grades → Export → Export Entire Gradebook. Upload the downloaded CSV directly to Clementime - extra columns will be ignored. The app will also merge with Slack member data if Slack integration is enabled.
To enable Slack notifications, export your workspace members and import them into Clementime:
How to export Slack members:
Download Slack Members Example CSV
Students are matched with Slack members by email address, enabling automated direct message notifications for schedule changes.
| Feature | Mac App | Web App |
|---|---|---|
| Platform | macOS 15.0+ | Web (any browser) |
| Backend | iCloud (CloudKit) | Rails + PostgreSQL |
| Offline Support | ✅ Full | ❌ No |
| Cohorts | ∞ Unlimited | 2 (odd/even) |
| Exam Limit | ∞ Unlimited | 5 exams |
| Permissions | Granular (8 types) | Basic (admin/TA) |
| Audio Recording | ✅ Built-in | ✅ Via browser |
| File Storage | iCloud | Google Drive / R2 |
| Slack Integration | 🚧 Planned | ✅ Yes |
| Canvas Integration | 🚧 Planned | ✅ Yes |
| Share Courses | ✅ CloudKit Share | ❌ No |
| Real-time Sync | ✅ Automatic | ❌ Manual refresh |
SwiftUI Views + ViewModels (Presentation)
↓
Use Cases + Entities (Domain)
↓
Repositories + Core Data (Data)
↓
CloudKit + AVFoundation (Infrastructure)
React Components (Frontend)
↓
Rails API (Backend)
↓
PostgreSQL + Redis (Storage)
↓
S3 Storage + Slack (Integrations)
Both the Mac app and Web app are released together using automated GitHub Actions workflows.
# Quick release (patch version bump)
./scripts/release.sh
# Feature release (minor version bump)
./scripts/release.sh minor
# Breaking changes (major version bump)
./scripts/release.sh major
Each release automatically:
For macOS DMG builds: GitHub Actions requires code signing credentials. See macOS Code Signing Guide for setup instructions.
See RELEASE.md for detailed documentation.
Contributions are welcome! This project is designed to help university instructors efficiently manage (oral) exam scheduling.
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Found a bug or have a feature request? Please open an issue with:
Need help or have questions?
Copyright © 2025 Shawn Schwartz
This project is licensed under the MIT License.
⚠️ Project Status: The web app (/app, /client) is in maintenance mode. All new features are being developed for the Mac app (clementime-mac).
Made with 🍊 by Shawn Schwartz
Content type
Image
Digest
sha256:713562b9e…
Size
304.1 MB
Last updated
9 months ago
docker pull shawnschwartz/clementime