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.
# 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-12malo task create--project WEB --title "…" [--status S] [--priority p1]malo task updateWEB-12 [--title …] [--status S] [--priority p2]malo task assignWEB-12 @bob|me|nonemalo task attachWEB-12 [--tag ID] [--note ID] [--goal ID]malo task detachWEB-12 [--tag ID] [--note ID] [--goal ID]malo task completeWEB-12malo task reopen<task id>Organizations and people
malo org listmalo 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 WEBmalo goal create--project WEB --title "…" [--due …] [--progress N]malo note list--project WEBSession and more
malo login[--username U] [--password-stdin]malo logoutmalo whoamimalo opentask WEB-12 | project WEBmalo help agent