- Svelte 39.3%
- Python 33.3%
- TypeScript 21.9%
- Rust 4.9%
- Shell 0.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Refs #16, #17. Map Reset to hard reboot, inspect metadata transiently, and serialize preparation jobs. |
||
| app | ||
| docs | ||
| scripts | ||
| .gitignore | ||
| AGENTS.md | ||
| LICENSE | ||
| README.md | ||
OpenStack Dashboard
A desktop workspace for OpenStack, built with Svelte, Tauri and Python. Browse compute, image, volume and network resources, import application credentials, and manage resources through the OpenStack SDK.
Application credentials are stored in the operating system credential store: macOS Keychain or Linux Secret Service. OpenRC files are parsed as data and never executed. Profile metadata and resource caches use local SQLite databases.
Architecture
The application includes its own local middleware layer between the UI and OpenStack. It runs on the user's computer as part of the desktop application; no separate middleware server needs to be deployed.
Svelte UI → Tauri / Rust bridge → Python workers → OpenStack SDK → OpenStack cloud
- Svelte UI: displays resources and collects user input.
- Tauri / Rust bridge: validates messages between processes, handles native file dialogs, and manages the worker processes.
- Python workers: manage profiles, OS credential storage, SQLite caches, resource synchronization, and the execution and outcome tracking of cloud actions.
The middleware is application code maintained in this repository. Authentication
and cloud operations use the official keystoneauth1 and openstacksdk Python
libraries. Network and database work runs outside the UI thread. Python and its
dependencies are packaged with the app.
See Architecture for module boundaries and source manifests.
Multiple projects and credentials
An OpenStack application credential is scoped to one project. Add each project with its own application-credential OpenRC file using Add project; the app stores a separate profile and OS credential-store reference for each import. Switch between saved profiles using the Project dropdown.
For example, production and staging each use their own profile and credential, even when they share the same cloud endpoint. Up to 20 profiles can be saved. The actual project ID is verified from Keystone authentication, and inventory caches are scoped to that verified project and profile. A display name or an optional project-ID hint does not grant access to another project.
See the OpenStack application-credential API.
Project management and network actions
Use the pencil beside the project selector to rename a saved profile or remove it from this app only. Removal also cleans up its stored credential; the OpenStack project and its cloud resources are preserved.
The cloud UI supports network creation with an optional initial subnet, subnet editing, and port editing/deletion. See Network actions for fields, confirmation, recovery and the Horizon source references.
Opening a network also shows its subnets and port counts in a right-hand overview. Clicking a VM opens a dedicated overview with specifications, network addresses, security rules, attached volumes and metadata, plus direct power controls. Real-cloud VMs have state-aware action menus for lifecycle, snapshots, attachments, networking and console access. See Instance actions for supported workflows and compatibility limits.
Action dialogs and resource selection fields reuse scoped session data when reopened. See Action data cache for expiry, refresh and validation behavior.
Import and initial synchronization
Load OpenRC and connect selects and parses the file as data, saves the profile and credential, and requests a connection. These steps show a spinning status indicator. After Keystone authentication, resource synchronization starts in the background; the UI displays an initial-sync counter and remains usable as data arrives. Empty successful collections and failed/unsupported API collections are counted as processed, so an API error does not leave the initial-sync indicator running indefinitely. Errors are reported separately; pause and disconnect stop the active progress indication.
Build on macOS
Requires macOS 12+, Xcode Command Line Tools, Node.js 22.12+, Rust 1.90+ and Python 3.11+. With Homebrew installed:
xcode-select --install
brew install node rust python@3.12
After Xcode tools finish installing, run from the repository root:
export PATH="$(brew --prefix python@3.12)/libexec/bin:$PATH"
bash scripts/build-macos.sh
open 'app/src-tauri/target/release/bundle/macos/OpenStack Dashboard.app'
The script builds for the Mac's native architecture and produces an .app and
.dmg in app/src-tauri/target/release/bundle/. See macOS notes
for credential access and distribution details.
Build on Linux
Install Node.js 22.12+, Rust 1.90+, Python 3.11+ with venv support, a C compiler, pkg-config, WebKitGTK 4.1 development files, GTK 3 development files, librsvg, OpenSSL development files and the system dependencies required by Tauri 2. A running Secret Service provider is required for credential storage.
If Rust/Cargo is not installed, use the official Rust installer:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
cargo --version
rustc --version
The Linux script also discovers an existing rustup installation under
${CARGO_HOME:-$HOME/.cargo}/bin when Cargo is absent from PATH. Required tools,
minimum versions and Cargo project metadata are checked before worker packaging.
bash scripts/build-linux.sh
Packages are written to app/src-tauri/target/release/bundle/.
If worker packaging already succeeded and the only failure was a missing Cargo command, install/activate Rust and resume the desktop build without freezing the workers again:
cd app
npm run tauri build -- --bundles deb,appimage
Application icon
All desktop platforms use the same source icon.
The Tauri build hook derives Linux PNG, macOS ICNS and Windows ICO assets from
it with npm run icons. The sidebar uses the same source. Generated formats
stay under the ignored app/.runtime/app-icons/ directory. Windows icon assets
are prepared; the Windows application port is not implemented yet.
See Icon artwork for the design prompt and regeneration details.
Source layout
app/src/: UI, application state and native bridge clients.app/src-tauri/: desktop host, IPC and platform integration.app/worker/: OpenStack operations, local persistence and credential adapters.app/worker/vendor/: pinned internal modules used by the workers.app/tools/build/: source validation and native worker packaging.scripts/: platform build entry points.
Build dependencies are installed locally by the scripts. Python is bundled with the application; end users do not need to install it separately. Generated artifacts, local credentials and developer evidence are excluded from Git.
The macOS port requires a native build and runtime verification on a Mac. Developer ID signing and notarization are not configured.
License
Licensed under the GNU Affero General Public License, version 3
(AGPL-3.0-only). Dependencies retain their respective licenses.
Interrupted synchronization
After an interrupted application session, the last successfully published cache remains readable. The dashboard shows a recovery notice for affected resources. Choose Connect to restart background synchronization; connected sessions restart resource scans automatically. A fresh build does not erase local cache or saved profiles. Current API failures are reported separately.