{"id":37729550,"url":"https://github.com/athina-edu/athina","last_synced_at":"2026-01-16T13:47:51.149Z","repository":{"id":37793228,"uuid":"171979610","full_name":"athina-edu/athina","owner":"athina-edu","description":"A formative assessment microservice for programming assignments","archived":false,"fork":false,"pushed_at":"2026-01-13T22:01:27.000Z","size":1571,"stargazers_count":3,"open_issues_count":16,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-14T00:38:27.336Z","etag":null,"topics":["autograding","canvas","elearning","formative-feedback","git","microservice"],"latest_commit_sha":null,"homepage":"","language":"Python","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/athina-edu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2019-02-22T02:22:27.000Z","updated_at":"2026-01-13T22:01:29.000Z","dependencies_parsed_at":"2023-10-16T08:38:59.975Z","dependency_job_id":"c5774e70-6c5b-478e-9622-c7ab0ab0cd5c","html_url":"https://github.com/athina-edu/athina","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/athina-edu/athina","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athina-edu%2Fathina","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athina-edu%2Fathina/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athina-edu%2Fathina/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athina-edu%2Fathina/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/athina-edu","download_url":"https://codeload.github.com/athina-edu/athina/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/athina-edu%2Fathina/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479034,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: 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":["autograding","canvas","elearning","formative-feedback","git","microservice"],"created_at":"2026-01-16T13:47:51.060Z","updated_at":"2026-01-16T13:47:51.127Z","avatar_url":"https://github.com/athina-edu.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ATHINA - An autograder, automated feedback microservice\n\nBuild status:\n[![Build Status Semaphore](https://athina.semaphoreci.com/badges/athina.svg?key=ed440197-2482-4083-aa51-5a6f53213480\u0026style=shields)](https://athina.semaphoreci.com/projects/athina)\n\nCode Quality Metrics:\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=bugs)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=code_smells)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Duplicated Lines Density](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=ncloc)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=athina-edu_athina\u0026metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=athina-edu_athina)\n\n\nAthina is a formative assessment microservice for programming assignments. There is also an optional associated web interface \nfor managing multiple assignments by multiple instructors on a single machine (see [Athina-Web](https://github.com/athina-edu/athina-web)).\n\nNeed plug-and-play assignments, tests and test configuration for your course? Check out [Athina Assignments](https://github.com/athina-edu/athina-assignments) repository.\n\n| Supported programming languages        | Supported e-learning platforms           | \n| :-------------: |:-------------:| \n| ![C, C++, Bash, Java, Python, Ruby, ... (virtually any)](docs/img/languages1.png)      | ![Canvas](docs/img/canvas-logo-3.jpg) | \n|   **Supported VCS (anything Git)**      | **Supported plagiarism check software**      |\n| ![git (github, gitlab etc.)](docs/img/git.jpg)     | Moss |\n\n# Here is what it does:\n1. Build your tests in your language of choice\n2. Your tests can print anything. The last line is the grade from 0-100\n3. Setup Athina's yaml file and define tests and their weights along with other options (e.g., students per assignment)\n4. Place your files in the tests directory and construct your environment (using Dockerfile)\n5. Run athina as a service\n6. Students submit on Canvas their repo urls.\n7. Athina, clones, looks for changes, runs some safety checks, sandboxes the code and then uses your tests.\n8. Then, it submits feedback, grade along with all text printed from the test to the student's Canvas\nsubmission page (as a comment or file attachment containing the text).\n\n# Security Features\n* All tests are sandboxed (using firejail or docker)\n* Only 1 student can submit the same git url, but can also permit more (for group projects)\n* Moss implementation notifies student of the average similarity scores for plagiarism\n* Git authentication only happens under the specified domain url (e.g., github.com)\n* Git credentials and configuration cannot be obtained through student code execution\n* Tests are forcefully timed out after a certain period of time (e.g., in case of infinite loops)\n\n# Testing\n\nAthina includes a comprehensive test suite that can run in both local development and production environments.\n\n## Quick Start\n\n```bash\n# Install dependencies\npipenv install --dev\n\n# Run all tests (uses SQLite, no database setup needed)\npipenv run pytest\n\n# Or use the convenient test runner script\n./run_tests.sh\n```\n\nFor more details, see [TESTING.md](TESTING.md).\n\n## Test Modes\n\n- **Local Development** (default): Uses SQLite - no database configuration needed\n- **Production/CI**: Uses MySQL with automatic Docker container management\n\n```bash\n# Run with MySQL in Docker (like production)\nATHINA_USE_DOCKER_MYSQL=1 pipenv run pytest\n```\n\n## Requirements\n\n- Python 3.14+ (local development with pipenv)\n- Python 3.12+ (CI/CD testing with Semaphore — 3.14 not yet available on Semaphore)\n- Docker (for MySQL tests and production)\n- pipenv (for dependency management)\n\n# Installation\n## One click run/install\nThis includes Athina's Web Interface and auto configuration:\n\n`git clone https://github.com/athina-edu/athina-one-click-run`\n\n`cd athina-one-click-run`\n\n`./run.sh`\n\nNavigate to 127.0.0.1:8000 (or your domain) on your browser and add some assignments\nusing your newly created root user or signup with another user. Athina will automatically test\nthese depending on their configuration file.\n\n## via Docker\n`sudo apt install docker.io docker-compose` # *(Ubuntu 18.04 or revise according to your distro)*\n\n`wget https://raw.githubusercontent.com/athina-edu/athina/master/docker-compose.yml`\n\n`docker-compose run athina \u003ccommand line params\u003e`\n\n## from Source (Ubuntu 18.04)\n`sudo apt install python3 python3-pip git firejail docker.io`\n\n`git clone https://github.com/athina-edu/athina.git`\n\n`pip3 install .`\n\n\n# Video Tutorial\nHow to configure and build tests: https://youtu.be/TAYRRYnk3NQ\n\n# Usage (10 second tutorial)\nThe following runs the [example configuration](config-examples) (your tests) against a [test repo](https://github.com/athina-edu/testing.git) (e.g., student code) that contains a simple python file. \nTests use pylint3 and output a grade for the student.\n\n#### docker\n\n`docker-compose run athina --config config-examples/ --repo_url_testing=https://github.com/athina-edu/testing.git`\n\n#### source build\n\n\n`bin/athina-cli --config config-examples/ --repo_url_testing=https://github.com/athina-edu/testing.git`\n\nTests that use docker (instead of firejail) take longer the first time they are executed but subsequent runs are virtually instant.\n\n# Usage\n1. Build your tests as you would normally. Print as many things that you want students to see and make sure the last \nitem(line) you print is their grade from 0-100. Decimals are accepted. The directories of the student code and tests \nare passed as environmental variables to the [Dockerfile](config-examples/Dockerfile).\n![test-script](docs/img/test-script.png \"Test-Script\")\n![test-script-result](docs/img/test-script-result.png \"Test-Script-Result\")\n\n2. Setup the [configuration file](config-examples/assignementsample.yaml) for athina with your settings. Canvas' access token\ncan be retrieved from your canvas' personal settings.\n![config](docs/img/config.png \"Config\")\n![canvas-access](docs/img/canvas-access.png \"Canvas-Access\")\n\n3. Copy your tests inside your new folder's tests directory (e.g., [tests](config-examples/tests)).\n\n4. Run athina via command line (if you are not using the one-click-run variant).\n    * Running your config assignment but still receiving the log message on terminal (this will send grades to canvas for assignments that have submitted URLs):\n    `athina-cli --config /path/to/config/folder --verbose`\n    * Running your config assignment and getting a log file inside config directory:\n    `athina-cli --config /path/to/config/folder`\n    * If you use athinaweb to manage numerous assignments use:\n    `athina-cli --json http://yourathinaweburl/assignments/api`\n    * If you want to run it as a service use:\n    `athina-cli --json http://yourathinaweburl/assignments/api -s`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fathina-edu%2Fathina","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fathina-edu%2Fathina","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fathina-edu%2Fathina/lists"}