Skip to content

Brainstorms

[view as markdown]

Brainstorms are markdown documents with rich directives — callouts, cards, labels, mermaid diagrams, filetrees — stored locally, versioned on every update, and commentable. Read them from the terminal or open them in the Mac desktop app for a rendered view.

Reach for a brainstorm when you’re capturing a design or proposal. Reach for an issue when the work is trackable and needs a status.

Write a markdown file, then create the brainstorm:

Terminal window
fp bs create path/to/plan.md
Created brainstorm: Auth refactor plan (dardepfromppbeyeeoryqtizcamqezio)
fp://brainstorm?id=dardepfromppbeyeeoryqtizcamqezio&project=%2FUsers%2Fme%2Fproj

The title is taken from the first # heading in the file. Override it with --title:

Terminal window
fp bs create path/to/plan.md --title "Q2 auth refactor"

The second line of the output is an fp:// deep link. When run interactively, fp also hands the link to the OS opener (open on macOS, xdg-open on Linux, start on Windows) so the desktop app launches it automatically.

For machine-readable output, pass --format json:

Terminal window
fp bs create path/to/plan.md --format json
{
"id": "dardepfromppbeyeeoryqtizcamqezio",
"deepLink": "fp://brainstorm?id=dardepfromppbeyeeoryqtizcamqezio&project=%2FUsers%2Fme%2Fproj"
}

fp brainstorm and fp bs are interchangeable. Short ID prefixes work wherever an ID is accepted.

On top of standard GitHub-flavored markdown, brainstorms understand a small set of directives. They render to rich blocks in the desktop app and to plain markdown in the terminal.

:::callout{type="info"}
Key context or background information.
:::
:::callout{type="warning"}
Risk or caveat to highlight.
:::
:::callout{type="decision"}
A decision that was made and its rationale.
:::
:::callout{type="question"}
An open question that needs resolution.
:::
:::card{title="Component Overview"}
Grouped content — paragraphs, lists, tables, code blocks.
:::
:label[Active]{color="green"}
:label[Blocked]{color="red"}
:label[In Review]{color="orange"}
:label[Planned]{color="blue"}
:label[Deprecated]{color="purple"}

Supported colors: green, red, orange, blue, purple.

Standard fenced mermaid blocks render with automatic light/dark theming.

```mermaid
graph TD
A[CLI] --> B[fp-core]
B --> C[(Local Y.Doc)]
C --> D[Desktop app]
```

See the mermaid docs for syntax.

Use a fenced filetree block for directory layouts. Draw hierarchy with ASCII tree characters (├──, └──, │); space-based indentation renders flat.

```filetree
src/
├── components/
│ ├── Button.tsx # new
│ └── Dialog.tsx # modified
└── utils/
└── legacy.ts # deprecated
```

Annotations: # new (green), # modified (orange), # deprecated (muted + strikethrough).

::comment-ref{id="..."} anchors a comment to a specific block. The desktop sidebar inserts this directive automatically when you comment on a block. From the CLI, fp bs comments add prints the snippet for you to paste into the markdown yourself. See Comments below.

## API changes
::comment-ref{id="ifefqrpidlidywdimqgdszqbxwrcdgcr"}
We need to decide between REST and gRPC before the end of the week.

Tables, task lists, inline code, and fenced code blocks all work.

List brainstorms in the current project:

Terminal window
fp bs list
ID STATUS UPDATED TITLE
────────────────────────────────────────────────────────
1f2c3a8b draft Apr 17 Auth refactor plan

Include soft-deleted brainstorms:

Terminal window
fp bs list --deleted

Dump the raw markdown:

Terminal window
fp bs show <id>

Include comments inline. Each ::comment-ref{...} marker is replaced by the thread it anchors, and unanchored comments are listed under an ## Unanchored Comments heading at the bottom:

Terminal window
fp bs show <id> --with-comments

Resolved threads are hidden by default. Add --resolved to include them:

Terminal window
fp bs show <id> --with-comments --resolved

View an older version. The argument is either a raw version ID or a 1-based display number (v1 is the oldest):

Terminal window
fp bs show <id> --version 2

Open the brainstorm in the Mac desktop app:

Terminal window
fp bs show <id> --desktop
# or the equivalent shortcut
fp bs open <id>

Every update creates a new immutable version. Older versions stay accessible via fp bs show --version.

Terminal window
fp bs update <id> path/to/revised.md
Updated brainstorm: Auth refactor plan (v2)

List version history:

Terminal window
fp bs versions <id>
Versions of "Auth refactor plan" (2):
LABEL AUTHOR CREATED
──────────────────────────────────────────────────
v1 alice Apr 15 at 10:12 AM
v2 alice Apr 17 at 02:33 PM

Agents editing a brainstorm typically:

  1. Read it with fp bs show <id> --with-comments.
  2. Edit the markdown locally.
  3. Apply with fp bs update <id> revised.md.
  4. Resolve any threads addressed in the edit.

A comment is either anchored to a specific block via a ::comment-ref{id="..."} directive in the markdown, or unanchored. Unanchored comments appear in the desktop sidebar’s general thread and under ## Unanchored Comments in fp bs show --with-comments.

The desktop sidebar inserts the ::comment-ref directive automatically when you comment on a block. The CLI prints the snippet so you can paste it into the markdown yourself.

List comments on a brainstorm (this is the default comments subcommand):

Terminal window
fp bs comments <id>
## Thread 1f2c3a8b
(1f2c3a8b) alice [Apr 17]:
This approach doesn't handle the token refresh race.

Add a comment:

Terminal window
fp bs comments add <id> "This approach doesn't handle the token refresh race."
Added comment: ifefqrpidlidywdimqgdszqbxwrcdgcr
Place this comment in a brainstorm with:
::comment-ref{id="ifefqrpidlidywdimqgdszqbxwrcdgcr"}

Paste the ::comment-ref{...} line beside the block you want to anchor the comment to, then fp bs update to apply.

Resolve a thread:

Terminal window
fp bs comments resolve <id> <commentId>

Soft-delete a comment:

Terminal window
fp bs comments delete <id> <commentId>

Both <id> and <commentId> accept short prefixes. fp bs comments also accepts the alias fp bs comment.

When editing a brainstorm, read the comments first. Threads carry review feedback and requested changes that the next update is expected to address.

The CLI and the Mac desktop app share a local Y.Doc store, so changes sync in real time. A brainstorm created from the CLI shows up in the app’s brainstorm list immediately. Comments added in the sidebar show up in fp bs show --with-comments without a refresh.

To install the desktop app, see the Mac App overview.

Read-style commands support --format json:

Command--format json
fp bs create✓
fp bs list✓
fp bs versions✓
fp bs comments (default list)✓
fp bs show—
fp bs update—
fp bs open—
fp bs delete—
fp bs comments add / resolve / delete—
Terminal window
fp bs list --format json
[
{
"id": "dardepfromppbeyeeoryqtizcamqezio",
"title": "Auth refactor plan",
"descriptionExcerpt": "Plan for migrating auth to OAuth 2.1...",
"status": "draft",
"deletedAt": null,
"createdAt": "2026-04-15T10:12:00.000Z",
"updatedAt": "2026-04-17T14:33:21.000Z"
}
]