Terminal UI for Juju infrastructure orchestration
Project description
⬢ JujuMate
A terminal UI for Juju — monitor all your infrastructure resources in a single interactive screen with real-time updates. Inspired by K9s and KDash.
Features
- 🔄 Auto-refresh — status updates automatically every few seconds; logs stream live via WebSocket
- ☁️ Full resource tree — clouds, controllers, models, applications, units, machines
- 📊 Status view — apps, units, offers, integrations, SAAS and machines in one screen
- 🔍 Drill-down navigation — select a controller → filter models; select a model → see its full status
- 🔎 Inline filtering — press
/in Status to search across apps, charms, channels and messages - 🔐 Secrets browser — list and inspect Juju secrets per model (
Shift+S) - 📦 Offers browser — browse all cross-model offers in a controller, with endpoint details and live consumer tracking across controllers (
Shift+O) - 📋 Relation databag inspector — examine raw relation data for any relation (
Enteron a relation) - ⚙️ App config viewer — inspect application configuration (
Enteron an app) - 🎨 Themeable — built-in
ubuntuanddarkthemes; fully customisable via YAML - 🪟 Terminal transparency — respects your terminal background (no forced black background)
- ⌨️ K9s-style help overlay — press
?to see all keybindings at any time
Installation
Recommended — install as a tool with uv:
uv tool install jujumate
Or with pipx:
pipx install jujumate
JujuMate reads your existing Juju configuration from ~/.local/share/juju/ automatically — no extra setup needed if juju is already working.
Quick Start
jujumate
On first launch JujuMate connects to your current Juju controller and auto-selects your current model. Use the keyboard shortcuts below to navigate.
Keyboard Shortcuts
Global
| Key | Action |
|---|---|
c |
Go to Clouds tab |
C |
Go to Controllers tab |
m |
Go to Models tab |
s |
Go to Status tab |
r |
Force refresh |
Esc |
Clear cloud/controller drill-down filter |
? |
Toggle help overlay |
q |
Quit |
Navigation
| Key | Action |
|---|---|
↑ / ↓ |
Move cursor up/down |
Enter |
Drill-down / open detail |
Status tab
| Key | Action |
|---|---|
/ |
Filter by app name, charm, channel or message |
Esc |
Clear filter |
Enter on app |
Open App Config viewer |
Enter on offer |
Open Offer detail |
Enter on relation |
Open Relation Data inspector |
Modals
| Key | Action |
|---|---|
Shift+S |
Open Secrets browser for the current model |
Shift+O |
Open Offers browser for the current controller |
Shift+L |
Open live Log viewer for the current model |
T |
Open theme switcher |
Enter |
Open detail view |
y |
Copy value to clipboard (Relation Data / Secrets) |
Esc |
Close modal |
Views
Status
The main view. Displays a full juju status-style breakdown of the selected model:
- Applications — name, charm, channel, revision, units, status and workload message
- Units — workload/agent status, machine or pod, address, ports
- Machines — id, state, address, instance, base, AZ (IaaS models only)
- SAAS — consumed remote offers and their status
- Offers — cross-model offers with active/total connection counts
- Integrations — all relations (peer, regular and cross-model)
Offers browser (Shift+O)
Lists all offers across every model in the current controller. Select an offer to see:
- Model, URL, application, charm, description and access level
- Endpoint details (name, interface, role)
- Live consumer list — scans all known controllers to find which models and applications are consuming the offer
Secrets browser (Shift+S)
Lists all secrets visible in the current model. Select a secret to see its metadata (owner, revision, rotation policy, timestamps).
Relation Data inspector
Press Enter on any relation in the Status tab to open a databag viewer showing the application-level and unit-level relation data for both sides of the relation.
App Config viewer
Press Enter on any application in the Status tab to inspect its current configuration values.
Configuration
JujuMate is configured via ~/.config/jujumate/config.yaml. All fields are optional.
# ~/.config/jujumate/config.yaml
theme: ubuntu # Theme name (default: ubuntu)
refresh_interval: 5 # Seconds between auto-refresh (default: 5)
default_controller: prod # Controller to use (default: current Juju controller)
log_file: ~/.local/state/jujumate/jujumate.log
log_level: INFO # DEBUG | INFO | WARNING | ERROR | CRITICAL
Themes
JujuMate ships with five built-in themes: ubuntu (default), dark, monokai, solarized-dark and spacemacs.
Press T at any time to open the live theme switcher and preview themes before applying them.
To create a custom theme, add a YAML file to ~/.config/jujumate/themes/:
# ~/.config/jujumate/themes/mytheme.yaml
name: mytheme
primary: "#FF6600"
secondary: "#003366"
background: "#1a1a2e"
surface: "#16213e"
dark: true
Then set it in your config:
theme: mytheme
Available fields: primary, secondary, accent, background, surface, panel, warning, error, success, foreground, dark.
User themes override built-in themes with the same name.
Development
Requirements: Python 3.10+, uv
git clone https://github.com/Abuelodelanada/jujumate.git
cd jujumate
uv sync
Run from source:
uv run jujumate
Run checks (lint + typecheck + tests):
uv run nox
Individual sessions:
uv run nox -s tests # Run tests with coverage
uv run nox -s lint # Ruff lint + format check
uv run nox -s typecheck # Pyright static analysis
uv run ruff format src tests # Auto-format code
License
Project details
Release history Release notifications | RSS feed
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 jujumate-0.2.0.tar.gz.
File metadata
- Download URL: jujumate-0.2.0.tar.gz
- Upload date:
- Size: 237.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fafe99d26d10282499886ef9f3e6fcb796c8aface06c00fc2c3b8481590f8571
|
|
| MD5 |
82274d885ba4d1ad70d9a319a700b0e2
|
|
| BLAKE2b-256 |
d51e947d2e8ea0be6fb3ba1cc928221c9ecc3cb20042d6608ab18faf27b9ef4e
|
Provenance
The following attestation bundles were made for jujumate-0.2.0.tar.gz:
Publisher:
tag-and-release.yaml on Abuelodelanada/jujumate
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jujumate-0.2.0.tar.gz -
Subject digest:
fafe99d26d10282499886ef9f3e6fcb796c8aface06c00fc2c3b8481590f8571 - Sigstore transparency entry: 1191474654
- Sigstore integration time:
-
Permalink:
Abuelodelanada/jujumate@d54c51d6654ec47061e0e415e3cbaefa02cab16d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Abuelodelanada
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
tag-and-release.yaml@d54c51d6654ec47061e0e415e3cbaefa02cab16d -
Trigger Event:
push
-
Statement type:
File details
Details for the file jujumate-0.2.0-py3-none-any.whl.
File metadata
- Download URL: jujumate-0.2.0-py3-none-any.whl
- Upload date:
- Size: 87.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08d2db5164462d951c52b73fa9872be48ada4df4588595a21ee779406bea48c4
|
|
| MD5 |
73d990b3a1467e790efcbf7dbd22209f
|
|
| BLAKE2b-256 |
55f6af706d33f3990e2121dbf6ddcace1d61074a2b11d653a25b433afe21bd4d
|
Provenance
The following attestation bundles were made for jujumate-0.2.0-py3-none-any.whl:
Publisher:
tag-and-release.yaml on Abuelodelanada/jujumate
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jujumate-0.2.0-py3-none-any.whl -
Subject digest:
08d2db5164462d951c52b73fa9872be48ada4df4588595a21ee779406bea48c4 - Sigstore transparency entry: 1191474656
- Sigstore integration time:
-
Permalink:
Abuelodelanada/jujumate@d54c51d6654ec47061e0e415e3cbaefa02cab16d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Abuelodelanada
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
tag-and-release.yaml@d54c51d6654ec47061e0e415e3cbaefa02cab16d -
Trigger Event:
push
-
Statement type: