---
name: fizzy
description: |
Interact with Fizzy via the Fizzy CLI. Manage boards, cards, columns, comments,
steps, reactions, tags, users, notifications, pins, webhooks, and account settings. Use for ANY Fizzy question or action.
triggers:
# Direct invocations
- fizzy
- /fizzy
# Resource actions
- fizzy board
- fizzy card
- fizzy column
- fizzy comment
- fizzy step
- fizzy reaction
- fizzy tag
- fizzy notification
- fizzy webhook
- fizzy account
# Common actions
- link to fizzy
- track in fizzy
- create card
- close card
- move card
- assign card
- add comment
- add step
- search cards
# Search and discovery
- search fizzy
- find in fizzy
- check fizzy
- list fizzy
- show fizzy
- get from fizzy
# Questions
- what's in fizzy
- what fizzy
- how do I fizzy
# My work
- my cards
- my tasks
- my board
- assigned to me
- pinned cards
# URLs
- fizzy.do
- app.fizzy.do
invocable: true
argument-hint: "[action] [args...]"
---
# /fizzy - Fizzy Workflow Command
Full CLI coverage: boards, cards, columns, comments, steps, reactions, tags, users, notifications, pins, webhooks, account settings, search, and board migration.
## References
- **[Dav's Solo Sprint Workflow](references/dav-solo-workflow.md)** — My personal Fizzy setup: board structure, column workflow, CLI quirks, estimate tags, useful snippets
## Agent Invariants
**MUST follow these rules:**
1. **Cards use NUMBER, not ID** — `fizzy card show 42` uses the card number. Other resources use their `id` field.
2. **Parse JSON with jq** to reduce token output — `fizzy card list | jq '[.data[] | {number, title}]'`
3. **Check breadcrumbs** in responses for available next actions with pre-filled values
4. **Check for board context** via `.fizzy.yaml` or `--board` flag before listing cards
5. **Rich text fields accept HTML** — use `
` tags for paragraphs, `` for inline images
6. **Card description is a string**, but comment body is a nested object — `.description` vs `.body.plain_text`
7. **Display the welcome message for new signups** — When `signup complete --name` returns `is_new_user: true`, you MUST immediately display the `welcome_message` field prominently to the user. This is a one-time personal note from the CEO — if you skip it, the user will never see it.
## Decision Trees
### Finding Content
```
Need to find something?
├── Know the board? → fizzy card list --board
├── Full-text search? → fizzy search "query"
├── Filter by status? → fizzy card list --indexed-by closed|not_now|golden|stalled
├── Filter by person? → fizzy card list --assignee
├── Filter by time? → fizzy card list --created today|thisweek|thismonth
└── Cross-board? → fizzy search "query" (searches all boards)
```
### When Search Returns Nothing (Troubleshooting)
If `fizzy search` or `fizzy card list` returns empty but you know the card exists:
```bash
# 1. Check auth is working
fizzy auth status
# 2. Get your account slug (search needs --account if not configured)
fizzy identity show | jq -r '.data.accounts[0].slug' | sed 's/\///'
# 3. List all boards for that account
fizzy board list --account 6104339 | jq -r '.data[] | {id, name}'
# 4. Search cards on likely boards
fizzy card list --board BOARD_ID --account 6104339 --all | \
jq '[.data[] | select(.title | test("(?i)(keyword1|keyword2)")) | {number, title}]'
```
**Common causes of empty search results:**
- Missing `--account` flag (search requires explicit account if no default configured)
- Card is in "Not Now" or closed status — add `--indexed-by not_now` or `--indexed-by closed`
- Card is on a different board than expected — search is board-scoped by default
### Modifying Content
```
Want to change something?
├── Move to column? → fizzy card column --column
├── Change status? → fizzy card close|reopen|postpone
├── Assign? → fizzy card assign --user
├── Comment? → fizzy comment create --card --body "text"
├── Add step? → fizzy step create --card --content "text"
└── Move to board? → fizzy card move --to
```
## Quick Reference
| Resource | List | Show | Create | Update | Delete | Other |
|----------|------|------|--------|--------|--------|-------|
| account | - | `account show` | - | `account settings-update` | - | `account entropy`, `account export-create`, `account export-show EXPORT_ID`, `account join-code-show`, `account join-code-reset`, `account join-code-update` |
| board | `board list` | `board show ID` | `board create` | `board update ID` | `board delete ID` | `board publish ID`, `board unpublish ID`, `board entropy ID`, `board closed`, `board postponed`, `board stream`, `board involvement ID`, `migrate board ID` |
| card | `card list` | `card show NUMBER` | `card create` | `card update NUMBER` | `card delete NUMBER` | `card move NUMBER`, `card publish NUMBER`, `card mark-read NUMBER`, `card mark-unread NUMBER` |
| search | `search QUERY` | - | - | - | - | - |
| column | `column list --board ID` | `column show ID --board ID` | `column create` | `column update ID` | `column delete ID` | `column move-left ID`, `column move-right ID` |
| comment | `comment list --card NUMBER` | `comment show ID --card NUMBER` | `comment create` | `comment update ID` | `comment delete ID` | `comment attachments show --card NUMBER` |
| step | `step list --card NUMBER` | `step show ID --card NUMBER` | `step create` | `step update ID` | `step delete ID` | - |
| reaction | `reaction list` | - | `reaction create` | - | `reaction delete ID` | - |
| tag | `tag list` | - | - | - | - | - |
| user | `user list` | `user show ID` | - | `user update ID` | - | `user deactivate ID`, `user role ID`, `user avatar-remove ID`, `user push-subscription-create`, `user push-subscription-delete ID` |
| notification | `notification list` | - | - | - | - | `notification tray`, `notification read-all`, `notification settings-show`, `notification settings-update` |
| pin | `pin list` | - | - | - | - | `card pin NUMBER`, `card unpin NUMBER` |
| webhook | `webhook list --board ID` | `webhook show ID --board ID` | `webhook create` | `webhook update ID` | `webhook delete ID` | `webhook reactivate ID` |
---
## Global Flags
Important: the currently installed Fizzy CLI in this environment differs from some older docs/examples.
All commands support:
| Flag | Description |
|------|-------------|
| `--account SLUG` | Account slug, e.g. `6104339` (required when no default account is configured) |
| `--token TOKEN` | API access token |
| `--api-url URL` | API base URL |
| `--pretty` | Pretty-print JSON output with indentation |
| `--verbose` | Show request/response details |
Notes:
- The current CLI returns JSON by default in non-TTY use.
- `--json`, `--quiet`, `--styled`, `--markdown`, `--agent`, `--ids-only`, `--count`, and client-side `--limit` were not available in this install.
- `fizzy board list` may fail with `No account configured. Set --account flag or FIZZY_ACCOUNT` if no default account exists.
- For this CLI, use the bare account slug like `6104339`, not `/6104339`.
## Pagination
List commands use `--page` for pagination.
```bash
# Get first page (default)
fizzy card list --page 1
# Fetch ALL pages at once
fizzy card list --all
```
Note: the current CLI install did not expose a client-side `--limit` flag.
**IMPORTANT:** The `--all` flag controls pagination only - it fetches all pages of results for your current filter. It does NOT change which cards are included. By default, `card list` returns only open cards. See [Card Statuses](#card-statuses) for how to fetch closed or postponed cards.
Commands supporting `--all` and `--page`:
- `board list`
- `board closed`
- `board postponed`
- `board stream`
- `card list`
- `search`
- `comment list`
- `tag list`
- `user list`
- `notification list`
- `webhook list`
---
## Configuration
```
~/.config/fizzy/ # Global config (or ~/.fizzy/)
└── config.yaml # Token, account, API URL, default board
.fizzy.yaml # Per-repo config (committed to git)
```
**Per-repo config:** `.fizzy.yaml`
```yaml
account: 123456789
board: 03foq1hqmyy91tuyz3ghugg6c
```
**Priority (highest to lowest):**
1. CLI flags (`--token`, `--profile`, `--api-url`, `--board`)
2. Environment variables (`FIZZY_TOKEN`, `FIZZY_PROFILE`, `FIZZY_API_URL`, `FIZZY_BOARD`)
3. Named profile settings (base URL, board from `config.json`)
4. Local project config (`.fizzy.yaml`)
5. Global config (`~/.config/fizzy/config.yaml` or `~/.fizzy/config.yaml`)
**Check context:**
```bash
cat .fizzy.yaml 2>/dev/null || echo "No project configured"
```
**Setup:**
```bash
fizzy setup # Interactive wizard
fizzy auth login TOKEN # Save token for current profile
fizzy auth status # Check auth status
fizzy auth list # List all authenticated profiles
fizzy auth switch PROFILE # Switch active profile
fizzy auth logout # Log out current profile
fizzy auth logout --all # Log out all profiles
fizzy identity show # Show profiles
```
### Signup (New User or Token Generation)
Interactive:
```bash
fizzy signup # Full interactive wizard
```
Step-by-step (for agents):
```bash
# Step 1: Request magic link
fizzy signup start --email user@example.com
# Returns: {"pending_authentication_token": "eyJ..."}
# Step 2: User checks email for 6-digit code, then verify
fizzy signup verify --code ABC123 --pending-token eyJ...
# Returns: {"session_token": "eyJ...", "requires_signup_completion": true/false}
# For existing users (requires_signup_completion=false), also returns: "accounts": [{"name": "...", "slug": "..."}]
# Step 3: Write the session token to a temp file to keep it out of the agent session
echo "eyJ..." > /tmp/fizzy-session && chmod 600 /tmp/fizzy-session
# Step 4a: New user — complete signup (session token via stdin)
fizzy signup complete --name "Full Name" < /tmp/fizzy-session
# Returns: {"token": "fizzy_...", "account": "slug"}
# Step 4b: Existing user — generate token for an account
fizzy signup complete --account SLUG < /tmp/fizzy-session
# Returns: {"token": "fizzy_...", "account": "slug"}
# Step 5: Clean up the temp file
rm /tmp/fizzy-session
```
**Note:** The user must check their email for the 6-digit code between steps 1 and 2.
The session token is written to a temp file and piped via stdin to avoid exposing it in shell history or the agent's conversation context.
Token is saved to the system credential store when available, with a config file as fallback. Profile and API URL are saved to `~/.config/fizzy/` (preferred) or `~/.fizzy/`.
**Welcome message for new users:** When `signup complete --name` succeeds (new user), the response includes `is_new_user: true` and a `welcome_message` field. See Agent Invariant #7 — you MUST display it.
---
## Response Structure
All responses follow this structure:
```json
{
"ok": true,
"data": { ... }, // Single object or array
"summary": "4 boards", // Human-readable description
"breadcrumbs": [ ... ], // Contextual next actions (omitted when empty)
"context": { ... }, // Location, pagination, and other context (omitted when empty)
"meta": {
}
}
```
**Summary field formats:**
| Command | Example Summary |
|---------|-----------------|
| `board list` | "5 boards" |
| `board show ID` | "Board: Engineering" |
| `card list` | "42 cards (page 1)" or "42 cards (all)" |
| `card show 123` | "Card #123: Fix login bug" |
| `search "bug"` | "7 results for \"bug\"" |
| `notification list` | "8 notifications (3 unread)" |
**List responses with pagination:**
```json
{
"ok": true,
"data": [ ... ],
"summary": "10 cards (page 1)",
"context": {
"pagination": {
"has_next": true,
"next_url": "https://..."
}
}
}
```
**Breadcrumbs (contextual next actions):**
Responses include a `breadcrumbs` array suggesting what you can do next. Each breadcrumb has:
- `action`: Short action name (e.g., "comment", "close", "assign")
- `cmd`: Ready-to-run command with actual values interpolated
- `description`: Human-readable description
```bash
fizzy card show 42 | jq '.breadcrumbs'
```
```json
[
{"action": "comment", "cmd": "fizzy comment create --card 42 --body \"text\"", "description": "Add comment"},
{"action": "triage", "cmd": "fizzy card column 42 --column ", "description": "Move to column"},
{"action": "close", "cmd": "fizzy card close 42", "description": "Close card"},
{"action": "assign", "cmd": "fizzy card assign 42 --user ", "description": "Assign user"}
]
```
Use breadcrumbs to discover available actions without memorizing the full CLI. Values like card numbers and board IDs are pre-filled; placeholders like `` need to be replaced.
**Create/update responses include location:**
```json
{
"ok": true,
"data": { ... },
"context": {
"location": "/6102600/cards/579.json"
}
}
```
---
## ID Formats
**IMPORTANT:** Cards use TWO identifiers:
| Field | Format | Use For |
|-------|--------|---------|
| `id` | `03fe4rug9kt1mpgyy51lq8i5i` | Internal ID (in JSON responses) |
| `number` | `579` | CLI commands (`card show`, `card update`, etc.) |
**All card CLI commands use the card NUMBER, not the ID.**
Other resources (boards, columns, comments, steps, reactions, users) use their `id` field.
---
## Card Statuses
Cards exist in different states. By default, `fizzy card list` returns **open cards only** (cards in triage or columns). To fetch cards in other states, use the `--indexed-by` or `--column` flags:
| Status | How to fetch | Description |
|--------|--------------|-------------|
| Open (default) | `fizzy card list` | Cards in triage ("Maybe?") or any column |
| Closed/Done | `fizzy card list --indexed-by closed` | Completed cards |
| Not Now | `fizzy card list --indexed-by not_now` | Postponed cards |
| Golden | `fizzy card list --indexed-by golden` | Starred/important cards |
| Stalled | `fizzy card list --indexed-by stalled` | Cards with no recent activity |
You can also use pseudo-columns:
```bash
fizzy card list --column done --all # Same as --indexed-by closed
fizzy card list --column not-now --all # Same as --indexed-by not_now
fizzy card list --column maybe --all # Cards in triage (no column assigned)
```
**Fetching all cards on a board:**
To get all cards regardless of status (for example, to build a complete board view), make separate queries:
```bash
# Open cards (triage + columns)
fizzy card list --board BOARD_ID --all
# Closed/Done cards
fizzy card list --board BOARD_ID --indexed-by closed --all
# Optionally, Not Now cards
fizzy card list --board BOARD_ID --indexed-by not_now --all
```
---
## Common jq Patterns
### Reducing Output
```bash
# Card summary (most useful)
fizzy card list | jq '[.data[] | {number, title, status, board: .board.name}]'
# First N items
fizzy card list | jq '.data[:5]'
# Just IDs
fizzy board list | jq '[.data[].id]'
# Specific fields from single item
fizzy card show 579 | jq '.data | {number, title, status, golden}'
# Card with description length (description is a string, not object)
fizzy card show 579 | jq '.data | {number, title, desc_length: (.description | length)}'
```
### Filtering
```bash
# Cards with a specific status
fizzy card list --all | jq '[.data[] | select(.status == "published")]'
# Golden cards only
fizzy card list --indexed-by golden | jq '[.data[] | {number, title}]'
# Cards with non-empty descriptions
fizzy card list | jq '[.data[] | select(.description | length > 0) | {number, title}]'
# Cards with steps (must use card show, steps not in list)
fizzy card show 579 | jq '.data.steps'
```
### Extracting Nested Data
```bash
# Comment text only (body.plain_text for comments)
fizzy comment list --card 579 | jq '[.data[].body.plain_text]'
# Card description (just .description for cards - it's a string)
fizzy card show 579 | jq '.data.description'
# Step completion status
fizzy card show 579 | jq '[.data.steps[] | {content, completed}]'
```
### Activity Analysis
```bash
# Cards with steps count (requires card show for each)
fizzy card show 579 | jq '.data | {number, title, steps_count: (.steps | length)}'
# Comments count for a card
fizzy comment list --card 579 | jq '.data | length'
```
---
## Command Reference
### Identity
```bash
fizzy identity show # Show your identity and accessible accounts
```
### Account
```bash
fizzy account show # Show account settings (name, auto-postpone period)
fizzy account entropy --auto_postpone_period_in_days N # Update account default auto-postpone period (admin only, N: 3, 7, 11, 30, 90, 365)
```
The `auto_postpone_period_in_days` is the account-level default. Cards are automatically moved to "Not Now" after this period of inactivity. Each board can override this with `board entropy`.
### Search
Quick text search across cards. Multiple words are treated as separate terms (AND).
```bash
fizzy search QUERY [flags]
--board ID # Filter by board
--assignee ID # Filter by assignee user ID
--tag ID # Filter by tag ID
--indexed-by LANE # Filter: all, closed, not_now, golden
--sort ORDER # Sort: newest, oldest, or latest (default)
--page N # Page number
--all # Fetch all pages
```
**Examples:**
```bash
fizzy search "bug" # Search for "bug"
fizzy search "login error" # Search for cards containing both "login" AND "error"
fizzy search "bug" --board BOARD_ID # Search within a specific board
fizzy search "bug" --indexed-by closed # Include closed cards
fizzy search "feature" --sort newest # Sort by newest first
```
### Boards
```bash
fizzy board list [--page N] [--all]
fizzy board show BOARD_ID
fizzy board create --name "Name" [--all_access true/false] [--auto_postpone_period_in_days N]
fizzy board update BOARD_ID [--name "Name"] [--all_access true/false] [--auto_postpone_period_in_days N]
fizzy board publish BOARD_ID
fizzy board unpublish BOARD_ID
fizzy board delete BOARD_ID
fizzy board entropy BOARD_ID --auto_postpone_period_in_days N # N: 3, 7, 11, 30, 90, 365
fizzy board closed --board ID [--page N] [--all] # List closed cards
fizzy board postponed --board ID [--page N] [--all] # List postponed cards
fizzy board stream --board ID [--page N] [--all] # List stream cards
fizzy board involvement BOARD_ID --involvement LEVEL # Update your involvement
```
`board show` includes `public_url` only when the board is published.
`board entropy` updates the auto-postpone period for a specific board (overrides account default). Requires board admin.
### Board Migration
Migrate boards between accounts (e.g., from personal to team account).
```bash
fizzy migrate board BOARD_ID --from SOURCE_SLUG --to TARGET_SLUG [flags]
--include-images # Migrate card header images and inline attachments
--include-comments # Migrate card comments
--include-steps # Migrate card steps (to-do items)
--dry-run # Preview migration without making changes
```
**What gets migrated:**
- Board with same name
- All columns (preserving order and colors)
- All cards with titles, descriptions, timestamps, and tags
- Card states (closed, golden, column placement)
- Optional: header images, inline attachments, comments, and steps
**What cannot be migrated:**
- Card creators (become the migrating user)
- Card numbers (new sequential numbers in target)
- Comment authors (become the migrating user)
- User assignments (team must reassign manually)
**Requirements:** You must have API access to both source and target accounts. Verify with `fizzy identity show`.
```bash
# Preview migration first
fizzy migrate board BOARD_ID --from personal --to team-account --dry-run
# Basic migration
fizzy migrate board BOARD_ID --from personal --to team-account
# Full migration with all content
fizzy migrate board BOARD_ID --from personal --to team-account \
--include-images --include-comments --include-steps
```
### Cards
#### Listing & Viewing
```bash
fizzy card list [flags]
--board ID # Filter by board
--column ID # Filter by column ID or pseudo: not-now, maybe, done
--assignee ID # Filter by assignee user ID
--tag ID # Filter by tag ID
--indexed-by LANE # Filter: all, closed, not_now, stalled, postponing_soon, golden
--search "terms" # Search by text (space-separated for multiple terms)
--sort ORDER # Sort: newest, oldest, or latest (default)
--creator ID # Filter by creator user ID
--closer ID # Filter by user who closed the card
--unassigned # Only show unassigned cards
--created PERIOD # Filter by creation: today, yesterday, thisweek, lastweek, thismonth, lastmonth
--closed PERIOD # Filter by closure: today, yesterday, thisweek, lastweek, thismonth, lastmonth
--page N # Page number
--all # Fetch all pages
fizzy card show CARD_NUMBER # Show card details (includes steps)
```
#### Creating & Updating
```bash
fizzy card create --board ID --title "Title" [flags]
--description "HTML" # Card description (HTML)
--description_file PATH # Read description from file
--image SIGNED_ID # Header image (use signed_id from upload)
--tag-ids "id1,id2" # Comma-separated tag IDs
--created-at TIMESTAMP # Custom created_at
fizzy card update CARD_NUMBER [flags]
--title "Title"
--description "HTML"
--description_file PATH
--image SIGNED_ID
--created-at TIMESTAMP
fizzy card delete CARD_NUMBER
```
#### Status Changes
```bash
fizzy card close CARD_NUMBER # Close card (sets closed: true)
fizzy card reopen CARD_NUMBER # Reopen closed card
fizzy card postpone CARD_NUMBER # Move to Not Now lane
fizzy card untriage CARD_NUMBER # Remove from column, back to triage
```
**Note:** Card `status` field stays "published" for active cards. Use:
- `closed: true/false` to check if closed
- `--indexed-by not_now` to find postponed cards
- `--indexed-by closed` to find closed cards
#### Actions
```bash
fizzy card column CARD_NUMBER --column ID # Move to column (use column ID or: maybe, not-now, done)
fizzy card move CARD_NUMBER --to BOARD_ID # Move card to a different board
fizzy card assign CARD_NUMBER --user ID # Toggle user assignment
fizzy card self-assign CARD_NUMBER # Toggle current user's assignment
fizzy card tag CARD_NUMBER --tag "name" # Toggle tag (creates tag if needed)
fizzy card watch CARD_NUMBER # Subscribe to notifications
fizzy card unwatch CARD_NUMBER # Unsubscribe
fizzy card pin CARD_NUMBER # Pin card for quick access
fizzy card unpin CARD_NUMBER # Unpin card
fizzy card golden CARD_NUMBER # Mark as golden/starred
fizzy card ungolden CARD_NUMBER # Remove golden status
fizzy card image-remove CARD_NUMBER # Remove header image
fizzy card publish CARD_NUMBER # Publish a card
fizzy card mark-read CARD_NUMBER # Mark card as read
fizzy card mark-unread CARD_NUMBER # Mark card as unread
```
#### Attachments
```bash
fizzy card attachments show CARD_NUMBER [--include-comments] # List attachments
fizzy card attachments download CARD_NUMBER [INDEX] [--include-comments] # Download (1-based index)
-o, --output FILENAME # Exact name (single) or prefix (multiple: test_1.png, test_2.png)
```
### Columns
Boards have pseudo columns by default: `not-now`, `maybe`, `done`
```bash
fizzy column list --board ID
fizzy column show COLUMN_ID --board ID
fizzy column create --board ID --name "Name" [--color HEX]
fizzy column update COLUMN_ID --board ID [--name "Name"] [--color HEX]
fizzy column delete COLUMN_ID --board ID
fizzy column move-left COLUMN_ID # Move column one position left
fizzy column move-right COLUMN_ID # Move column one position right
```
### Comments
```bash
fizzy comment list --card NUMBER [--page N] [--all]
fizzy comment show COMMENT_ID --card NUMBER
fizzy comment create --card NUMBER --body "HTML" [--body_file PATH] [--created-at TIMESTAMP]
fizzy comment update COMMENT_ID --card NUMBER [--body "HTML"] [--body_file PATH]
fizzy comment delete COMMENT_ID --card NUMBER
```
#### Comment Attachments
```bash
fizzy comment attachments show --card NUMBER # List attachments in comments
fizzy comment attachments download --card NUMBER [INDEX] # Download (1-based index)
-o, --output FILENAME # Exact name (single) or prefix (multiple: test_1.png, test_2.png)
```
### Steps (To-Do Items)
Steps are returned in `card show` response but can also be listed separately.
```bash
fizzy step list --card NUMBER
fizzy step show STEP_ID --card NUMBER
fizzy step create --card NUMBER --content "Text" [--completed]
fizzy step update STEP_ID --card NUMBER [--content "Text"] [--completed] [--not_completed]
fizzy step delete STEP_ID --card NUMBER
```
### Reactions
Reactions can be added to cards directly or to comments on cards.
```bash
# Card reactions (react directly to a card)
fizzy reaction list --card NUMBER
fizzy reaction create --card NUMBER --content "emoji"
fizzy reaction delete REACTION_ID --card NUMBER
# Comment reactions (react to a specific comment)
fizzy reaction list --card NUMBER --comment COMMENT_ID
fizzy reaction create --card NUMBER --comment COMMENT_ID --content "emoji"
fizzy reaction delete REACTION_ID --card NUMBER --comment COMMENT_ID
```
| Flag | Required | Description |
|------|----------|-------------|
| `--card` | Yes | Card number (always required) |
| `--comment` | No | Comment ID (omit for card reactions) |
| `--content` | Yes (create) | Emoji or text, max 16 characters |
### Tags
Tags are created automatically when using `card tag`. List shows all existing tags.
```bash
fizzy tag list [--page N] [--all]
```
### Users
```bash
fizzy user list [--page N] [--all]
fizzy user show USER_ID
fizzy user update USER_ID --name "Name" # Update user name (requires admin/owner)
fizzy user update USER_ID --avatar /path.jpg # Update user avatar
fizzy user deactivate USER_ID # Deactivate user (requires admin/owner)
fizzy user role USER_ID --role ROLE # Update user role (requires admin/owner)
fizzy user avatar-remove USER_ID # Remove user avatar
fizzy user push-subscription-create --user ID --endpoint URL --p256dh-key KEY --auth-key KEY
fizzy user push-subscription-delete SUB_ID --user ID
```
### Pins
```bash
fizzy pin list # List your pinned cards (up to 100)
```
### Notifications
```bash
fizzy notification list [--page N] [--all]
fizzy notification tray # Unread notifications (up to 100)
fizzy notification tray --include-read # Include read notifications
fizzy notification read NOTIFICATION_ID
fizzy notification read-all
fizzy notification unread NOTIFICATION_ID
fizzy notification settings-show # Show notification settings
fizzy notification settings-update --bundle-email-frequency FREQ # Update settings
```
### Webhooks
Webhooks notify external services when events occur on a board. Requires account admin access.
```bash
fizzy webhook list --board ID [--page N] [--all]
fizzy webhook show WEBHOOK_ID --board ID
fizzy webhook create --board ID --name "Name" --url "https://..." [--actions card_published,card_closed,...]
fizzy webhook update WEBHOOK_ID --board ID [--name "Name"] [--actions card_closed,...]
fizzy webhook delete WEBHOOK_ID --board ID
fizzy webhook reactivate WEBHOOK_ID --board ID # Reactivate a deactivated webhook
```
**Supported actions:** `card_assigned`, `card_closed`, `card_postponed`, `card_auto_postponed`, `card_board_changed`, `card_published`, `card_reopened`, `card_sent_back_to_triage`, `card_triaged`, `card_unassigned`, `comment_created`
**Note:** Webhook URL is immutable after creation. Use `--actions` with comma-separated values.
### Webhook Schema
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Webhook ID (use for CLI commands) |
| `name` | string | Webhook name |
| `payload_url` | string | Destination URL |
| `active` | boolean | Whether webhook is active |
| `signing_secret` | string | Secret for verifying payloads |
| `subscribed_actions` | array | List of subscribed event actions |
| `created_at` | timestamp | ISO 8601 |
| `url` | string | API URL |
| `board` | object | Nested Board |
### Account
```bash
fizzy account show # Show account settings
fizzy account settings-update --name "Name" # Update account name
fizzy account export-create # Create data export
fizzy account export-show EXPORT_ID # Check export status
fizzy account join-code-show # Show join code
fizzy account join-code-reset # Reset join code
fizzy account join-code-update --usage-limit N # Update join code limit
```
### File Uploads
```bash
fizzy upload file PATH
# Returns: { "signed_id": "...", "attachable_sgid": "..." }
```
| ID | Use For |
|---|---|
| `signed_id` | Card header/background images (`--image` flag) |
| `attachable_sgid` | Inline images in rich text (descriptions, comments) |
---
## Common Workflows
### Create Card with Steps
```bash
# Create the card
CARD=$(fizzy card create --board BOARD_ID --title "New Feature" \
--description "Feature description
" | jq -r '.data.number')
# Add steps
fizzy step create --card $CARD --content "Design the feature"
fizzy step create --card $CARD --content "Implement backend"
fizzy step create --card $CARD --content "Write tests"
```
### Link Code to Card
```bash
# Add a comment linking the commit
fizzy comment create --card 42 --body "Commit $(git rev-parse --short HEAD): $(git log -1 --format=%s)
"
# Close the card when done
fizzy card close 42
```
### Create Card with Inline Image
```bash
# Upload image
SGID=$(fizzy upload file screenshot.png | jq -r '.data.attachable_sgid')
# Create description file with embedded image
cat > desc.html << EOF
See the screenshot below:
EOF
# Create card
fizzy card create --board BOARD_ID --title "Bug Report" --description_file desc.html
```
### Create Card with Background Image (only when explicitly requested)
```bash
# Validate file is an image
MIME=$(file --mime-type -b /path/to/image.png)
if [[ ! "$MIME" =~ ^image/ ]]; then
echo "Error: Not a valid image (detected: $MIME)"
exit 1
fi
# Upload and get signed_id
SIGNED_ID=$(fizzy upload file /path/to/header.png | jq -r '.data.signed_id')
# Create card with background
fizzy card create --board BOARD_ID --title "Card" --image "$SIGNED_ID"
```
### Move Card Through Workflow
```bash
# Move to a column
fizzy card column 579 --column maybe
# Assign to yourself
fizzy card self-assign 579
# Or assign to another user
fizzy card assign 579 --user USER_ID
# Mark as golden (important)
fizzy card golden 579
# When done, close it
fizzy card close 579
```
### Move Card to Different Board
```bash
# Move card to another board
fizzy card move 579 --to TARGET_BOARD_ID
```
### Search and Filter Cards
```bash
# Quick search
fizzy search "bug" | jq '[.data[] | {number, title}]'
# Search with filters
fizzy search "login" --board BOARD_ID --sort newest
# Find recently created cards
fizzy card list --created today --sort newest
# Find cards closed this week
fizzy card list --indexed-by closed --closed thisweek
# Find unassigned cards
fizzy card list --unassigned --board BOARD_ID
```
### React to a Card
```bash
# Add reaction directly to a card
fizzy reaction create --card 579 --content "👍"
# List reactions on a card
fizzy reaction list --card 579 | jq '[.data[] | {id, content, reacter: .reacter.name}]'
```
### Add Comment with Reaction
```bash
# Add comment
COMMENT=$(fizzy comment create --card 579 --body "Looks good!
" | jq -r '.data.id')
# Add reaction to the comment
fizzy reaction create --card 579 --comment $COMMENT --content "👍"
```
---
## Resource Schemas
Complete field reference for all resources. Use these exact field paths in jq queries.
### Card Schema
**IMPORTANT:** `card list` and `card show` return different fields. `steps` only in `card show`.
| Field | Type | Description |
|-------|------|-------------|
| `number` | integer | **Use this for CLI commands** |
| `id` | string | Internal ID (in responses only) |
| `title` | string | Card title |
| `description` | string | Plain text content (**NOT an object**) |
| `description_html` | string | HTML version with attachments |
| `status` | string | Usually "published" for active cards |
| `closed` | boolean | true = card is closed |
| `golden` | boolean | true = starred/important |
| `image_url` | string/null | Header/background image URL |
| `has_attachments` | boolean | true = card has file attachments |
| `has_more_assignees` | boolean | More assignees than shown |
| `created_at` | timestamp | ISO 8601 |
| `last_active_at` | timestamp | ISO 8601 |
| `url` | string | Web URL |
| `comments_url` | string | Comments endpoint URL |
| `board` | object | Nested Board (see below) |
| `creator` | object | Nested User (see below) |
| `assignees` | array | Array of User objects |
| `tags` | array | Array of Tag objects |
| `steps` | array | **Only in `card show`**, not in list |
### Board Schema
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Board ID (use for CLI commands) |
| `name` | string | Board name |
| `all_access` | boolean | All users have access |
| `auto_postpone_period_in_days` | integer | Days of inactivity before cards are auto-postponed |
| `created_at` | timestamp | ISO 8601 |
| `url` | string | Web URL |
| `creator` | object | Nested User |
### Account Settings Schema (from `account show`)
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Account ID |
| `name` | string | Account name |
| `cards_count` | integer | Total cards in account |
| `auto_postpone_period_in_days` | integer | Account-level default auto-postpone period |
| `created_at` | timestamp | ISO 8601 |
### User Schema
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | User ID (use for CLI commands) |
| `name` | string | Display name |
| `email_address` | string | Email |
| `role` | string | "owner", "admin", or "member" |
| `active` | boolean | Account is active |
| `created_at` | timestamp | ISO 8601 |
| `url` | string | Web URL |
### Comment Schema
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Comment ID (use for CLI commands) |
| `body` | object | **Nested object with html and plain_text** |
| `body.html` | string | HTML content |
| `body.plain_text` | string | Plain text content |
| `created_at` | timestamp | ISO 8601 |
| `updated_at` | timestamp | ISO 8601 |
| `url` | string | Web URL |
| `reactions_url` | string | Reactions endpoint URL |
| `creator` | object | Nested User |
| `card` | object | Nested {id, url} |
### Step Schema
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Step ID (use for CLI commands) |
| `content` | string | Step text |
| `completed` | boolean | Completion status |
### Column Schema
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Column ID or pseudo ID ("not-now", "maybe", "done") |
| `name` | string | Display name |
| `kind` | string | "not_now", "triage", "closed", or custom |
| `pseudo` | boolean | true = built-in column |
### Tag Schema
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Tag ID |
| `title` | string | Tag name |
| `created_at` | timestamp | ISO 8601 |
| `url` | string | Web URL |
### Reaction Schema
| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Reaction ID (use for CLI commands) |
| `content` | string | Emoji |
| `url` | string | Web URL |
| `reacter` | object | Nested User |
### Identity Schema (from `identity show`)
| Field | Type | Description |
|-------|------|-------------|
| `accounts` | array | Array of Account objects |
| `accounts[].id` | string | Account ID |
| `accounts[].name` | string | Account name |
| `accounts[].slug` | string | Account slug (use with `signup complete --account` or as profile name) |
| `accounts[].user` | object | Your User in this account |
### Key Schema Differences
| Resource | Text Field | HTML Field |
|----------|------------|------------|
| Card | `.description` (string) | `.description_html` (string) |
| Comment | `.body.plain_text` (nested) | `.body.html` (nested) |
---
## Rich Text Formatting
Card descriptions and comments support HTML. For multiple paragraphs with spacing:
```html
First paragraph.
Second paragraph with spacing above.
```
**Note:** Each `attachable_sgid` can only be used once. Upload the file again for multiple uses.
## Default Behaviors
- **Card images:** Use inline (via `attachable_sgid` in description) by default. Only use background/header (`signed_id` with `--image`) when user explicitly says "background" or "header".
- **Comment images:** Always inline. Comments do not support background images.
---
## Error Handling
**Error response format:**
```json
{
"ok": false,
"error": "Not Found",
"code": "not_found",
"hint": "optional context"
}
```
**Exit codes:**
| Code | Meaning |
|------|---------|
| 0 | Success |
| 1 | Usage / invalid arguments |
| 2 | Not found |
| 3 | Authentication failure |
| 4 | Permission denied |
| 5 | Rate limited |
| 6 | Network error |
| 7 | API / server error |
| 8 | Ambiguous match |
**Authentication errors (exit 3):**
```bash
fizzy auth status # Check auth
fizzy auth list # Check which profiles are configured
fizzy auth switch PROFILE # Switch to correct profile
fizzy auth login TOKEN # Re-authenticate
fizzy setup # Full interactive setup
```
**Account not configured ("No account configured" error):**
If you have a token but no account set, get your account slug from identity:
```bash
# Get account slug from identity (returns "/123456" format, use "123456")
fizzy identity show | jq -r '.data.accounts[0].slug' | sed 's/\///'
# Then: export FIZZY_ACCOUNT=123456
```
**Not found errors (exit 2):** Verify the card number or resource ID is correct. Cards use NUMBER, not ID.
**Permission denied (exit 4):** Some operations (user update, user deactivate) require admin/owner role.
**Network errors (exit 6):** Check API URL configuration:
```bash
fizzy auth status # Shows configured profile and API URL
```
## Learn More
- API documentation: https://github.com/basecamp/fizzy/blob/main/docs/API.md
- CLI repository: https://github.com/basecamp/fizzy-cli