Skip to content

robzolkos/basecamp-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Basecamp CLI + Agent Skill

A command-line interface for Basecamp.

Installation

Homebrew

brew install rzolkos/tap/basecamp

Go

go install github.com/rzolkos/basecamp-cli/cmd/basecamp@latest

Build from source

make build

Setup

Prerequisites

During OAuth authentication, Basecamp redirects to your computer on port 3002. Your machine must be accessible via a URL for this to work. Use a service like:

  • Tailscale - Recommended for persistent access
  • ngrok - Quick setup for temporary access
  • Any reverse proxy that exposes localhost:3002

Registration

  1. Start your tunnel service and note the public URL (e.g., https://myhost.tailscale.ts.net)

  2. Run the registration helper to generate your OAuth app values:

basecamp register

This will ask for your application details and output the exact values to enter in the Basecamp registration form, including the correct redirect URI.

  1. Visit https://launchpad.37signals.com/integrations and register your app using the generated values

  2. Run basecamp init to configure your credentials (Client ID, Client Secret, and the same Redirect URI)

  3. Run basecamp auth to authenticate (ensure your tunnel is running on port 3002)

Configuration Files

Configuration follows XDG Base Directory specification:

  • ~/.config/basecamp/config.json - client credentials
  • ~/.local/share/basecamp/token.json - OAuth token

Usage

Card Tables

# List all projects basecamp projects # List card tables in a project basecamp boards <project_id> # List columns in a board basecamp columns <project_id> <board_id> # List cards in a board basecamp cards <project_id> <board_id> # Filter cards by column basecamp cards <project_id> <board_id> --column "In Progress" # View card details basecamp card <project_id> <card_id> # View card with comments basecamp card <project_id> <card_id> --comments # Create a card basecamp card-create <project_id> <board_id> --column <column_id> --title "Card title" # Update a card basecamp card-update <project_id> <card_id> --title "New title" --content "Description" # Move a card to a different column basecamp move <project_id> <board_id> <card_id> --to "Done"

Card Steps

# Steps are shown when viewing a card basecamp card <project_id> <card_id> # Create a step on a card basecamp step-create <project_id> <card_id> --title "Step description" # Create a step with due date and assignees basecamp step-create <project_id> <card_id> --title "Task" --due 2026-02-01 --assignees "123,456" # Update a step basecamp step-update <project_id> <step_id> --title "Updated title" # Complete a step basecamp step-complete <project_id> <step_id> # Uncomplete a step basecamp step-uncomplete <project_id> <step_id> # Reposition a step (0-indexed) basecamp step-reposition <project_id> <card_id> <step_id> --position 0

Todos

# List todo lists in a project basecamp todolists <project_id> # List todos in a todo list basecamp todos <project_id> <todolist_id> # List completed todos basecamp todos <project_id> <todolist_id> --completed # View a todo basecamp todo <project_id> <todo_id> # Create a todo basecamp todo-create <project_id> <todolist_id> --content "Task description" # Complete a todo basecamp todo-complete <project_id> <todo_id> # Uncomplete a todo basecamp todo-uncomplete <project_id> <todo_id> # Reposition a todo within its list (1-indexed) basecamp todo-reposition <project_id> <todo_id> --position 1

Todo Groups

# List groups within a todolist basecamp todolist-groups <project_id> <todolist_id> # View a group basecamp todolist-group <project_id> <group_id> # Create a group within a todolist basecamp todolist-group-create <project_id> <todolist_id> --name "Group Name" # Create a group with color basecamp todolist-group-create <project_id> <todolist_id> --name "Group Name" --color green

Messages

# List messages in a project basecamp messages <project_id> # View a message basecamp message <project_id> <message_id> # View a message with comments basecamp message <project_id> <message_id> --comments # Create a message basecamp message-create <project_id> --subject "Subject" --content "Body"

Comments

# Add a comment to any recording (card, message, todo, etc.) basecamp comment-add <project_id> <recording_id> --content "Comment text"

Documents

# List documents in a project basecamp docs <project_id> # View a document basecamp doc <project_id> <doc_id> # View a document with comments basecamp doc <project_id> <doc_id> --comments # Create a document basecamp doc-create <project_id> --title "Title" --content "Content"

Schedule

# List schedule entries basecamp schedule <project_id> # View an event basecamp event <project_id> <entry_id> # View an event with comments basecamp event <project_id> <entry_id> --comments # Create an event basecamp event-create <project_id> --summary "Meeting" --starts-at "2026-02-01T10:00:00Z" --ends-at "2026-02-01T11:00:00Z" # Create an all-day event basecamp event-create <project_id> --summary "Holiday" --starts-at "2026-02-01" --ends-at "2026-02-01" --all-day

Campfire

# List campfire messages basecamp campfire <project_id> # Post to campfire basecamp campfire-post <project_id> --content "Hello team!"

Search

# Search across all projects basecamp search "query" # Search with type filter basecamp search "query" --type Todo # Search within a project basecamp search "query" --project <project_id>

People

# List all people basecamp people # View a person's details basecamp person <person_id> # List pingable people basecamp people-pingable # List people on a project basecamp people-project <project_id> # View your own profile basecamp my-profile # Update project access (grant/revoke people) basecamp project-access <project_id> --grant "123,456" --revoke "789"

Automatic Check-ins (Questions)

# Get questionnaire info for a project basecamp questionnaire <project_id> # List check-in questions basecamp questions <project_id> # View a question basecamp question <project_id> <question_id> # View a question with comments basecamp question <project_id> <question_id> --comments # List answers to a question basecamp question-answers <project_id> <question_id> # View an answer basecamp question-answer <project_id> <answer_id> # View an answer with comments basecamp question-answer <project_id> <answer_id> --comments

Uploads

# Upload a file (returns attachable_sgid for use in other API calls) basecamp upload /path/to/file.pdf # List uploads in a vault (get vault_id from 'docs' command) basecamp uploads <project_id> <vault_id> # View an upload basecamp upload-view <project_id> <upload_id> # View an upload with comments basecamp upload-view <project_id> <upload_id> --comments

Recordings Management

# Archive any recording (todo, message, card, etc.) basecamp archive <project_id> <recording_id> # Unarchive a recording (set back to active) basecamp unarchive <project_id> <recording_id> # Trash a recording basecamp trash <project_id> <recording_id>

Message Types

# List message types (categories) basecamp message-types <project_id> # View a message type basecamp message-type <project_id> <type_id> # Create a message type basecamp message-type-create <project_id> --name "Announcement" --icon "📢" # Update a message type basecamp message-type-update <project_id> <type_id> --name "Update" --icon "" # Delete a message type basecamp message-type-delete <project_id> <type_id>

Activity Events

# List all events (across all projects) basecamp events # List events for a project basecamp events-project <project_id> # List events for a specific recording basecamp events-recording <project_id> <recording_id>

Project-specific config

Create .basecamp.yml in your project directory to set a default project_id:

project_id: 12345678

Then omit project_id from commands:

basecamp boards # uses project_id from .basecamp.yml basecamp cards 87654321 # just need board_id basecamp card 44444444 # just need card_id

The CLI searches current directory and parent directories for .basecamp.yml.

Agent Skills

Install the Basecamp skill for AI coding agents (Claude Code, OpenCode, and others):

npx skills add robzolkos/basecamp-cli

Output

All commands output JSON for easy parsing with jq:

basecamp projects | jq '.[] | select(.status == "active") | .name'

Errors are output as JSON to stderr:

{"error": "not authenticated, run 'basecamp auth' first"}

Development

# Run tests make test # Build make build # Install to $GOPATH/bin make install

About

A command-line interface for the Basecamp API

Topics

Resources

License

Stars

Watchers

Forks

Contributors