GradeX is a lightweight Rust + React application to manage courses, modules and grades. It consists of:
- A Rust backend API using axum, sqlx and tokio
- A Vite + React frontend (TypeScript)
- SQLite for storage with SQLx migrations in
migrations/
I use it to keep track of my university courses and grading information at KIT.
These commands assume Windows PowerShell, but they work similarly on macOS/Linux.
- Rust toolchain (stable) with cargo
- Node.js (v16+) and npm or yarn
- (Optional) sqlite3 CLI or GUI to inspect the DB
git clone https://github.com/dom-wuest/GradeX.git
cd GradeXFrom the repository root:
# build and run the Rust API
cargo run --releaseThe server listens on http://127.0.0.1:3000 by default.
Open a second terminal:
cd frontend
npm install
npm run devVite starts (usually on port 5173) and proxies /api to the backend at http://127.0.0.1:3000 (see frontend/vite.config.ts).
To build production artifacts, run:
cargo build --releaseThis will also built the frontend to frontend/dist and serve it.
- The server uses SQLx with an SQLite database at
data/gradex.db(connection:sqlite://data/gradex.db). - Migrations are stored in
migrations/. The repository includes an initial migration:migrations/20251008000001_init.sql. - To inspect the DB locally:
sqlite3 data/gradex.dbor use a GUI client.
If you plan to use sqlx-cli for migrations, install it and run the usual sqlx migrate commands. (I can add precise sqlx steps if you want.)
- If you change the API port in
src/main.rs, update the proxy target infrontend/vite.config.ts. - Ensure the
data/directory exists and is writable by the server process. - Tests live under
src/domain/tests.rs.
| Feature | Status |
|---|---|
| Create and manage programs, modules, and courses | ✅ Complete |
| Drag-and-drop courses between modules | ✅ Complete |
| Calculate GPA based on course grades and credits (truncated module averages) | ✅ Complete |
| Responsive UI with React and Vite | ✅ Complete |
| Dark and light themes | ✅ Complete |
| RESTful API with axum | ✅ Complete |
| Single app using Tauri | ⬜ Coming soon |
| CI/CD with GitHub Actions | ⬜ Coming soon |
- Port conflict: change the port in
src/main.rsor stop the other service using port 3000. - SQLx errors: verify
data/gradex.dbexists and migrations applied. - CORS: when using the frontend directly (not the dev proxy), ensure backend CORS settings allow the origin.
Run the Rust tests:
cargo testPRs and issues are welcome. Please keep changes focused and add tests for new domain logic where appropriate.
This project is released under the MIT License — see the bundled LICENSE file.