Skip to content

The malo CLI

Malo, from the command line.

A small, scriptable client for your projects, built to be driven by an AI coding agent as well as by you. What it changes shows up in Malo for your whole team, live.

On every plan, including Free · One binary for macOS and Linux.
Coming soon Install instructions arrive with its first public release.

$ malo task create --project WEB --priority p1 \
    --title "Fix the flaky login test"
Ref:       #171
ID:        9c1d4e2a-6b1f-4c7e-a0d5-3f8e21b7c940
Title:     Fix the flaky login test
Status:    c4d5e6f7-a8b9-4c0d-9e1f-2a3b4c5d6e7f
Priority:  p1
Assignee:  —
Due:       —

$ malo task assign WEB-171 me | jq .number
171

$ malo task complete WEB-151
Task WEB-151 completed. It can be undone for a short while:
malo task reopen 2f81c0d4-7a3e-4b19-8c55-0e6d9a1b3f27

$ malo open task WEB-171   # opens it in the Mac app

Built for agents

Predictable enough for a machine.

Point a coding agent at your project and let it pick up tasks, update them as it works and close them when it’s done. Nothing about that needs a person in the loop.

  • JSON when it’s piped

    Every command prints exactly one JSON value when its output isn’t a terminal, or add --json. Errors go to stderr as JSON too.

  • Nothing interactive

    Set MALO_TOKEN and MALO_ORG in the environment and every command runs unattended. People can malo login instead.

  • Safe partial updates

    task update sends only the fields you name, so agents working in parallel don’t overwrite each other.

  • Names people use

    Refer to tasks as WEB-12, projects by key, columns by name and people as @username or me.

  • Exit codes you can branch on

    Stable codes for success, usage errors, sign-in, permissions, not found, conflicts and plan limits.

  • Instructions built in

    malo help agent prints a short guide written for an AI agent, and it updates with every release.

In a script

Pipe it. Parse it. Branch on it.

In CI or an agent session, the token comes from the environment and the output is JSON. Column names are checked against the project’s real columns before anything is written.

0OK
1Runtime error
2Usage error
3Not signed in
4Not allowed
5Not found
6Conflict
7Not on plan
# In CI or an agent: the token from the environment,
# JSON whenever stdout is piped.
$ export MALO_TOKEN=… MALO_ORG=…
$ malo task list --project WEB --mine | jq '.[].number'
145
151
$ malo task update WEB-145 --priority p2 | jq .priority
"p2"
$ echo $?
0

Reference

Every command.

Global flags: --json, --org, --token, --api, --quiet, --no-color. Run malo help for the rest.

Tasks

malo task list--project WEB [--status S] [--assignee U|me] [--mine]
malo task viewWEB-12
malo task create--project WEB --title "…" [--status S] [--priority p1]
malo task updateWEB-12 [--title …] [--status S] [--priority p2]
malo task assignWEB-12 @bob|me|none
malo task attachWEB-12 [--tag ID] [--note ID] [--goal ID]
malo task detachWEB-12 [--tag ID] [--note ID] [--goal ID]
malo task completeWEB-12
malo task reopen<task id>

Organizations and people

malo org list
malo project list[--org ID]
malo member list[--org ID]

Tags, goals and notes

malo tag list[--org ID]
malo tag create--project WEB --name "…"
malo goal list--project WEB
malo goal create--project WEB --title "…" [--due …] [--progress N]
malo note list--project WEB

Session and more

malo login[--username U] [--password-stdin]
malo logout
malo whoami
malo opentask WEB-12 | project WEB
malo help agent

Your work. All in one place.

The CLI comes with every plan, including Free: no add-on, no per-call pricing.