Automated Gradescope submission tool for QUT students with a pretty CLI interface
Project description
QUT Gradescope Auto Submitter
As a QUT student, I was tired of:
- Clicking through Gradescope 50+ times per assignment when trying to see if I met test cases
- Being forced to wait when I'm trying to get quick feedback on my work
- Losing focus context switching between code editor and browser
- Manual file compression, uploads and form submissions
This tool automates the submission process so you can focus on coding, not clicking.
https://github.com/user-attachments/assets/42f96ca3-e640-4c72-8ba7-c43932be0d79
Install
Recommended — pipx (installs the CLI globally, separate from your project venv):
pipx install qut-gradescope-autosubmitter && playwright install chromium
If playwright isn't found after pipx, either pip install playwright once or use pipx install --include-deps qut-gradescope-autosubmitter so the Playwright CLI lands on your PATH.
Other options: pip install qut-gradescope-autosubmitter && playwright install chromium, or clone this repo and pip install -e ..
Run gradescope doctor if anything looks broken after install.
Usage
From your assignment repo (where your code lives):
gradescope init # creates gradescope.yml
gradescope login # once — browser opens for QUT SSO + 2FA
gradescope submit # zip, upload, wait for autograder (optional)
What submit does:
- Reads
gradescope.ymlfor course, assignment, and which files to include. - Builds a zip from tracked git files matching your
includeglobs. - Opens Gradescope in Chromium (or runs headless if you already logged in).
- Finds your course and assignment, uploads the zip, and handles resubmits.
- If
notify_when_graded: true, polls until a score appears in the terminal.
You run this whenever you want feedback — same loop as clicking through Gradescope yourself, minus the manual steps.
Login & session (why not passwords?)
QUT SSO requires 2FA, so the CLI doesn't ask for your password. That would mean storing credentials and trying to script around 2FA — brittle and not worth it for a coursework helper.
Instead, gradescope login opens a normal browser window. You sign in and complete 2FA yourself. The tool saves a Chromium profile under ~/.cache/qut_gradescope (cookies + local storage — like staying logged in on Chrome).
After that, gradescope submit reuses that session. No password in config, no secrets in env vars. If the session expires, run login again.
With a saved session you can set headless: true in config so submit runs without a visible window.
Config (gradescope.yml)
course: "cab201" # partial match on Gradescope course name
assignment: "t6q1" # partial match on assignment name
zip_name: submission.zip
include:
- "*.py"
notify_when_graded: true # wait for autograder score after upload
headless: false
In a git repo, only files from git ls-files are considered (respects .gitignore).
Git hooks (optional)
To submit on every commit from your assignment repo:
gradescope hooks --install post-commit --quick
Remove with rm .git/hooks/post-commit. Install hooks per repo, not in this tool repo.
Requirements
Python 3.8+, QUT Gradescope access, Chromium (via Playwright).
Changelog
2.0.0
- Browser session auth (
login/ saved profile) — 2FA handled by you once in the browser. - Slimmer CLI, orange Rich output,
includeglobs, git-based bundling. - Pytest CI; removed GitHub Action submit workflows (use local submit or hooks).
1.0.5
- README: QUT 2FA called out explicitly.
- Removed scheduled-submit workflow.
1.0.4
- Python 3.8 compatibility fix (
Optionaltyping in credentials helper).
1.0.3
- Clearer errors for wrong username/password.
- Headless/SSH: link to submission page when the browser can't stay open.
1.0.2
- Maintenance release (tagged on GitHub).
1.0.1
- First public PyPI release.
- Rich CLI, Playwright automation,
gradescope.yml, git hooks, optional GitHub Action submit.
Pre-1.0.1
Early TestPyPI builds before the stable 1.0 line.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qut_gradescope_autosubmitter-2.0.0.tar.gz.
File metadata
- Download URL: qut_gradescope_autosubmitter-2.0.0.tar.gz
- Upload date:
- Size: 19.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24f8da025d5afb34246df95f03dc6c00c75ff010b7556383ce9adc5472592657
|
|
| MD5 |
6248a7cf6c2ae79d7552bdbb87f1630b
|
|
| BLAKE2b-256 |
dace58d8daf2a1ba2ddf9d4aa502242a0b702ae407da357fa2b0463d44af71b3
|
Provenance
The following attestation bundles were made for qut_gradescope_autosubmitter-2.0.0.tar.gz:
Publisher:
python-publish.yml on danieltsam/qut-gradescope-autosubmitter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qut_gradescope_autosubmitter-2.0.0.tar.gz -
Subject digest:
24f8da025d5afb34246df95f03dc6c00c75ff010b7556383ce9adc5472592657 - Sigstore transparency entry: 1674151860
- Sigstore integration time:
-
Permalink:
danieltsam/qut-gradescope-autosubmitter@450adf7cb7b22f80094bf5903a017f0f40286e46 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/danieltsam
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@450adf7cb7b22f80094bf5903a017f0f40286e46 -
Trigger Event:
release
-
Statement type:
File details
Details for the file qut_gradescope_autosubmitter-2.0.0-py3-none-any.whl.
File metadata
- Download URL: qut_gradescope_autosubmitter-2.0.0-py3-none-any.whl
- Upload date:
- Size: 17.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
935966704661496cf1103e747e0f2bb54721235c86985e08ad0b2c93a3feeb8d
|
|
| MD5 |
b3c66f8caeff3244af5bdf4a02c130c5
|
|
| BLAKE2b-256 |
3cadcecfbcf0abc96350c9afb0d7ed91af69ad99be9e0af4b49b5075934af178
|
Provenance
The following attestation bundles were made for qut_gradescope_autosubmitter-2.0.0-py3-none-any.whl:
Publisher:
python-publish.yml on danieltsam/qut-gradescope-autosubmitter
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qut_gradescope_autosubmitter-2.0.0-py3-none-any.whl -
Subject digest:
935966704661496cf1103e747e0f2bb54721235c86985e08ad0b2c93a3feeb8d - Sigstore transparency entry: 1674151890
- Sigstore integration time:
-
Permalink:
danieltsam/qut-gradescope-autosubmitter@450adf7cb7b22f80094bf5903a017f0f40286e46 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/danieltsam
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@450adf7cb7b22f80094bf5903a017f0f40286e46 -
Trigger Event:
release
-
Statement type: