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.
Mac App β’ Web App β’ Documentation β’ Releases
- Platform Overview
- Choosing a Platform
- Platform Comparison
- Quick Start
- Student Roster Import
- Features Comparison
- Architecture
- Development Timeline
- Releases
- Contributing
- Support
- License
- Acknowledgments
This repository contains two independent implementations of Clementime, each with distinct strengths:
π± clementime-mac
Native macOS Application (Swift + SwiftUI + CloudKit)
A modern, offline-first Mac app designed for instructors who prefer native tools and iCloud integration.
Key Features:
- π¨ Native SwiftUI interface optimized for macOS
- βοΈ Automatic iCloud sync with CloudKit
- π΄ Full offline support with Core Data
- π Unlimited custom cohorts (not limited to odd/even)
- π Granular TA permission system
- ποΈ Built-in audio recording with iCloud storage
- π€ Course export/import (
.clementime.jsonfiles) - π€ Course sharing via CloudKit Share
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:
- π Cross-platform web access (any browser)
- π¬ Real-time Slack notifications for schedule changes
- π Canvas LMS integration for roster imports
- π₯ Multi-user admin dashboards
- π PostgreSQL database with Redis caching
- ποΈ Browser-based audio recording
- βοΈ Cloud storage (AWS S3 / Cloudflare R2)
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:
- β No external backend dependencies (self-contained)
- β Automatic iCloud sync (zero configuration)
- β Unlimited custom cohorts (flexible scheduling)
- β Unlimited exam sessions (not capped at 5)
- β Granular TA permissions (8 distinct permission types)
- β Native performance and full offline support
- β Cross-platform access (works on any OS)
- β Slack integration (automated notifications)
- β Canvas LMS integration (direct roster sync)
- β Multi-user real-time collaboration
- β Proven production stability
cd clementime-mac
open ClemenTime.xcodeprojcd clementime-web
bin/setup
bin/devReady to deploy Clementime at your institution?
- π Quick Start Guide - Get running in 10 minutes
- π Full Deployment Guide - Complete deployment documentation
- π³ Docker Hub: shawnschwartz/clementime
Recommended platforms:
- Render
- Docker
Both platforms support CSV roster imports, but use different formats:
sis_user_id,email,full_name,section_code
student001,alice@fakeuni.edu,Alice Johnson,F25-PSYCH-10-01
student002,bob@fakeuni.edu,Bob Smith,F25-PSYCH-10-02
student003,carol@fakeuni.edu,Carol Williams,F25-PSYCH-10-01
student004,david@fakeuni.edu,David Brown,F25-PSYCH-10-02
Student,SIS User ID,SIS Login ID,Section
"Johnson, Alice Marie",student001,alice.johnson@fakeuni.edu,F25-PSYCH-10-01
"Smith, Bob Thomas",student002,bob.smith@fakeuni.edu,F25-PSYCH-10-02
"Williams, Carol Ann",student003,carol.williams@fakeuni.edu,F25-PSYCH-10-01
"Brown, David Lee",student004,david.brown@fakeuni.edu,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:
- Slack workspace β Settings & administration β Workspace settings
- Import/Export Data β Export member list
- Download and import into Clementime
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 majorEach release automatically:
- π³ Builds and publishes Docker image for web app
- π» Builds macOS DMG installer (requires code signing setup)
- π Builds static web assets
- π Creates GitHub release with changelog
- π Tags release with version number
For macOS DMG builds: GitHub Actions requires code signing credentials. See macOS Code Signing Guide for setup instructions.
See RELEASE.md for detailed documentation.
- GitHub Releases: https://github.com/shawntz/clementime/releases
- Docker Hub: https://hub.docker.com/r/shawnschwartz/clementime
Contributions are welcome! This project is designed to help university instructors efficiently manage (oral) exam scheduling.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Found a bug or have a feature request? Please open an issue with:
- A clear description of the problem or feature
- Steps to reproduce (for bugs)
- Expected vs actual behavior
- Screenshots if applicable
Need help or have questions?
- π Read the Documentation
- π Report a Bug
- π‘ Request a Feature
- π¬ Discussions
Copyright Β© 2025 Shawn Schwartz
This project is licensed under the MIT License.
- Built with β€οΈ for university instructors managing (oral) exam scheduling
- Inspired by the need for flexible, offline-capable scheduling tools
- Special thanks to the SwiftUI and Rails communities
/app, /client) is in maintenance mode. All new features are being developed for the Mac app (clementime-mac).
Made with π by Shawn Schwartz