Skip to main content

TUI Dashboard

Real-Time System Monitoring and Management

The OMG interactive terminal dashboard (omg dash) provides a unified view of your system health, package updates, active runtime versions, and recent activity.


πŸš€ Quick Start​

omg dash

🎹 Keyboard Controls​

KeyAction
qQuit the dashboard
rRefresh all data
TabSwitch between views
↑/↓Scroll through lists
EnterSelect/expand item
?Show help

πŸ“Š Dashboard Layout​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ OMG Dashboard [r]efresh [q]uitβ”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ System Status β”‚ Recent Activity β”‚
β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Packages β”‚ β”‚ β”‚ [13:45:30] Install βœ“ β”‚ β”‚
β”‚ β”‚ Total: 1,847 β”‚ β”‚ β”‚ firefox, neovim β”‚ β”‚
β”‚ β”‚ Explicit: 423 β”‚ β”‚ β”‚ [13:30:15] Update βœ“ β”‚ β”‚
β”‚ β”‚ Orphans: 12 β”‚ β”‚ β”‚ linux, mesa, nvidia-dkms β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ [12:00:00] Remove βœ“ β”‚ β”‚
β”‚ β”‚ Updates β”‚ β”‚ β”‚ old-package β”‚ β”‚
β”‚ β”‚ Available: 5 β–Ό β”‚ β”‚ β”‚ [11:45:22] Sync βœ“ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Security β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ CVEs: 0 βœ“ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ Grade: VERIFIED β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ Active Runtimes β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚ β”‚ β€’ node 20.10.0 β”‚ β”‚ β”‚
β”‚ β”‚ β€’ python 3.12.0 β”‚ β”‚ β”‚
β”‚ β”‚ β€’ rust 1.75.0 β”‚ β”‚ β”‚
β”‚ β”‚ β€’ go 1.21.5 β”‚ β”‚ β”‚
β”‚ β”‚ β€’ bun 1.0.25 β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ [q] Quit [r] Refresh [Tab] Switch View [?] Help β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“‹ Panel Details​

System Status Panel (Left, 40%)​

Displays core system metrics:

MetricDescriptionColor Coding
TotalAll installed packagesWhite
ExplicitExplicitly installed (not deps)Cyan
OrphansUnused dependenciesYellow if > 0
UpdatesAvailable updatesYellow if > 0, Green if 0
CVEsKnown vulnerabilitiesRed if > 0, Green if 0
GradeOverall security gradeVaries by grade

Active Runtimes Section​

Shows currently active version for each runtime:

  • Node.js β€” From .nvmrc or current symlink
  • Python β€” From .python-version or current symlink
  • Rust β€” From rust-toolchain.toml or current symlink
  • Go, Ruby, Java, Bun β€” From respective version files

Runtimes without an active version are dimmed.

Recent Activity Panel (Right, 60%)​

Shows the last 10 package transactions:

FieldFormat
TimeHH:MM:SS
TypeInstall, Remove, Update, Sync
Statusβœ“ (success) or βœ— (failure)
PackagesFirst 3 packages, then "..."

πŸ”„ Data Sources​

System Status​

Fetched from daemon via IPC:

let status = client.call(Request::Status { id: 0 }).await?;

Contains:

  • Package counts
  • Update availability
  • Vulnerability counts
  • Runtime versions

Transaction History​

Loaded from local history file:

let entries = HistoryManager::new()?.load()?;
self.history = entries.into_iter().rev().take(10).collect();

⏱️ Auto-Refresh​

The dashboard automatically refreshes every 10 seconds:

pub async fn tick(&mut self) -> Result<()> {
if self.last_tick.elapsed() >= Duration::from_secs(10) {
self.refresh().await?;
self.last_tick = Instant::now();
}
Ok(())
}

Manual refresh with r key is instant.


🎨 Visual Indicators​

Status Colors​

ColorMeaning
🟒 GreenHealthy / No issues
🟑 YellowWarning / Action recommended
πŸ”΄ RedCritical / Immediate attention
βšͺ WhiteInformational
πŸ”΅ CyanHighlight / Active

Icons​

IconMeaning
βœ“Success
βœ—Failure
β€’List item
β–²Increase
β–ΌAvailable

βš™οΈ Technical Implementation​

Technology Stack​

ComponentTechnology
TUI Frameworkratatui v0.29
Terminal Backendcrossterm v0.28
LayoutConstraint-based (40%/60%)

Architecture​

src/cli/tui/
β”œβ”€β”€ mod.rs # Entry point, terminal setup, event loop
β”œβ”€β”€ app.rs # Application state, refresh logic
└── ui.rs # Layout definitions, widget rendering

Application State​

pub struct App {
pub status: Option<StatusResult>, // System status from daemon
pub history: Vec<Transaction>, // Recent transactions
pub last_tick: std::time::Instant, // For auto-refresh timing
}

Event Loop​

async fn run_app(terminal: &mut Terminal, app: &mut App) -> Result<()> {
loop {
// Render
terminal.draw(|f| ui::draw(f, app))?;

// Handle input
if event::poll(Duration::from_millis(100))? {
if let Event::Key(key) = event::read()? {
match key.code {
KeyCode::Char('q') => return Ok(()),
KeyCode::Char('r') => app.refresh().await?,
_ => {}
}
}
}

// Auto-refresh
app.tick().await?;
}
}

πŸ“± Terminal Requirements​

Minimum Requirements​

RequirementDetails
TerminalAny modern terminal (xterm, alacritty, kitty, wezterm)
Alternate ScreenMust support alternate screen buffer
Colors256 colors recommended
UnicodeFull Unicode support required
SizeMinimum 80x24 characters
# Ensure TERM is set correctly
export TERM=xterm-256color

# Use a Nerd Font for icons
# Recommended: JetBrains Mono Nerd Font

πŸ”§ Troubleshooting​

Dashboard Won't Start​

# 1. Check terminal compatibility
echo $TERM
# Should show xterm-256color or similar

# 2. Check daemon is running
omg status
# If not running:
omg daemon

# 3. Test alternate screen
tput smcup
tput rmcup

Display Issues​

IssueSolution
Garbled charactersUse Unicode-capable font
Wrong colorsSet TERM=xterm-256color
Layout brokenResize terminal window
Missing iconsInstall Nerd Fonts

Reset Terminal​

If the terminal is garbled after exit:

reset
# or
stty sane

Data Not Updating​

# 1. Manual refresh
# Press 'r' in dashboard

# 2. Check daemon
omg status

# 3. Restart daemon
pkill omgd
omg daemon

🎯 Best Practices​

1. Keep Running in Dedicated Terminal​

For monitoring, keep the dashboard running in a dedicated terminal pane/tab.

2. Use with tmux/Screen​

# Create dedicated session
tmux new-session -d -s omg-dash 'omg dash'

# Attach when needed
tmux attach -t omg-dash

3. Combine with Notifications​

Use alongside system notifications for critical alerts:

# In a cron job or systemd timer
omg audit scan 2>&1 | grep -q "high_severity" && notify-send "OMG: Security Alert"

πŸ“š See Also​