{"id":31565435,"url":"https://github.com/shawntz/clementime","last_synced_at":"2026-04-22T00:32:51.576Z","repository":{"id":315562552,"uuid":"1058531350","full_name":"shawntz/clementime","owner":"shawntz","description":"🍊 Exam scheduling and management platform for university oral assessments. Choose between a full-stack Rails web application or a native macOS Swift app.","archived":false,"fork":false,"pushed_at":"2026-02-28T21:30:58.000Z","size":19853,"stargazers_count":1,"open_issues_count":3,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-01T00:44:05.480Z","etag":null,"topics":["audio-recording","automation","calendaring","docker","google-drive-uploader","macos-app","oral-exam","scheduler-service","slack","slack-api","slack-app","slackbot","swiftui","teaching-management"],"latest_commit_sha":null,"homepage":"http://clementime.app/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shawntz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"shawntz","patreon":"shawnschwartz","buy_me_a_coffee":"shawntz"}},"created_at":"2025-09-17T08:03:48.000Z","updated_at":"2025-12-27T02:59:53.000Z","dependencies_parsed_at":"2025-09-19T10:46:17.967Z","dependency_job_id":"f6591382-86a9-4f0a-ae9e-be00ff718143","html_url":"https://github.com/shawntz/clementime","commit_stats":null,"previous_names":["shawntz/clementime"],"tags_count":100,"template":false,"template_full_name":null,"purl":"pkg:github/shawntz/clementime","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shawntz%2Fclementime","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shawntz%2Fclementime/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shawntz%2Fclementime/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shawntz%2Fclementime/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shawntz","download_url":"https://codeload.github.com/shawntz/clementime/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shawntz%2Fclementime/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32115874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T00:31:26.853Z","status":"ssl_error","status_checked_at":"2026-04-22T00:30:22.894Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio-recording","automation","calendaring","docker","google-drive-uploader","macos-app","oral-exam","scheduler-service","slack","slack-api","slack-app","slackbot","swiftui","teaching-management"],"created_at":"2025-10-05T07:06:57.099Z","updated_at":"2026-04-22T00:32:51.571Z","avatar_url":"https://github.com/shawntz.png","language":"Swift","funding_links":["https://github.com/sponsors/shawntz","https://patreon.com/shawnschwartz","https://buymeacoffee.com/shawntz"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"./docs/logo.png\" alt=\"Clementime App Logo\" width=\"128\" height=\"128\"\u003e\n\n# Clementime\n\n### 🍊 Multi-platform Oral Exam Scheduler for Universities\n\n[![Version](https://img.shields.io/github/v/release/shawntz/clementime?style=flat\u0026color=orange)](https://github.com/shawntz/clementime/releases)\n[![Website](https://img.shields.io/badge/Website-clementime.app-orange?style=flat\u0026logo=safari)](https://clementime.app)\n[![macOS](https://img.shields.io/badge/macOS-15.0+-blue.svg)](https://www.apple.com/macos/)\n[![Swift](https://img.shields.io/badge/Swift-5.9-orange.svg)](https://swift.org)\n[![Ruby](https://img.shields.io/badge/Ruby-3.4.6-red.svg)](https://www.ruby-lang.org/)\n[![Rails](https://img.shields.io/badge/Rails-8.1.1-red.svg)](https://rubyonrails.org/)\n[![Docker Pulls](https://img.shields.io/docker/pulls/shawnschwartz/clementime)](https://hub.docker.com/r/shawnschwartz/clementime)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE)\n[![GitHub stars](https://img.shields.io/github/stars/shawntz/clementime?style=social)](https://github.com/shawntz/clementime/stargazers)\n\n**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.**\n\n[Mac App](./clementime-mac) • [Web App](#-web-application) • [Documentation](./clementime-mac/README.md) • [Releases](https://github.com/shawntz/clementime/releases)\n\n\u003c/div\u003e\n\n---\n\n## Table of Contents\n\n- [Platform Overview](#platform-overview)\n  - [📱 macOS Application](#-clementime-mac)\n  - [🌐 Web Application](#-web-application)\n- [Choosing a Platform](#choosing-a-platform)\n- [Platform Comparison](#platform-comparison-key-differences)\n- [Quick Start](#quick-start)\n- [Student Roster Import](#student-roster-import)\n- [Features Comparison](#features-comparison)\n- [Architecture](#architecture)\n- [Development Timeline](#development-timeline)\n- [Releases](#releases)\n- [Contributing](#contributing)\n- [Support](#support)\n- [License](#license)\n- [Acknowledgments](#acknowledgments)\n\n---\n\n## Platform Overview\n\nThis repository contains **two independent implementations** of Clementime, each with distinct strengths:\n\n### 📱 [clementime-mac](./clementime-mac)\n**Native macOS Application** (Swift + SwiftUI + CloudKit)\n\nA modern, offline-first Mac app designed for instructors who prefer native tools and iCloud integration.\n\n**Key Features:**\n- 🎨 Native SwiftUI interface optimized for macOS\n- ☁️ Automatic iCloud sync with CloudKit\n- 📴 Full offline support with Core Data\n- 🎭 Unlimited custom cohorts (not limited to odd/even)\n- 🔐 Granular TA permission system\n- 🎙️ Built-in audio recording with iCloud storage\n- 📤 Course export/import (`.clementime.json` files)\n- 🤝 Course sharing via CloudKit Share\n\n**Requirements**: macOS 15.0+\n\n**Status**: ✅ Active development - Core features implemented\n\n**Screenshots:**\n\n![Mac App - Course Dashboard](./docs/screenshots/mac-welcome.png)\n*Main course dashboard with cohort management and exam sessions*\n\n![Mac App - Schedule Generator](./docs/screenshots/mac-exam-sessions.png)\n![Mac App - Schedule Generator](./docs/screenshots/mac-pdf-export.png)\n![Mac App - Schedule Generator](./docs/screenshots/mac-pdf-export-pdf.png)\n*Constraint-based schedule generation*\n\n---\n\n### 🌐 Web Application\n**Full-Stack Rails + React** (PostgreSQL + Redis)\n\nA comprehensive web-based solution with multi-user collaboration, real-time notifications, and LMS integration.\n\n**Key Features:**\n- 🌍 Cross-platform web access (any browser)\n- 💬 Real-time Slack notifications for schedule changes\n- 📚 Canvas LMS integration for roster imports\n- 👥 Multi-user admin dashboards\n- 📊 PostgreSQL database with Redis caching\n- 🎙️ Browser-based audio recording\n- ☁️ Cloud storage (AWS S3 / Cloudflare R2)\n\n**Requirements**: Ruby 3.4.6+, Rails 8.1.1+, PostgreSQL, Node.js\n\n**Status**: ✅ Stable production deployment\n\n**Note**: Web app code is located in the root directory (`/app`, `/client`, `/config`, etc.). Not currently in a subfolder.\n\n**Screenshots:**\n\n![Web App - Admin Dashboard](./docs/screenshots/web-portal.png)\n*Multi-user admin dashboard with real-time updates*\n\n![Web App - Slack Integration](./docs/screenshots/web-slack-login.png)\n![Web App - Slack Integration](./docs/screenshots/web-slack-overview.png)\n*Automated Slack notifications for schedule changes*\n\n---\n\n## Choosing a Platform\n\nBoth implementations share the same core scheduling algorithm but operate **completely independently**:\n\n| Use the **Mac App** if you... | Use the **Web App** if you... |\n|-------------------------------|-------------------------------|\n| Want native macOS performance | Need cross-platform browser access |\n| Prefer iCloud sync | Already use web servers / S3 storage |\n| Work offline frequently | Want Slack-API notifications support |\n| Need unlimited cohorts | Need Canvas LMS integration |\n| Want granular permissions | Have an existing Rails infrastructure |\n| Prefer standalone desktop-first (local) workflow | Need multi-user real-time collaboration (online) |\n\n\u003e **💡 Tip**: Both platforms can export/import course data, so you can experiment with either approach.\n\n## Platform Comparison: Key Differences\n\nWhile both platforms solve the same problem, they take different architectural approaches:\n\n### Mac App Advantages\n- ✅ No external backend dependencies (self-contained)\n- ✅ Automatic iCloud sync (zero configuration)\n- ✅ Unlimited custom cohorts (flexible scheduling)\n- ✅ Unlimited exam sessions (not capped at 5)\n- ✅ Granular TA permissions (8 distinct permission types)\n- ✅ Native performance and full offline support\n\n### Web App Advantages\n- ✅ Cross-platform access (works on any OS)\n- ✅ Slack integration (automated notifications)\n- ✅ Canvas LMS integration (direct roster sync)\n- ✅ Multi-user real-time collaboration\n- ✅ Proven production stability\n\n## Quick Start\n\n### Mac App (Recommended)\n\n```bash\ncd clementime-mac\nopen ClemenTime.xcodeproj\n```\n\n### Web App (Legacy)\n\n```bash\ncd clementime-web\nbin/setup\nbin/dev\n```\n\n## Deployment\n\nReady to deploy Clementime at your institution?\n\n- 🚀 **[Quick Start Guide](./docs/QUICK_START.md)** - Get running in 10 minutes\n- 📚 **[Full Deployment Guide](./docs/DEPLOYMENT_GUIDE.md)** - Complete deployment documentation\n- 🐳 **Docker Hub**: [shawnschwartz/clementime](https://hub.docker.com/r/shawnschwartz/clementime)\n\n**Recommended platforms:**\n- Render\n- Docker\n\n## Student Roster Import\n\nBoth platforms support CSV roster imports, but use different formats:\n\n### Mac App Format\n\n```csv\nsis_user_id,email,full_name,section_code\nstudent001,alice@fakeuni.edu,Alice Johnson,F25-PSYCH-10-01\nstudent002,bob@fakeuni.edu,Bob Smith,F25-PSYCH-10-02\nstudent003,carol@fakeuni.edu,Carol Williams,F25-PSYCH-10-01\nstudent004,david@fakeuni.edu,David Brown,F25-PSYCH-10-02\n```\n\n**[Download Mac App Example CSV](./docs/examples/roster-mac-example.csv)**\n\n### Web App Format (Canvas Export Compatible)\n\n```csv\nStudent,SIS User ID,SIS Login ID,Section\n\"Johnson, Alice Marie\",student001,alice.johnson@fakeuni.edu,F25-PSYCH-10-01\n\"Smith, Bob Thomas\",student002,bob.smith@fakeuni.edu,F25-PSYCH-10-02\n\"Williams, Carol Ann\",student003,carol.williams@fakeuni.edu,F25-PSYCH-10-01\n\"Brown, David Lee\",student004,david.brown@fakeuni.edu,F25-PSYCH-10-02\n```\n\n**[Download Web App Example CSV](./docs/examples/roster-web-example.csv)**\n\n\u003e **Note**: The web app format matches Canvas LMS gradebook export format.\n\u003e\n\u003e **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.\n\n### Slack Integration (Web App Only)\n\nTo enable Slack notifications, export your workspace members and import them into Clementime:\n\n**How to export Slack members**:\n1. Slack workspace → Settings \u0026 administration → Workspace settings\n2. Import/Export Data → Export member list\n3. Download and import into Clementime\n\n**[Download Slack Members Example CSV](./docs/examples/slack-members-example.csv)**\n\nStudents are matched with Slack members by email address, enabling automated direct message notifications for schedule changes.\n\n## Features Comparison\n\n| Feature | Mac App | Web App |\n|---------|---------|---------|\n| Platform | macOS 15.0+ | Web (any browser) |\n| Backend | iCloud (CloudKit) | Rails + PostgreSQL |\n| Offline Support | ✅ Full | ❌ No |\n| Cohorts | ∞ Unlimited | 2 (odd/even) |\n| Exam Limit | ∞ Unlimited | 5 exams |\n| Permissions | Granular (8 types) | Basic (admin/TA) |\n| Audio Recording | ✅ Built-in | ✅ Via browser |\n| File Storage | iCloud | Google Drive / R2 |\n| Slack Integration | 🚧 Planned | ✅ Yes |\n| Canvas Integration | 🚧 Planned | ✅ Yes |\n| Share Courses | ✅ CloudKit Share | ❌ No |\n| Real-time Sync | ✅ Automatic | ❌ Manual refresh |\n\n## Architecture\n\n### Mac App Architecture\n\n```\nSwiftUI Views + ViewModels (Presentation)\n    ↓\nUse Cases + Entities (Domain)\n    ↓\nRepositories + Core Data (Data)\n    ↓\nCloudKit + AVFoundation (Infrastructure)\n```\n\n### Web App Architecture\n\n```\nReact Components (Frontend)\n    ↓\nRails API (Backend)\n    ↓\nPostgreSQL + Redis (Storage)\n    ↓\nS3 Storage + Slack (Integrations)\n```\n\n## Releases\n\nBoth the Mac app and Web app are released together using automated GitHub Actions workflows.\n\n### Creating a Release\n\n```bash\n# Quick release (patch version bump)\n./scripts/release.sh\n\n# Feature release (minor version bump)\n./scripts/release.sh minor\n\n# Breaking changes (major version bump)\n./scripts/release.sh major\n```\n\nEach release automatically:\n- 🐳 Builds and publishes Docker image for web app\n- 💻 Builds macOS DMG installer (requires code signing setup)\n- 🌐 Builds static web assets\n- 📝 Creates GitHub release with changelog\n- 🔖 Tags release with version number\n\n**For macOS DMG builds**: GitHub Actions requires code signing credentials. See [macOS Code Signing Guide](./docs/MACOS_CODE_SIGNING.md) for setup instructions.\n\nSee [RELEASE.md](./RELEASE.md) for detailed documentation.\n\n### Downloading Releases\n\n- **GitHub Releases**: https://github.com/shawntz/clementime/releases\n- **Docker Hub**: https://hub.docker.com/r/shawnschwartz/clementime\n\n## Contributing\n\nContributions are welcome! This project is designed to help university instructors efficiently manage (oral) exam scheduling.\n\n### How to Contribute\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n### Reporting Issues\n\nFound a bug or have a feature request? Please [open an issue](https://github.com/shawntz/clementime/issues) with:\n- A clear description of the problem or feature\n- Steps to reproduce (for bugs)\n- Expected vs actual behavior\n- Screenshots if applicable\n\n---\n\n## Support\n\nNeed help or have questions?\n\n- 📖 [Read the Documentation](./clementime-mac/README.md)\n- 🐛 [Report a Bug](https://github.com/shawntz/clementime/issues/new?template=bug_report.md)\n- 💡 [Request a Feature](https://github.com/shawntz/clementime/issues/new?template=feature_request.md)\n- 💬 [Discussions](https://github.com/shawntz/clementime/discussions)\n\n---\n\n## License\n\nCopyright © 2025 Shawn Schwartz\n\nThis project is licensed under the [MIT License](./LICENSE).\n\n---\n\n## Acknowledgments\n\n- Built with ❤️ for university instructors managing (oral) exam scheduling\n- Inspired by the need for flexible, offline-capable scheduling tools\n- Special thanks to the SwiftUI and Rails communities\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**⚠️ Project Status**: The web app (`/app`, `/client`) is in maintenance mode. All new features are being developed for the Mac app (`clementime-mac`).\n\nMade with 🍊 by [Shawn Schwartz](https://shawnschwartz.com)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshawntz%2Fclementime","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshawntz%2Fclementime","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshawntz%2Fclementime/lists"}