aptmatic 0.1.2

A TUI for managing apt updates across debian / ubuntu hosts
# aptmatic ๐Ÿค–๐Ÿ“ฆ

> Because SSHing into 40 servers one by one to run `apt-get upgrade` is a cry for help.

[![CI](https://github.com/growse/aptmatic/actions/workflows/ci.yml/badge.svg)](https://github.com/growse/aptmatic/actions/workflows/ci.yml)

A snappy terminal UI for wrangling `apt` across a fleet of Debian/Ubuntu hosts โ€” written in Rust, because I don't know how to code in OCaml.

```
โ•ญโ”€ aptmatic โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ Hosts          โ”‚  Detail                                               โ”‚
โ”‚ โ–ธ webservers   โ”‚  web1.example.com                                     โ”‚
โ”‚    โ— web1  [2] โ”‚  user: ubuntu  port: 22  sudo: true                   โ”‚
โ”‚    โ— web2      โ”‚                                                       โ”‚
โ”‚ โ–ธ databases    โ”‚  Status: 2 upgrade(s) available                       โ”‚
โ”‚    โ ธ db1       โ”‚                                                       โ”‚
โ”‚    โ— db2       โ”‚  Kernel                                               โ”‚
โ”‚                โ”‚  Running: 6.1.0-28-amd64                              โ”‚
โ”‚                โ”‚  Latest:  linux-image-6.1.0-32-amd64 โ† reboot to activate โ”‚
โ”‚                โ”‚                                                       โ”‚
โ”‚                โ”‚  Upgradable                                           โ”‚
โ”‚                โ”‚  curl (7.88.1-10 โ†’) 7.88.1-10+deb12u8                โ”‚
โ”‚                โ”‚  libcurl4 (7.88.1-10 โ†’) 7.88.1-10+deb12u8            โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
 r:refresh  R:refresh all  u:update  U:upgrade  p:purge-rc  t:task output  z:zoom  q:quit
```

## Features

- ๐Ÿ–ฅ๏ธ **Multi-host dashboard** โ€” see every host's status at a glance
- ๐Ÿ‘ฅ **Groups** โ€” organise hosts and trigger actions on a whole group at once
- ๐Ÿ”‘ **SSH native** โ€” talks directly to each host over SSH, no agents or daemons required
- ๐ŸŒ€ **Live task output** โ€” watch `apt-get upgrade` scroll by in real time
- ๐Ÿง **Kernel tracking** โ€” know which hosts are silently waiting for a reboot
- ๐Ÿ“ฆ **Held/kept-back packages** โ€” spot the stragglers and why they're stuck
- ๐Ÿงน **RC package purging** โ€” one key to purge all those half-removed ghosts
- ๐Ÿ–ฑ๏ธ **Draggable divider** โ€” because you deserve to customise your own TUI
- ๐Ÿฆ€ **Written in Rust** โ€” guaranteed\* to have no bugs

<sub>\* guarantee void where prohibited by logic</sub>

## Installation

```bash
cargo install aptmatic
```

Or build from source:

```bash
cargo build --release
# binary at ./target/release/aptmatic
```

## Configuration

aptmatic looks for its config at `~/.config/aptmatic.toml` by default. Pass `-c /path/to/config.toml` to override.

```toml
[defaults]
user = "ubuntu"
port = 22
use_sudo = true

[[groups]]
name = "webservers"

[[groups.hosts]]
hostname = "web1.example.com"

[[groups.hosts]]
hostname = "web2.example.com"
user = "admin"   # override per-host

[[groups]]
name = "databases"

[[groups.hosts]]
hostname = "db1.example.com"
```

## Keybindings

| Key | Action |
|-----|--------|
| `โ†‘` / `k` | Move up |
| `โ†“` / `j` | Move down |
| `r` | Refresh selected host(s) |
| `R` | Refresh **all** hosts |
| `u` | `apt-get update` on selected |
| `U` | `apt-get upgrade` on selected |
| `p` | Purge RC packages on selected |
| `t` / `Enter` | View live task output |
| `z` | Zoom โ€” hide sidebar for clean copy/paste |
| `q` / `Esc` | Quit |

The sidebar divider is also mouse-draggable if you're feeling fancy.

## Development

```bash
just build   # build
just fmt     # format
just lint    # fmt check + clippy
```

## Why?

Managing a modest fleet of Linux boxes with `apt` should not require an orchestration platform, a PhD in Ansible, or accepting a cookie banner. aptmatic is a single binary, a TOML file, and a spare SSH key away from a good time.