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
- ๐งญ Navigator โ unified Cloud โ Controller โ Model navigation in a single tab with cascade filtering and a detail strip showing key fields of the current selection
- ๐ Status view โ apps, units, offers, integrations, SAAS, machines and storage in one screen
- ๐ฅ Health view โ shows only unhealthy models by default; toggle to see all with
f - ๐พ Storage panel โ storage volumes, pools and sizes; toggle detached storage with
d; pressEnterto see device info and mountpoints - ๐ Drill-down navigation โ select a cloud โ filter controllers โ filter models โ see full status. Enter auto-advances to the next selector
- ๐ Inline filtering โ press
/in Status or Logs to search with live highlight - ๐ Peer relation toggle โ press
pto show/hide peer relations in the Integrations panel - ๐ฅ๏ธ Units-per-machine toggle โ press
uto show units (and their subordinates) nested under each machine - ๐พ Storage view โ storage instances per model with pool, size and attachment status; press
dto toggle detached entries; pressEnterto open a full detail modal (mountpoint, read-only, device info, lifecycle) - ๐๏ธ Collapsible panels โ press
xto collapse/expand any Status panel individually; focused panel highlighted in theme colour - ๐ Leader indicators โ unit leaders marked with
*(green) followingjuju statusconvention - ๐ Relation lifecycle โ Integrations panel shows live relation status; relations being torn down display as
removing - ๐ Copy to clipboard โ press
yin Status or Relation Data to copy the full content - ๐ 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) - ๐ฅ๏ธ Machine detail modal โ press
Enteron any machine to see hardware specs, status timestamps and network interfaces - ๐จ Themeable โ five built-in themes; fully customisable via YAML
- โ๏ธ Settings modal โ change theme, refresh interval, default controller and log level at runtime (
Shift+C) - ๐ช Terminal transparency โ respects your terminal background (no forced black background)
- โจ๏ธ K9s-style help overlay โ press
?to see all keybindings at any time (full-screen)
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 |
|---|---|
n |
Go to Navigator tab (Clouds โ Controllers โ Models) |
s |
Go to Status tab |
h |
Go to Health tab |
r |
Force refresh |
Esc |
Clear drill-down filter |
? |
Toggle help overlay |
q |
Quit |
Navigator tab
| Key | Action |
|---|---|
โ / โ |
Move cursor within the active selector |
Enter |
Select the highlighted item and advance focus to the next selector |
Tab / Shift+Tab |
Move focus between Cloud, Controller and Model selectors |
Status tab
| Key | Action |
|---|---|
/ |
Filter by app name, charm, channel or message (with live highlight) |
Esc |
Clear filter |
d |
Toggle detached storage visibility in the Storage panel |
p |
Toggle peer relations in the Integrations panel |
u |
Toggle units (and subordinates) nested under each machine |
d |
Toggle detached entries in the Storage panel |
x |
Collapse/expand the current panel |
y |
Copy full status to clipboard (includes cloud, controller, model and Juju version) |
Enter on app |
Open App Config viewer |
Enter on offer |
Open Offer detail |
Enter on relation |
Open Relation Data inspector |
Enter on machine |
Open Machine detail modal (hardware, status, network) |
Enter on storage |
Open Storage detail modal (mountpoint, device, lifecycle) |
Health tab
| Key | Action |
|---|---|
f |
Toggle between unhealthy-only (default) and all models |
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 |
Shift+C |
Open Settings modal (appearance, behaviour, diagnostics) |
Enter |
Open detail view |
y |
Copy value to clipboard (Relation Data / Secrets) |
Esc |
Close modal |
Views
Navigator
The entry point for navigating your Juju estate. A single tab replaces the old Clouds / Controllers / Models tabs with a three-column cascade layout:
- Selector strip โ three compact tables side-by-side: Clouds (Name, Type), Controllers (Controller, Models) and Models (Model, Machines, Apps). Use
โ/โto move the cursor,Enterto select and auto-advance, andTab/Shift+Tabto switch focus between selectors. - Detail strip โ a horizontal panel above the selectors that shows the key fields of the currently selected cloud, controller and model. Updates as you navigate.
- Cascade filtering โ selecting a cloud filters controllers to that cloud; selecting a controller filters models to that controller. Changing a cloud resets the controllers and models below it.
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; subordinates shown nested under their principal; leader units are marked with
* - Machines โ id, state, address, instance, base, AZ (IaaS models only); press
uto expand units and their subordinates inline; pressEnteron a machine to open its detail modal - Storage โ storage instances with pool, size and mountpoint; toggle detached storage with
d; pressEnteron a storage entry to see device details
Press Enter on a machine to see:
- Hardware โ architecture, CPU cores, memory, root disk size, virtualisation type
- Status โ agent and instance status with relative timestamps (e.g. 2h ago)
- Network interfaces โ name, IP address, MAC address and Juju space for each NIC
- SAAS โ consumed remote offers and their status
- Offers โ cross-model offers with active/total connection counts
- Integrations โ regular and cross-model relations with live status column (peer relations hidden by default; press
pto toggle); relations being removed show asremoving - Storage โ storage instances with pool, size and attachment status;
attachedentries shown in green,detachedin orange; pressdto toggle detached entries; pressEnterto open a full detail modal
Each panel can be collapsed individually with x while it has focus, and expanded again with x. The focused panel is highlighted with a distinct border colour (violet in Monokai and Ubuntu themes).
Health
Shows a summary of all models across all controllers, highlighting those with errors or blocked units. Unhealthy models are shown by default; press f to toggle between unhealthy-only and all models.
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).
Log viewer (Shift+L)
Streams live log entries from the current model. Use / to filter by text.
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. Press y to copy the full content to clipboard.
App Config viewer
Press Enter on any application in the Status tab to inspect its current configuration values.
Machine detail modal
Press Enter on any machine row in the Machines panel to open a modal showing:
- Instance ID, address, base OS, availability zone, controller and model
- Hardware โ architecture, CPU cores, memory, root disk size and virtualisation type (parsed from Juju's hardware string)
- Status โ agent and instance status with relative timestamps (e.g. started 2h ago)
- Network interfaces โ name, IP address, MAC address and Juju space for each NIC
Section titles adapt to the active theme's accent colour. Press Esc to close.
Storage detail modal
Press Enter on any storage row in the Storage panel to open a modal showing:
- Unit, Storage ID, Type, Pool, Size and Status
- Attachment โ Mountpoint inside the container or VM; Read Only flag; Device name and Device Link for IaaS block storage (e.g.
/dev/sdb,/dev/disk/by-id/...) - Lifecycle โ Persistent flag and Life value (
alivein green,dyingin orange,deadin red)
Press Esc to close.
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)
offers_cache_ttl: 300 # Seconds to cache the offers list (default: 300)
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
Most settings can also be changed at runtime โ press Shift+C to open the Settings modal, which lets you change the theme (with live preview), refresh interval, default controller and log level without editing the file manually. Changes are saved immediately.
offers_cache_ttlis a config-file-only setting (not exposed in the Settings modal). It controls how long the Offers list is cached between modal opens. Pressrinside the Offers modal to force an immediate refresh.
Themes
JujuMate ships with five built-in themes: ubuntu (default), dark, monokai, solarized-dark and spacemacs.
Press Shift+C to open the Settings modal, then select a theme in the Appearance section to preview it live before it's applied.
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.4.0.tar.gz.
File metadata
- Download URL: jujumate-0.4.0.tar.gz
- Upload date:
- Size: 278.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c202df388c6e5100a811def72e80d91637c81785f9f52d1d8e590396f0598a63
|
|
| MD5 |
bc4183b8e77e942f4759ae8359495a18
|
|
| BLAKE2b-256 |
e8b27fe305b7000ff75fe0645010352f1958bc9a9746bb06ee6ec985547556cb
|
Provenance
The following attestation bundles were made for jujumate-0.4.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.4.0.tar.gz -
Subject digest:
c202df388c6e5100a811def72e80d91637c81785f9f52d1d8e590396f0598a63 - Sigstore transparency entry: 1267164494
- Sigstore integration time:
-
Permalink:
Abuelodelanada/jujumate@8b9234678b9ad5902334a3f080409cc72e1ddeac -
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@8b9234678b9ad5902334a3f080409cc72e1ddeac -
Trigger Event:
push
-
Statement type:
File details
Details for the file jujumate-0.4.0-py3-none-any.whl.
File metadata
- Download URL: jujumate-0.4.0-py3-none-any.whl
- Upload date:
- Size: 105.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81f78b63998ea34edb234bd89150f84a35454762db8061ee12468e34e225238a
|
|
| MD5 |
23fb852fcc3f3877e10b89abd01f1a90
|
|
| BLAKE2b-256 |
4ef70705dacc8a9cc16f0384e1989992b36b32ab047166573104c9a89718cde3
|
Provenance
The following attestation bundles were made for jujumate-0.4.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.4.0-py3-none-any.whl -
Subject digest:
81f78b63998ea34edb234bd89150f84a35454762db8061ee12468e34e225238a - Sigstore transparency entry: 1267164573
- Sigstore integration time:
-
Permalink:
Abuelodelanada/jujumate@8b9234678b9ad5902334a3f080409cc72e1ddeac -
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@8b9234678b9ad5902334a3f080409cc72e1ddeac -
Trigger Event:
push
-
Statement type: