A Tauri-based desktop Moodle client.
not yet reviewed by publik. It is live now; the founder has not reviewed this version yet.
A native, cross-platform client for the Moodle™ platform on the desktop and on Android, built with Tauri v2 and React. It talks to your institution's Moodle through the official mobile web service API, so it has its own UI. It is NOT a browser wrapper around the Moodle website.
Runs on Linux, Windows, macOS and Android. iOS is not supported yet (see MOBILE.md).
Download page: https://zac06.github.io/zenith/ (source in docs/, published with GitHub Pages).

zenith:// deep link. Sites that use plain username/password login are supported too.Downloads/Zenith (or a folder you choose in Settings), organised by course, and opened with the system default application. On Android they stay in the app's own storage and open in the app you pick. You choose whether to re-download only when Moodle's copy is newer (default), always reuse the saved copy, or always download again..apk from the releases page and install it over the old one.React UI --invoke--> Rust (Tauri commands) --HTTPS--> Moodle web service API
reqwest), so there are no CORS problems. The UI does hold the session token in memory, only to load course images, and it is only ever attached to URLs on your Moodle site itself, never to another host. Downloads and browser auto-login are refused for any URL outside the site's scheme, host and port.tool_mobile_get_public_config (via lib/ajax/service-nologin.php) reports whether the site uses password login or browser SSO./admin/tool/mobile/launch.php?service=moodle_mobile_app&passport=…&urlscheme=zenith. After login, Moodle redirects to zenith://token=<base64>. The app checks the md5(site + passport) value and stores the token.core_webservice_get_site_info, core_course_get_enrolled_courses_by_timeline_classification, core_course_get_contents, core_course_set_favourite_courses, user preferences for hiding courses, and for Explore core_course_search_courses, core_course_get_courses_by_field, core_course_get_categories, core_enrol_get_course_enrolment_methods, core_enrol_get_users_courses enrol_self_enrol_user, and for assignments mod_assign_get_assignments and mod_assign_get_submission_status. Opening a link logged in uses tool_mobile_get_autologin_key.libwebkit2gtk-4.1-dev build-essential libssl-dev libxdo-dev libayatana-appindicator3-dev librsvg2-dev patchelfxcode-select --installMOBILE.mdnpm install
npm run tauri dev
The first Rust build takes several minutes. Later builds are incremental.
Note: the
zenith://deep link is registered at runtime on Linux and Windows. On macOS it only works from a bundled.app, so test SSO with a real build there.
The bundler needs a full icon set, including icon.icns and icon.ico. Generate it from any square PNG of 1024×1024 or larger:
npx tauri icon path/to/icon.png
zenith --screenshot shows invented course names, teachers and a made-up username (different on each launch) instead of your account, so you can take screenshots without exposing real data. It sends nothing to any Moodle site and never reads or changes your saved login. Close any running Zenith window first, because a second launch hands its arguments to the first instance instead of starting a new one. In development, npm swallows the first --, and the Tauri CLI needs two more (the first ends its own options, the second starts the app's): npm run tauri dev -- -- -- --screenshot.
zenith/
├─ .github/workflows/ release build for Linux, Windows, macOS and Android
├─ docs/ download website (GitHub Pages), logo and screenshots
├─ MOBILE.md Android build, signing, iOS status
├─ src/ React + TypeScript frontend
│ ├─ App.tsx UI: first-run setup, login, sidebar, course grid,
│ │ course view, Explore, Settings, update banner
│ ├─ api.ts typed wrappers around the Tauri commands
│ ├─ main.tsx entry point, applies the saved theme before render
│ └─ style.css global styles, light/dark and high-contrast themes
└─ src-tauri/
├─ src/lib.rs commands: site discovery, SSO, password login,
│ web-service calls, downloads, browser launching,
│ update check, keychain session
├─ capabilities/ Tauri permissions (opener, deep-link, dialog)
├─ plugins/ small native plugins (Android: Keystore, open file;
│ iOS: Quick Look, not working yet)
├─ gen/android/ the Android Studio project
├─ icons/ app icons for every platform
├─ tauri.conf.json app config, bundle icons, deep-link scheme
└─ Cargo.toml
| Command | Purpose |
|---|---|
resolve_site | Normalise the URL and fetch the site's public mobile config |
start_sso | Open the browser-based SSO login |
login_password | Username/password login through login/token.php |
ws_call | Generic Moodle web-service call |
download_file | Download a file (token added in Rust), then open it |
list_downloads / delete_downloads | List or delete the files Zenith saved |
default_download_dir | Default folder (Downloads/Zenith; the app's own storage on Android) |
is_mobile | Lets the UI hide what a phone cannot do |
open_local / open_external | Open a saved file or a web link with the system default |
open_authed | Open a site URL in the browser, logged in via auto-login key |
check_update | Compare the latest GitHub release with the running version |
get_session / logout | Restore or clear the session in the OS keychain |
Assignments and deadlines, dashboard with upcoming events, forums, grades, download progress, in-app auto-install of updates (tauri-plugin-updater).
GTK_MODULES= npm run tauri dev.npx tauri icon.src/main.tsx imports ./style.css.https://moodle.university.edu) and check that the mobile service is enabled.GNU General Public License v3.0. See LICENSE.
Zenith is an independent project. It is not affiliated with, endorsed by or sponsored by Moodle.
The word Moodle and associated Moodle logos are trademarks or registered trademarks of Moodle Pty Ltd or its related affiliates.