The Fishladder CLI lets you manage tasks, CRM contacts and companies, feedback, and hiring from your terminal. Install it once, authenticate with your browser, and every command uses the same data as the web app.
This guide walks through the common workflows. For every command, argument and option, see the CLI command reference — it's generated from the CLI itself, so it always matches the latest version.
npm install -g fishladderRequires Node.js 18 or later. The binary is fish.
fish login # Opens browser — authorises and stores token in system keychain
fish whoami # Show current user and team
fish logout # Remove stored credentialsCredentials are stored in your OS keychain (Keychain on macOS, libsecret on Linux, Credential Manager on Windows). No tokens are written to disk in plaintext.
The CLI authenticates via API key — the same keys you generate at Settings → API Keys. You can also set a key directly: FISHLADDER_API_KEY=fl_... fish tasks list.
A key belongs to exactly one team. This is the single most common source of confusion with the CLI — commands succeed, and act on a team you were not thinking of.
fish teams # List your teams, marking the active one
fish whoami # Which account, team and role this key is using
fish login --team <id> # Mint a key for a specific team
fish teams use <id> # Switch the active teamFISHLADDER_TEAM pins one terminal to a team without disturbing the others, which matters when two sessions are working on different teams:
FISHLADDER_TEAM=Fishladder fish tasks listIf a command returns nothing and you expected results, run fish whoamibefore assuming the data is missing — an empty answer from the wrong team looks exactly like an empty team.
Bind a directory to a Fishladder project so task commands don't need --project every time. This is the recommended setup when working in a code repository (including with AI agents like Claude Code):
fish project use "Alpha Launch" # by name, unique fragment, or ID
fish project current # show the default project in effect
fish project clear # unbindfish project use saves the project to a .fishladder.json in the current directory, found by walking up from wherever you run fish (like .git). It contains no secrets, so it is safe to commit to your repository. Once set, fish tasks list filters to that project (pass --all to see everything) and fish tasks create uses it automatically. Precedence: --project flag, then the FISHLADDER_PROJECT_ID environment variable, then .fishladder.json. Requires CLI v0.6.0 or later.
Manage roadmap cards and link them to tracker boards. A linked card shows task progress (done/total) in fish projects list. --tracker accepts a board name or ID; requires CLI v0.9.0 or later.
fish projects list # includes Tracker + Tasks (done/total) columns
fish projects create "Mobile app v2" --status planned --tracker "Mobile Board"
fish projects update <id> --tracker "Mobile Board" # link (or relink)
fish projects update <id> --untrack # remove the link
fish tasks list --project <trackerProjectId> # tasks behind a roadmap cardAll task commands work against the Tracker app. Use fish tasks projects first to get project IDs — or skip IDs entirely by setting a default project (above).
# List tracker projects (shows IDs you need for other commands)
fish tasks projects
# List all tasks
fish tasks list
# Tasks in a specific project
fish tasks list --project proj-abc123
# Machine-readable output
fish tasks list --project proj-abc123 --format json | jq '.[].title'fish tasks show task-uuid-hereDisplays full task details including description, assignee, priority, due date, and custom fields.
# Minimal — title only (uses the default project if one is set)
fish tasks create "Write release notes"
# Full options — --section takes a column name or ID
fish tasks create "Write release notes" \
--project proj-abc123 \
--description "Cover all changes since v1.4" \
--section "In Progress" \
--priority high \
--due 2026-05-15
# Smart syntax: @assignee !priority due:date
fish tasks create "Fix login bug" @sarah !high due:friday
# Assign to yourself, or by name / email / ID
fish tasks create "Review PR" --assign me
fish tasks create "Draft plan" --assign "Sarah Chen"--assign and @name accept me, an email, a user ID, or a name (a first name works when only one person has it). Only active members can be assigned; an unknown name gets a clear error listing close matches.
fish members # active members you can assign work to
fish members --all # include deactivated people, marked inactive
fish members --format json# Change priority and due date
fish tasks update task-uuid \
--priority high \
--due 2026-05-15
# Reassign and retitle (--assign none unassigns)
fish tasks update task-uuid \
--title "Updated title" \
--assign [email protected]
# Move across the board by name — no IDs needed (CLI v0.8.0+)
fish tasks update task-uuid --section "Done" --status done
# All updatable fields:
# --title --description --section --priority --assign --due --statusfish tasks drive list task-uuid # the task's Google Drive section
fish tasks drive add task-uuid https://docs.google.com/document/d/…/edit
fish tasks drive remove task-uuid link-id # adminBoard columns (sections) and workflow statuses are per-project. List them to see what's available; --section/--status on task commands accept either the ID or the name (case-insensitive, unique fragments allowed). Requires CLI v0.8.0 or later.
fish sections # list board columns (uses default project)
fish sections create "Review" --order 3
fish statuses # list statuses — shows which is default and which mean donefish tasks complete task-uuid
fish tasks delete task-uuidEverything due in a time frame: task due dates, roadmap project target dates, deal close dates, quote expirations, interviews, questionnaires and audit milestones. Finished work is left out unless you pass --completed. Needs the Calendar module.
fish due # everything due in the next 14 days
fish due --days 30 --project Acme # Acme's tasks and target dates (partial names match)
fish due --project Acme,Globex # several projects at once
fish due --type deals,quotes --start 2026-10-01 --end 2026-10-31
fish due --days -7 --completed # what was due last week, finished or not
fish calendar --format json # full command name; JSON for scriptsFull CRUD for companies, contacts, deals, pipelines, and activities.
fish crm companies # List all companies
fish crm companies show company-id # View a company
fish crm companies create # Interactive prompt
fish crm companies update company-id # Interactive prompt, updates only changed fields
fish crm companies delete company-id # Delete (prompts for confirmation)fish crm contacts # List all contacts
fish crm contacts show contact-id # View a contact
fish crm contacts create # Interactive prompt
fish crm contacts update contact-id # Interactive prompt
fish crm contacts delete contact-idfish crm deals # List deals
fish crm pipelines # List pipeline stages
fish crm activities # List recent activitiesThe fish crm commands work on Fishladder's built-in CRM. A team that connects HubSpot uses HubSpot instead, and these commands are turned off.
With HubSpot connected, link HubSpot companies and contacts to tasks, roadmap projects and River pages. Nothing is written to HubSpot. Requires CLI v0.19.0 or later.
fish hubspot search "acme" # companies (--contacts for people)
fish hubspot link task task-uuid 123456 # link a company; add --contact for a contact
fish hubspot link page 69af0cc3 123456 # pages take the short ID or a title
fish hubspot links project project-id # what's linked, with link IDs
fish hubspot unlink task task-uuid link-idRead wiki structure, create and edit pages, and link pages to other Fishladder entities. Content is markdown in both directions — the server converts to the editor's native format, so pages created from the CLI render normally in the app. Requires CLI v0.7.0 or later.
fish river spaces # list wiki spaces
fish river pages --space <idOrName> # page tree
fish river show <page> # page as markdown — full ID, the 8-char ID from river pages, or title
# Create a page from a markdown file (or --content, or stdin).
# --space and --parent take a name or an ID; the new page's location is printed.
fish river create "API Guide" --space Engineering --parent Runbooks --file ./guide.md
# Link a page to a task so it shows on the task
fish river link <pageId> tracker_task <taskId>
# Replace content — the previous version is snapshotted
fish river update <page> --file ./guide.md --summary "refreshed examples"
# Move a page — spaces and parents by name, ID, or ID prefix (v0.15.0+)
fish river move <page> --space "Customer Success" # top level of a space
fish river move <page> --space Runbooks --create-space # create the space if missing
fish river move <page> --parent "Enrichment Sources" # nest under a page
# Link a page to an entity (tracker_task, crm_deal, roadmap_project, ...)
fish river link <pageId> tracker_task <taskId>For third-party labeling platforms. Runs on a team API key; the labeler is named per item by email or user ID. A task push with the same source + externalId updates the existing task instead of duplicating it, so a batch can be re-sent safely. Requires CLI v0.16.0 or later.
fish labeler projects # projects with labelers and managers
fish labeler labelers # labeler-role members
fish labeler tasks --project <id> --status done # list tasks
echo '[{"externalId":"b7/12","title":"Label 40 frames","quantity":40,"status":"done"}]' \
| fish labeler tasks push --project <id> --labeler [email protected]
fish labeler tasks update <taskId> --status rejected
fish labeler log-time --project <id> --labeler [email protected] --minutes 90
fish labeler log-units --project <id> --labeler [email protected] --quantity 120The same operations are available directly: GET/POST /api/v1/labeler/tasks, PATCH /api/v1/labeler/tasks/:id, POST /api/v1/labeler/time, POST /api/v1/labeler/units, GET /api/v1/labeler/projects, GET /api/v1/labeler/labelers. Webhook events: labeler.task.created, labeler.task.updated, labeler.task.completed.
Publish self-contained HTML documents that Fishladder hosts and renders — see Canvases. Create and update take the document from --file, --html, or stdin. Requires CLI v0.14.0 or later.
fish canvas # list canvases
cat page.html | fish canvas create "Q3 dashboard"
fish canvas update <id> --file page.html # previous version kept
fish canvas show <id> --html > page.html # export the raw document
fish canvas versions <id> # past documents, newest first
fish canvas restore <id> <versionId>fish feedback list # List feedback entries
fish feedback list --format json # JSON output for scripting
fish feedback show feedback-id # View a single entryfish hiring # List ATS jobs and recent applicationsThe sections above cover the commands used most. The CLI also has goals, initiatives, rows, cpq, custom-fields, webhooks and ai. Each follows the same shape — run fish <command> --help to see its subcommands.
Most list commands accept --format json to output newline-delimited JSON, useful for piping to jq or other tools. The default is a human-readable table.
# Example: get task IDs for a project
fish tasks list --project proj-abc123 --format json | jq -r '.[].id'The CLI uses the same REST API available for direct integration. See API Keys for setup instructions.