A feature-rich open-source command-line interface for Asana with an interactive TUI (Text User Interface), JSON output for automation, and a background sync daemon for offline support.
- Interactive TUI - Navigate, filter, and manage tasks with Bubble Tea
- JSON Output - Easy to parse format for scripts and automation
- Sync Daemon - Background service that caches your Asana data locally
- Full CRUD - Create, read, update, and delete tasks
- Advanced Filtering - Filter by assignee, tags, status, priority
- Search - Find tasks across your workspace
- Task Management - Complete, assign, set priorities and due dates
- Configuration - Save API tokens and default workspaces/projects
# Clone the repo
git clone https://github.com/TheCoolRobot/asana-cli.git
cd asana-cli
# Build
make build
# Or install directly
go installI like to add a function to make accessing it as easy as possible. To do this, I use my zshrc:
function asana-cli(){
cd /Users/henry/Developer/cmdln_dev/asana-cli&&./asana-cli "$@"
}
# Replace /Users/henry/Developer/cmdln_dev with the PATH to YOUR folderbrew install thecoolrobot/asana-cli/asana-cliSimple!
Set your Asana API token:
export ASANA_TOKEN=your-token-here
# or save to config
asana-cli config set --token your-token-here# List tasks in a project (interactive TUI)
asana-cli list <project-gid>
# Or, if project is added
asana-cli list
# List tasks as JSON
asana-cli list <project-gid> --json
# If project is added
asana-cli list --json
# You get the idea-it works for all of them with a project GID
# Create a task
asana-cli create <project-gid> --name "My Task" --priority high
# Add a project
asana-cli config project add <project-name> <project-gid> --description <optional description>
# Switch to a different project
asana-cli config project switch <project-name>
# Update a task
asana-cli update <task-gid> --name "Updated Task"
# Complete a task
asana-cli complete <task-gid>
# Search for tasks
asana-cli search <workspace-gid> "bug fix"
# Start sync daemon
asana-cli sync --projects 12345,67890The sync daemon runs in the background and automatically caches your Asana data locally every 5 minutes. This enables:
- Fast TUI loading from local cache
- Offline browsing of cached tasks
- Batch operations without hitting API rate limits
- History tracking of task changes
Start the daemon:
asana-cli sync --projects project-id-1,project-id-2Or run as a service (see Development for systemd setup).
# Get tasks as JSON
$ asana-cli list proj-123 --json
{
"success": true,
"data": [
{
"id": "task-1",
"name": "Build feature",
"completed": false,
"priority": "high",
"due_date": "2026-03-01T00:00:00Z"
}
],
"meta": {
"count": 1,
"project_id": "proj-123"
}
}
# Create a task and parse JSON
$ asana-cli create proj-123 --name "Review PR" --json | jq '.data.id'
"task-456"[↑↓] - Navigate tasks
[space] - Select/deselect
[c] - Mark complete
[f] - Toggle show completed
[s] - Change sort (name/due/priority)
[/] - Search
[q] - Quit
[a] - Add
- API tokens are stored in
~/.asana-cli/config.jsonwith restricted permissions (0600) - Never commit
.envfiles or tokens to version control - Use environment variables for CI/CD
list- List tasks in a projectview- View task detailscreate- Create a new taskupdate- Update a taskcomplete- Mark task as completedelete- Delete a tasksearch- Search for tasks
config- Manage configurationsync- Start sync daemonme- Show current user info
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing) - Commit your changes (
git commit -am 'Add amazing feature') - Push to the branch (
git push origin feature/amazing) - Open a Pull Request
MIT License - see LICENSE file for details
Found a bug? Have a feature request? Open an issue
Made with ❤️ by TheCoolRobot