micko

micko

A keyboard-first terminal UI for Argo Workflows

$ brew install ficaa1/tap/micko
$ micko --demo
# no cluster needed: synthetic data, no writes
micko --tour
what micko does

Argo Workflows, in your terminal

Browse ↑↓⏎

Every run: its phase, progress and why it failed.

Understand TX

A timeline of the run, and a plain-words account of what went wrong.

Follow lE

Logs labelled by step, and Kubernetes events as they happen.

Act a

Resume, retry, stop or delete. Each one asks first, and none is retried.

the workflow list

Every run, at a glance

The phase is a glyph, a word and a colour, so it reads without colour too. Progress is a bar. The reason a run failed sits right in its row.

Suspended runs sort first, so a gate waiting for you is the first thing you see.

⏎ openw wide columnss sort0 all namespaces
micko --demo
timeline

The run as a Gantt chart

Pods and approval gates are bars coloured by phase. DAG, Steps and Retry nodes bracket the time their children took, and a running workflow ends at a now line.

Nodes marked ◆ are the critical path: the chain that set the end time. Shading before a bar is time spent waiting.

T timelinei node info⏎ pod log
demo-nightly-report
explain

Why it failed, in plain words

Findings come from what the workflow records and nothing else. No network service, no model, the same answer every time.

For a failed pod micko reads the end of its log and quotes the lines that matter: the error, the traceback, the line before. Then it says what to do next.

X explainy copy the reportl failing log
demo-nightly-report
it quotes the lines that matter
nodes

Reads like the pipeline

Steps sit under their Steps node in order. DAG tasks come in dependency order with what each waits for. Retry attempts nest under their Retry node with exit codes, and the exit handler gets a tree of its own.

space foldi everything about a node/ find
demo-nightly-report
retries nest under their Retry node
logs & events

Who said it, and what happened

A workflow's logs mix every pod, so each line starts with the step that wrote it. Search, filter like less, or pipe what you have to lnav.

Kubernetes events about the workflow and its pods stream in while the section is open.

l logs& only matches| pipeE events
logs
events
a small query language
/

Filters as you type. A plain word matches names; the rest narrows by what you know about the run.

etl|reporteither name
!etlnot this one
~ddpfuzzy
/^demo-.*$/a regular expression
dur>10mrun time
label:team=dataa label
cron=etl-hourlystarted by this CronWorkflow
micko --demo
command palette

One key, every view

: opens the palette on every screen. Commands rank as you type and tab completes. A word that names no command is reported, never guessed.

:cron lists CronWorkflows with their next run, computed the way the controller does it, time zones and daylight saving included. :tmpl, :cwftmpl and :aw list templates and the archive.

:cron
marks & bulk actions

Act on many, safely

Mark rows with space and press a. The menu counts how many runs each verb applies to. Requests go one at a time, each checked again just before it is sent and never retried.

Terminate asks you to type the name. Delete asks twice. --read-only turns actions off for a session.

CONFIRMEDend state observed
ACCEPTEDapplied, end state not yet seen
REFUSEDnothing was sent
UNKNOWNinspect before acting again
3 marked
connect

Point it at your cluster

One profile per cluster in ~/.config/micko/config.yaml. Give each its own skin and you will never mistake prod for dev.

kubectl port-forwardstarted for you, closed on exit
token from env or fileread on every request, never logged
TLS verifiedcaFile for a private CA
--read-onlywhen you only want to look
profiles: dev: kubeContext: my-cluster service: argo-workflows-server serviceNamespace: argo remotePort: 2746 server: https://127.0.0.1:2746 namespace: workflows tokenEnv: MICKO_TOKEN prod: server: https://argo.example.com namespace: workflows tokenFile: /run/secrets/argo-token skin: dracula # tell clusters apart
and the Argo UI

Beside the web UI, not instead of it

micko talks to the same Argo Server as the web UI and shows the same workflows. o opens the one you are on in the Argo UI when the profile sets webURL.

in the terminal you are inno browser tab, a key for everything
every namespace in one list:all, narrowed by a query
many runs at oncemark them, then act, each one confirmed
submit and edit in the UImicko does not create workflows or change parameters
skins

13 truecolor skins

Or --skin auto picks dark or light from your terminal. NO_COLOR works too; colour never carries meaning on its own.

micko --skin
Mićko, an eastern rosella with a red head and yellow and blue plumage
the real Mićko
Mićko perched on top of a monitor, leaning his head over its edge
his usual spot
the mascot

And Mićko

micko is named after my bird Mićko, diminutive for Milan, and he lives in the app too. He's off by default. --mascot perches him on top of the pane, where he blinks, dozes and looks around. --mascot=floor sits him in the corner, where now and then he hops over to kiss himself in his mirror. He's already a big narcissist as it is, this might push him over the top :)

micko --mascot
install

Try it in a minute

micko --demo runs on synthetic data, with no cluster, no credentials and no writes.

Tested live against Argo Workflows v4.1.2.

Homebrew

$ brew install ficaa1/tap/micko

mise

$ mise use -g github:ficaa1/micko

Go

$ go install github.com/ficaa1/micko/cmd/micko@latest

Needs Go 1.25 or later.

A binary

$ gh release download --repo ficaa1/micko

Or grab one from the releases page.