Skip to content

Expose client_visibility on recording-creating commands (messages, cards, etc.) #457

@TrinAvSolutions

Description

@TrinAvSolutions

Summary

The CLI doesn't expose Basecamp's visible_to_clients flag on messages create, cards create, or other commands that produce "recordings." Posts default to visible_to_clients: false, so any client invited to the project can't see them — even if they're @-mentioned and subscribed.

This makes the CLI difficult to use for agent-driven, client-facing communication in client projects, which seems like a target use case for the tool given the "agent first, agent native" framing.

Why it matters

Use case: an AI agent (Claude Code, in our case) drafts and posts a series of discovery questions to a client's Basecamp project on the user's behalf. The client is invited as a Client. The agent uses --subscribe "Client Name" to wire up notifications and [@Name](mention:SGID) for in-body mentions.

Everything looks right to the team-side user — messages are posted, mentions render with avatar pills, subscriptions are set. But the client can't see any of it because every post is silently team-only by default.

Current behavior

basecamp messages create "Question for client" "Body..." \
  --message-board <id> --account <id> --project <id> \
  --subscribe "Client Name"

Posts the message with visible_to_clients: false. The client never sees it. There's no flag, prompt, or warning that this is the default.

Workaround

The BC3 API has a dedicated client_visibility endpoint that the CLI doesn't surface:

PUT https://3.basecampapi.com/{account_id}/buckets/{project_id}/recordings/{recording_id}/client_visibility.json
Body: {"visible_to_clients": true}

We're calling this directly via the OAuth token from basecamp auth token for each post we want a client to see. It works, but it's a separate round-trip per recording and bypasses the CLI's nice envelope/breadcrumbs/JSON conventions.

Suggested UX

Two options, in order of preference:

1. Add a --visible-to-clients (or --visible) flag to create/update commands that produce recordings. Applies to at least: messages create, messages update, cards create, cards update, comment (creating comments), todos create. Defaults to false to match API default; flip with --visible-to-clients for client-facing posts.

basecamp messages create "Title" "Body" --message-board <id> --visible-to-clients
basecamp cards create "Title" --column <id> --visible-to-clients

2. Surface a top-level basecamp visibility command (or under recordings) that mirrors the API endpoint, for batch toggling on already-created recordings:

basecamp visibility set <recording-id> --to clients
basecamp visibility set <recording-id> --to team

Either would be useful. Option 1 catches the issue at create time, which is where it usually matters. Option 2 is helpful for existing-recording cleanup and would have helped us recover from the team-only default after the fact.

Environment

  • CLI: basecamp version 0.7.2
  • OS: Windows 11 (also tested on macOS — same behavior)
  • Auth: OAuth 2.1 standard flow, no custom client credentials
  • Project: client-enabled (clients_enabled: true); client invited and confirmed pingable: true

Related

  • API reference for the field on Recording: documented behavior matches.
  • The cards columns response shows visible_to_clients per column, suggesting this concept is wired throughout the app and just needs surfacing.

Happy to test a PR or beta build if it'd help.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions