Skip to content

🍊 Exam scheduling and management platform for university oral assessments. Choose between a full-stack Rails web application or a native macOS Swift app.

License

Notifications You must be signed in to change notification settings

shawntz/clementime

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

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:

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

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

Mac App (Recommended)

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,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

Download Mac App Example CSV

Web App Format (Canvas Export Compatible)

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

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

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

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