Sign inSign up

shawnschwartz/clementime

By shawnschwartz

•Updated 9 months ago

🍊 Clementime - Oral Exam Scheduling and Management System

Image
Data science
Web servers
Content management system
0

8.7K

shawnschwartz/clementime repository overview

Clementime App Logo

⁠Clementime

⁠🍊 Multi-platform Oral Exam Scheduler for Universities

Version Website macOS Swift Ruby Rails Docker Pulls License GitHub stars

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⁠


⁠Table of Contents


⁠Platform Overview

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.json files)
  • 🤝 Course sharing via CloudKit Share

Requirements: macOS 15.0+

Status: ✅ Active development - Core features implemented

Screenshots:

Mac App - Course Dashboard Main course dashboard with cohort management and exam sessions

Mac App - Schedule Generator Mac App - Schedule Generator Mac App - Schedule Generator Constraint-based schedule generation


⁠🌐 Web Application

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:

Web App - Admin Dashboard Multi-user admin dashboard with real-time updates

Web App - Slack Integration Web App - Slack Integration Automated Slack notifications for schedule changes


⁠Choosing a Platform

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 performanceNeed cross-platform browser access
Prefer iCloud syncAlready use web servers / S3 storage
Work offline frequentlyWant Slack-API notifications support
Need unlimited cohortsNeed Canvas LMS integration
Want granular permissionsHave an existing Rails infrastructure
Prefer standalone desktop-first (local) workflowNeed multi-user real-time collaboration (online)

💡 Tip: Both platforms can export/import course data, so you can experiment with either approach.

⁠Platform Comparison: Key Differences

While both platforms solve the same problem, they take different architectural approaches:

⁠Mac App Advantages
  • ✅ 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
⁠Web App Advantages
  • ✅ 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

⁠Quick Start

cd clementime-mac
open ClemenTime.xcodeproj
⁠Web App (Legacy)
cd clementime-web
bin/setup
bin/dev

⁠Deployment

Ready to deploy Clementime at your institution?

Recommended platforms:

  • Render
  • Docker

⁠Student Roster Import

Both platforms support CSV roster imports, but use different formats:

⁠Mac App Format
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

Download Mac App Example CSV⁠

⁠Web App Format (Canvas Export Compatible)
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

Download Web App Example CSV⁠

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.

⁠Slack Integration (Web App Only)

To enable Slack notifications, export your workspace members and import them into Clementime:

How to export Slack members:

  1. Slack workspace → Settings & administration → Workspace settings
  2. Import/Export Data → Export member list
  3. 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.

⁠Features Comparison

FeatureMac AppWeb App
PlatformmacOS 15.0+Web (any browser)
BackendiCloud (CloudKit)Rails + PostgreSQL
Offline Support✅ Full❌ No
Cohorts∞ Unlimited2 (odd/even)
Exam Limit∞ Unlimited5 exams
PermissionsGranular (8 types)Basic (admin/TA)
Audio Recording✅ Built-in✅ Via browser
File StorageiCloudGoogle Drive / R2
Slack Integration🚧 Planned✅ Yes
Canvas Integration🚧 Planned✅ Yes
Share Courses✅ CloudKit Share❌ No
Real-time Sync✅ Automatic❌ Manual refresh

⁠Architecture

⁠Mac App Architecture
SwiftUI Views + ViewModels (Presentation)
    ↓
Use Cases + Entities (Domain)
    ↓
Repositories + Core Data (Data)
    ↓
CloudKit + AVFoundation (Infrastructure)
⁠Web App Architecture
React Components (Frontend)
    ↓
Rails API (Backend)
    ↓
PostgreSQL + Redis (Storage)
    ↓
S3 Storage + Slack (Integrations)

⁠Releases

Both the Mac app and Web app are released together using automated GitHub Actions workflows.

⁠Creating a Release
# 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:

  • 🐳 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.

⁠Downloading Releases

⁠Contributing

Contributions are welcome! This project is designed to help university instructors efficiently manage (oral) exam scheduling.

⁠How to Contribute
  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request
⁠Reporting Issues

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

⁠Support

Need help or have questions?


⁠License

Copyright © 2025 Shawn Schwartz

This project is licensed under the MIT License⁠.


⁠Acknowledgments

  • 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

⚠️ 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⁠

Tag summary

Content type

Image

Digest

sha256:713562b9e…

Size

304.1 MB

Last updated

9 months ago

docker pull shawnschwartz/clementime