A terminal UI for GitHub Actions across all the repos and orgs your account can see.

- Recent runs from all your repos in one list, most recent activity first.

- A repos sidebar: pin repos to the top, limit the list to one repo (which also reads further back, 100 runs), and dispatch in repos with no recent runs.

- Each run's jobs, and the steps of a running job as they happen. Full logs load when the job finishes.

- A logs viewer with foldable steps, search, a view of just the lines near errors, and saving to a file.

- Failure annotations (v): thefile:lineerrors of a run's failed jobs, each one opening its job's log at that line.

- A duration chart (w) of a workflow's successful runs, with the median and whether it is getting slower.

- The tag or release a run made, shown with the run.

- Dispatch a workflow with a form built from its inputs, cancel and re-run runs or jobs, approve held runs, and download artifacts.

- Your orgs' self-hosted runners (s).

- A desktop notification and terminal bell when a run finishes.

- Light and dark themes, following the terminal's background.

- Pane and column widths you drag stay set between sessions.

- Light on the API: conditional requests (a 304doesn't count against the rate limit), fast polling only while runs are active, and a pause when GitHub rate-limits.

Prebuilt binaries for macOS, Linux and Windows are on the releases page. Or with Cargo:

cargo binstall actui # fetches the prebuilt binary

cargo install actui # builds from sourceactui uses the first of:

- $GITHUB_TOKENor- $GH_TOKEN

- gh auth token(from the GitHub CLI, after- gh auth login)

The token needs the repo and workflow scopes.

Optional, in ~/.config/actui/config.toml, or under $XDG_CONFIG_HOME if you set it

(Windows: %APPDATA%\actui\config.toml). actui --help prints the path it reads.

The defaults:

refresh_secs = 60 # how often to read every repo's runs

active_refresh_secs = 15 # how often to read active runs' jobs

live_refresh_secs = 2 # how often the live steps view updates (1-10)

runs_per_repo = 15 # runs read per repo

scoped_runs = 100 # runs read for the repo the sidebar is on (max 100)

concurrency = 10 # repos read at once

max_repos = 60 # most recently pushed repos to watch (0 = all)

skip_archived = true

notify = true # desktop notification when a run finishes

bell = true # terminal bell when a run finishes

theme = "auto" # or "dark" / "light"

sidebar = true # show the repos sidebar

sort = "alpha" # sidebar order after pinned repos, or "used"

pinned = [] # e.g. ["my-org/api"]

include = [] # only repos whose name contains one of these

exclude = [] # skip repos whose name contains one of theseIf you are in large orgs, set include or lower max_repos to stay under

GitHub's 5000 requests an hour.

Pane widths and the history behind sort = "used" are saved in state.toml

next to the config.

The mouse works too: click to select, scroll, and drag pane borders and column edges to resize.

MIT, see LICENSE.