{"id":13994743,"url":"https://github.com/github-education-resources/classroom","last_synced_at":"2025-09-27T10:32:06.565Z","repository":{"id":31515580,"uuid":"35079964","full_name":"github-education-resources/classroom","owner":"github-education-resources","description":"GitHub Classroom automates repository creation and access control, making it easy for teachers to distribute starter code and collect assignments on GitHub.","archived":true,"fork":false,"pushed_at":"2020-03-12T15:25:27.000Z","size":169709,"stargazers_count":1362,"open_issues_count":224,"forks_count":571,"subscribers_count":94,"default_branch":"master","last_synced_at":"2025-05-15T15:49:06.293Z","etag":null,"topics":["classroom","education","github","oauth","rails","ruby"],"latest_commit_sha":null,"homepage":"https://classroom.github.com","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/github-education-resources.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null}},"created_at":"2015-05-05T05:33:50.000Z","updated_at":"2025-05-06T06:07:48.000Z","dependencies_parsed_at":"2022-08-07T16:30:25.213Z","dependency_job_id":null,"html_url":"https://github.com/github-education-resources/classroom","commit_stats":null,"previous_names":["github-education-resources/classroom","education/classroom"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/github-education-resources/classroom","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/github-education-resources%2Fclassroom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/github-education-resources%2Fclassroom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/github-education-resources%2Fclassroom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/github-education-resources%2Fclassroom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/github-education-resources","download_url":"https://codeload.github.com/github-education-resources/classroom/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/github-education-resources%2Fclassroom/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":277219029,"owners_count":25781447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-27T02:00:08.978Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["classroom","education","github","oauth","rails","ruby"],"created_at":"2024-08-09T14:03:04.731Z","updated_at":"2025-09-27T10:32:03.154Z","avatar_url":"https://github.com/github-education-resources.png","language":"Ruby","readme":"# GitHub Classroom\n[![Build Status](https://travis-ci.org/education/classroom.svg?branch=master)](https://travis-ci.org/education/classroom) [![Code Climate](https://codeclimate.com/github/education/classroom/badges/gpa.svg)](https://codeclimate.com/github/education/classroom)\n\n---\n\nMoving forwards, GitHub Classroom will be developed internally alongside GitHub.com. As a result, we’re archiving the open source repository. This represents a significant “growing up” moment for GitHub Classroom as we strive to offer you the best education tools possible.\n\nWe’re making this decision for a few important reasons:\n\n1. Quality. To provide the best services to our varied and global community, we need GitHub Classroom to meet the operational excellence of GitHub.com. Continuing development internally allows us to make better use of GitHub’s internal resources, tooling, and infrastructure. \n\n2. Better support. Using GitHub Support as our primary feedback mechanism, instead of issues, allows us to assist our users in a more productive way. We can leverage the support infrastructure already in place for GitHub.com, and all user feedback can be kept in a single place. The Education team will continue to respond to all GitHub Classroom requests.\n\nGitHub Classroom will continue to evolve and improve based on your feedback. We’re growing faster than ever, and can’t wait to launch some very exciting new features in the coming months.\n\nIf you have questions, concerns, or feedback, don’t hesitate to contact us at https://support.github.com/contact.\n\nThank you!\n\nThe GitHub Classroom Team\n\n---\n\n## Table of Contents\n\n- [The workflow you use as a developer, scaled for the needs of students.](#the-workflow-you-use-as-a-developer-scaled-for-the-needs-of-students)\n- [Why try GitHub Classroom?](#why-try-classroom)\n- [Design principles](#design-principles)\n- [GitHub Classroom and the edtech ecosystem](#github-classroom-and-the-edtech-ecosystem)\n- [The technical details](#the-technical-details)\n- [Deployment](#deployment)\n- [Help wanted](#help-wanted)\n- [Contributors](#contributors)\n\n## The workflow you use as a developer, scaled for the needs of students.\n\nDevelopers rarely work all by themselves, on a deadline, or ship something they’ll only use once (with no idea whether it actually works).\n\nWouldn’t students be better served by showing versions of their work, iterating, checking in on milestones and showing off the final product?\n\nWith GitHub Classroom you can set up the industry-standard workflow and free up your time to focus on teaching.\n\n*GitHub Classroom is a teacher-facing tool that uses the GitHub API to enable the GitHub workflow for education.*\n\nYou create an Assignment with starter code and directions, send along one link, and students get their own “sandbox” copy of the repo to get started.\n\nSet due dates, track assignments in your teacher dashboard, or integrate other tools like testing frameworks.\n\nWith GitHub Classroom, you can spin up your course on GitHub and move on to the good stuff.\n\n[@johndbritton](https://github.com/johndbritton), [@mozzadrella](https://github.com/mozzadrella), [@d12](https://github.com/d12), [@benemdon](https://github.com/benemdon), [@srinjoym](https://github.com/srinjoym), and [@tarebyte](https://github.com/tarebyte), are all maintainers.\n\n![GitHub Classroom screenshot](https://cloud.githubusercontent.com/assets/1311594/14748352/32f677b0-0887-11e6-9ac2-8aa06e4341fa.png)\n\n## Why try GitHub Classroom?\n\n*Spend more time with students, less on setup.* Students accept an assignment with one link, so you can get straight to the material.\n\n*Bootstrap group assignments in a snap.* Invite students to a shared repository, and cap the number of students per group. Use the same groups over and over again, or create new ones.\n\n*More insight into student work than ever before.* See when students accept the assignment, and access their work from the moment they start. With version control, catch when they get stuck and help them rewind.\n\n*You are in control.* Students can work individually or in groups, in public or in private. Invite teaching assistants or graders to view the assignments.\n\n*Scales for large courses with ease.* If you have a small course, GitHub Classroom will make your life easier and save you time. If you have hundreds of students, we have you covered: as many repositories as you need, and webhooks to integrate automated testing tools.\n\n*Works with your Learning Management System (LMS).* Students submit a link to their assignment repository to your learning management system. Give feedback through comments in GitHub, but keep grades in your LMS.\n\n*You’re not alone.* The experts on the GitHub Education team are here to answer any of your questions, and we’ve got [docs](https://github.com/education/classroom/tree/master/docs), best practices, and a strong community of educators to help you migrate to GitHub Classroom.\n\n*Are you super-advanced?* Do you want to build your own tools? We 💖 contributions. Please check out [contributing guidelines](CONTRIBUTING.md).\n\n## Design principles\n\n*GitHub Classroom is a teacher-facing tool to simplify the educational use of GitHub.* Every student needs feedback and support as they learn to code, and using GitHub you can give them the right advice, in the right place, at the right time. GitHub Classroom makes it easier to use the workflow you love, with some automation and ease for student use.\n\n*Students use GitHub. They don’t use GitHub Classroom.* Experience with real-world tools gives students a leg-up once they move on from school. Invest time in the tools students can grow with, not another third-party tool with its own learning curve.\n\n*GitHub Classroom is not an LMS (Learning Management System).* If you need to use an LMS like Canvas, Moodle or Blackboard, we hear you. Students can post their repositories to your LMS. We’re going to stick with what we’re good at, which is helping people collaborate on code.\n\n*GitHub Classroom is open source.* Git and GitHub are versatile with many ways to meet your learning goals, and we want to model the open source process that makes our communities great.\n\nWe welcome contributions aligned with the roadmap below and through answering these questions:\n\n* Does it enable the real-life experience of using GitHub as a developer?\n* Does it replicate functionality that's best left to the expertise of content platforms, hardware or LMS?\n* How many support tickets and questions will the feature address?\n\n### Who is GitHub Classroom for?\nAnyone teaching computer science in a high school, university or informal environment.\nFolks who might also find GitHub Classroom useful:\n* Higher ed statistics and data science teachers\n* Higher ed biology and the hard sciences\n\n## GitHub Classroom and the edtech ecosystem\n\nIn case you’re wondering “How does GitHub Classroom interact with my favorite app/my notebook/my LMS” here’s the tl;dr on how those pieces fit together:\n\n*Apps and content platforms*\n\nExamples: Codecademy, Skillshare, Udemy, Udacity\n\nApps offer premium content and interactive exercises. GitHub Classroom offers *real-world experience* with code. GitHub Classroom, as a teacher-facing application will eventually surface best-in-class content for top courses (notes / lectures / problem sets) but not produce original content.\n\n*Learning Management system/LMS*\n\nExamples: Blackboard, Moodle, Canvas. Google Classroom\n\nTeachers often use a learning management system in keeping with student privacy regulations. GitHub Classroom has a lightweight integration with LMS ecosystem--students can submit a link to their repositories. LTI compliance and Google Classroom integration will make the app more extensible.\n\n*Notebooks*\n\nExamples: BlueJ, Jupyter, RStudio\n\nMost notebooks have a Git integration that students can push to. Future iterations may pre-populate repos with robust directions on set up.\n\n*Hardware*\n\nExamples: Chromebooks, Raspberry Pi, Lego\n\nGitHub Classroom runs in Unix environments and Windows. Shared machines or lab environments are encouraged to use cloud-based environments, like Cloud 9. Integration looks like Git and GitHub pre-loaded + embedded in hardware.\n\n*Assessment*\n\nExamples: Pearson, Travis CI, Circle CI\n\nFor GitHub Classroom, assessment is **directly related to the real-world experience of being a developer: your code passes tests**. Configuring folders in student repositories is a priority on the roadmap.\n\n## The technical details\nGitHub Classroom is a [Ruby on Rails](http://rubyonrails.org/) application.\n\nNew to Ruby? No worries! You can follow these instructions to install a local server.\n\n#### macOS\n\nIf you're using macOS and running the Homebrew package manager you're all set to go! Head down to [Setup GitHub Classroom](#setup-github-classroom)\n\n#### Linux\n\n##### Installing Docker and Docker Compose\n\nWe use Docker and docker-compose so that we don't have to setup our external dependencies on our machines.\n\nHere is the installation guide for Ubuntu: https://docs.docker.com/install/linux/docker-ce/ubuntu/\n\n##### Installing Rbenv\n\nFirst things first, you'll need to install Ruby. We recommend using the excellent [rbenv](https://github.com/sstephenson/rbenv), and [ruby-build](https://github.com/sstephenson/ruby-build).\n\n##### Install PostgreSQL\n\nIn order to install the `pg` gem you have to have PostgreSQL on your system, all you need to do is install it via your package manager of choice.\n\nIf you're running an Debian/Ubuntu based GNU/Linux for example run: `apt-get install nodejs postgresql redis-server memcached`.\n\n#### Windows\n\nWe really don't have a good story for running this on Windows, but Pull Requests are welcome :smile:\n\n### Setup GitHub Classroom\n\nWe follow the [script to rule them all](https://github.com/github/scripts-to-rule-them-all) principle, so all you need to do is run:\n\n```\nscript/setup\n```\n\nOnce that's done the script will kindly remind you to fill out you `.env` file inside the repository, this is the breakdown.\n\n### Development environment variables\n\nThese values must be present in your `.env` file (created by `script/setup`).\n\nENV Variable | Description |\n:-------------------|:-----------------|\n`CLASSROOM_WEBHOOK_URL_PREFIX` | Ngrok url to receive webhooks (run `./script/ngrok`).\n`GITHUB_CLIENT_ID`| the GitHub Application Client ID.\n`GITHUB_CLIENT_SECRET`| the GitHub Application Client Secret.\n`NON_STAFF_GITHUB_ADMIN_IDS` | GitHub `user_ids` of users to be granted staff level access.\n`GOOGLE_CLIENT_ID` | the Google Client ID\n`GOOGLE_CLIENT_SECRET` | the Google Client Secret\n\nTo obtain your `GitHub Client ID/Secret` you need to [register a new OAuth application](https://github.com/settings/applications/new).\n\nAfter you register your OAuth application, you should fill in the homepage url with `http://localhost:5000` and the authorization url with `http://localhost:5000/auth/github/callback`.\n\nTo obtain your GitHub User ID for the `NON_STAFF_GITHUB_ADMIN_IDS` field, go to `https://api.github.com/users/your_username`\n\nTo obtain your `Google Client ID/Secret` you will need to [create a new web application](http://console.developers.google.com). When creating credentials choose `OAuth Client ID`, then fill in the `Authorized JavaScript origins` with `http://localhost:5000` and the `Authorized redirect URIs` with `http://localhost:5000/auth/github/callback`. \n\nAfter creating your Google credientials, add the Google Classroom scopes of:\n* `https://www.googleapis.com/auth/classroom.courses.readonly`\n* `https://www.googleapis.com/auth/classroom.rosters.readonly`\n\n### Testing environment variables\n\nIf you want to make a functionality change to the application you will need to write tests to accompany that change. In order to do this, the test values in the .env file must be filled in.\n\nGitHub Classroom uses [VCR](https://github.com/vcr/vcr) for recording and playing back API fixtures during test runs. These cassettes (fixtures) are part of the Git project in the `spec/support/cassettes` folder. If you're not recording new cassettes you can run the specs with existing cassettes with:\n\n```bash\nscript/test\n```\n\nGitHub Classroom uses environmental variables for storing credentials used in testing, these values are located in your `.env` file (created by `script/setup`).\nIf you are recording new cassettes, you need to make sure all of these values are present.\n\nENV Variable | Description |\n:-------------------|:-----------------|\n`TEST_CLASSROOM_OWNER_GITHUB_ID` | GitHub `user_id` of an organization admin (classroom owner)\n`TEST_CLASSROOM_OWNER_GITHUB_TOKEN` | [OAuth Access Token](https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/#creating-multiple-tokens-for-oauth-apps) for GitHub Classroom on behalf of the test classroom owner\n`TEST_CLASSROOM_STUDENT_GITHUB_ID` | GitHub `user_id` of the student\n`TEST_CLASSROOM_STUDENT_GITHUB_TOKEN` | [OAuth Access Token](https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/#creating-multiple-tokens-for-oauth-apps) for GitHub Classroom on behalf of the test student\n`TEST_CLASSROOM_OWNER_ORGANIZATION_GITHUB_ID` | GitHub ID of classroom organization (preferably one created specifically for testing against)\n`TEST_CLASSROOM_OWNER_ORGANIZATION_GITHUB_LOGIN` | GitHub login of classroom organization (preferably one created specifically for testing against)\n\nTo obtain these values you will need:\n\n* A teacher (your primary GitHub account)\n* A student (another Github account, created for this purpose)\n* An organisation that the teacher is an owner of, but the student does not belong to.\n\nIt is best if you create your own organization for testing purposes, if you have done so:\n\nTo obtain the `OWNER_GITHUB_ID` value, you can go to `https://api.github.com/users/organization_owner_username`.\n\nTo obtain the `OWNER_GITHUB_TOKEN` value, you will need to log in to GitHub Classroom with the owner test account, pull up the Rails console, and copy the `token` field\n\nTo get the `STUDENT_GITHUB_ID` value you will need to create another user account on GitHub and get the ID by going to `https://api.github.com/users/student_username`\n\nTo get the `STUDENT_GITHUB_TOKEN` value, you will need to log in to GitHub Classroom with the student test account, pull up the Rails console, and copy the `token` field\n\nTo obtain the `OWNER_ORGANIZATION_GITHUB_ID/LOGIN` you can go to `https://api.github.com/orgs/organization_name`.\n\nNow you should have all of the values filled in, great job!\n\n### Running the application\n\n#### Optional\nIf you'd like to receive webhooks from GitHub you can run:\n\n```bash\nscript/ngrok\n```\n\nAnd update the `WEBHOOK_URL` in your .env file.\n\nAnd if you want to play with features that are still in development run:\n\n``\n./bin/rake enable_features\n``\n\n#### Necessary\nAfter that, you may start the rails server in a separate terminal with:\n\n```bash\nscript/server\n```\n\nAaand that's it! You should have a working instance of GitHub Classroom located [here](http://localhost:5000)\n\n#### Debugging\nWe use [pry-rails](https://github.com/rweng/pry-rails) and [byebug](https://github.com/deivid-rodriguez/byebug) for debugging. But since we use `overmind` in the development environment, debugging via `byebug` or via `binding.pry` requires a few more steps:\n\n* Once you start your server using `script/server`, `overmind` will start tmux processes depending on the `Procfile`.\n* We have two such processes `rails` and `sidekiq` (See `Procfile.dev` for details) that you can control.\n* Once you've added a debugging statement in the code and your request pauses, you can access console in a separate tab/window using the following command:\n  * `overmind connect rails` for debugging in request-response cycle, typically controllers, models, services.\n  * `overmind connect sidekiq` for debugging in background jobs.\n* After you've finished debugging you can close the connection using `Ctrl+b d`.\n\nFor more details please visit `overmind` homepage: https://github.com/DarthSim/overmind\n\n## Deployment\nWe strongly encourage you to use [https://classroom.github.com](https://classroom.github.com), but if you would like your own version GitHub Classroom can be easily deployed to Heroku.\n\n[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)\n\nThere are a few environment variables you will need to know in order to get GitHub Classroom working on production.\n\n### Production environment variables\n\nENV Variable | Description |\n:-------------------|:-----------------|\n`CANONICAL_HOST` | the preferred hostname for the application, if set requests served on other hostnames will be redirected\n`GOOGLE_ANALYTICS_TRACKING_ID` | identifier for Google Analytics in the format `UA-.*`\n`PINGLISH_ENABLED` | Enable the `/_ping` endpoint with relevant health checks\n`MOTD` | Show the message of the day banner at the top of the site\n\n## Help wanted\nIf you're interested in helping out with GitHub Classroom development and looking for a place to get started, check out the issues labeled [`help-wanted`](https://github.com/education/classroom/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted+%3Araised_hand_with_fingers_splayed%3A%22) and feel free to ask any questions you have before diving into the code.\n\n## Contributors\nGitHub Classroom is developed by these [contributors](https://github.com/education/classroom/graphs/contributors).\n\nShout out to [GitHub Summer of Code](https://github.com/blog/1970-students-work-on-open-source-with-github-this-summer) student, [Mark Tareshawty](http://marktareshawty.com), from [The Ohio State University](https://www.osu.edu/) for his work on GitHub Classroom.\n","funding_links":[],"categories":["Ruby","ruby"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgithub-education-resources%2Fclassroom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgithub-education-resources%2Fclassroom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgithub-education-resources%2Fclassroom/lists"}