A clean Android app for SUSTech campus services. Anywhere, anytime.
- Printing (
pms) — 联创 cloud print: upload with all five options, queue + delete, scans, usage report, stations - Courses & grades (
tis) — this week's timetable on its real period grid, enrolled courses, grades + GPA, exams - Blackboard (
bb) — enrolled courses and the assignments coming due - Library — how many people are inside each library right now, and where a book is (floor, shelf, availability)
- Transit — the campus shuttle: every stop as a place, nearest first; pick a direction and see the buses on the way, live
- Today — week number, next class, campus weather, AQI, next exam
- Widget — the next class or the next bus, on the home screen
- Account — stored school account, per-service session state, network state (campus / off campus / offline)
The Services tab also lists what is not built yet — venue booking, course reviews, faculty, exchange, Wi-Fi. That list is the backlog shared with the Python and TypeScript clients below, not a marketing one.
Course selection, bidding and evaluation are intentionally not in the app.
Grab the APK from Releases (Android 8.0+), open it, allow "install unknown apps" once, sign in with your school account.
The published APK is a debug-signed sideload build — fine for personal use, not a Play Store artifact.
Your CAS credentials are stored on your device. Sessions renew themselves silently.
Forget account on the Account tab clears credentials and sessions.
Printing needs the campus network (or a VPN back to campus) — PMS answers 403 from outside. You can check your account state in the Account tab.
JDK 17+ and Android SDK (platform 34):
export JAVA_HOME=/opt/homebrew/opt/openjdk@21
export ANDROID_HOME=$HOME/Library/Android/sdk
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apkNo campus network needed — print flows run against a local mock that speaks the same wire format (including the RSA login):
python3 tools/mock_pms.py --port 8080
python3 tools/inject_session.py --base-url http://10.0.2.2:8080 --creds
python3 tools/drive_ui.py --scenario pms-smoke # also: shell, pms-upload, tis-live, themetis-live runs against the real TIS with your stored account.
We will consider iOS releases in the future.
- sustech_survival — the Python client this app's TIS wire semantics come from
- sustech-cli — the TypeScript client the print wire semantics come from
The app is a client. These are the services and datasets it talks to, and the terms they come with:
- Campus shuttle — sustech.online (
buseta.sustcra.com), CC BY-SA 4.0. API only; none of its data is redistributed in this repo. - Library occupancy and catalogue —
lib.sustech.edu.cnand SUSTech's Ex Libris Primo. - Academic calendar — mirrored from
dumixthestpd/sustech-calendarat a pinned commit and bundled in the APK, so the app can tell a holiday from a teaching day with no network. Seeapp/src/main/assets/calendar/README.mdfor the pin. - Weather —
api.sustech.online/weather. Air quality — Open-Meteo (CC BY 4.0).
Your courses, grades, print jobs and Blackboard data are your own: fetched with your own credentials and sent nowhere else.
I am dumixthestpd, same maintainer as sustech_survival — a
non-CS undergrad at SUSTech. This repo is also Agent-written code, known and accepted. Issues and PRs
welcome.
PolyForm Noncommercial License 1.0.0, inherited from
sustech_survival.
Non-commercial use only.
The Android app is free and stays free.
Note for contributors: the license may change in the future since we are trying to solve the budget problems for iOS publishing — see CONTRIBUTING.md.