You can send a message to any Ano channel from your terminal without opening the app. This is the simplest possible recipe with the CLI: auth once, post anywhere. It runs anywhere bash runs, which is what makes it useful in scripts, GitHub Actions, cron jobs, and on-call playbooks.
What you need
- Node 18 or newer.
- An Ano account with access to at least one workspace and one channel.
1. Install the CLI
npm install -g @ano-chat/cli
The package is MIT-licensed and lives at github.com/ano-chat/ano-cli.
2. Sign in
For interactive use on your own machine, run:
ano auth login
A browser window opens, you confirm, you’re back in the terminal with a session token stored locally.
For scripts and headless environments (CI, cron, a remote box you don’t own), use an API key instead:
ano auth login --key ano_cwk_your_api_key
API keys are created from the Ano workspace settings; treat them like any other secret.
3. Post a message
ano messages send "Deploy is live" --channel engineering
That’s it. The message lands in #engineering exactly as if you’d
typed it in the desktop app.
A few variations worth knowing
Direct messages instead of a channel:
ano dm send "Got a sec?" --to "Jane"
JSON output so the next step in your pipeline can read what happened:
ano messages send "Build #2241 passed" --channel ci --json
That returns the message ID, timestamp, and channel ID as structured
JSON. Pipe to jq or read directly in your script.
Pre-flight check that the channel exists and you have access:
ano channels list --json | jq '.[] | select(.name == "engineering")'
If that returns nothing, the channel doesn’t exist or your account can’t see it. Either fix is in the desktop app.
Wiring it into CI
In CI you authenticate with an API key. The CLI accepts one via
the --key flag on ano auth login:
- name: Notify #engineering
run: |
ano auth login --key "${{ secrets.ANO_API_KEY }}"
ano messages send "Deploy ${{ github.sha }} live" --channel engineering
Store the key as a repo or org secret, never in plaintext. Generate the key from your Ano workspace settings.
When this gets boring
Once you’ve got messages flowing, the natural next step is to read messages back the other way (CI status pulled from a channel into your terminal), or to wire up Claude Code as a workspace coworker so an agent can do the typing.
Going deeper
The CLI is the headless / scripted side of the same idea behind ⌘J in every channel, which is the interactive surface. For the inbound counterpart, see Send a thread into your terminal. For the broader “Claude Code with your team” pattern, see Best team chat for Claude Code users.