Skip to main content

Branches

Good ideas attract coordination.

A branch is a response to a topic. It is the unit of collaboration on the tree — a user proposes a direction, and the community decides how far it goes. Branches carry their own votes, their own context links, and their own rank.

Every branch gets a letter: A, B, C, and so on through Z, then AA … ZZ. Replies are the next letter too, with a parent field pointing at the letter they answer. This forms a tree inside the topic — a history of every direction the conversation took.

flowchart TD
M["Topic"] --> A["Branch A"]
M --> B["Branch B"]
A --> RA["Reply to A"]
B --> RB["Reply to B"]

1. How branches work​

A branch is a direction someone proposes. The community decides how far it goes, and the votes decide the order.

Where you add one​

A branch is appended to a topic that is still open. The same dialog opens from three places: the pen under the topic body, the topic menu (⋯), and the last block of the topic sidebar. Each dialog is labeled by type:

TypeDialog label
postSubmit response
askSubmit answer
contextAdd Context
proposalNew branch
predictionNew Counter
argument, graphNew branch
pollOpens /create with Poll selected

Polls do not accept branches on an existing topic. The rail action on a poll creates a new poll topic instead.

Letter assignment​

Letters are auto-allocated. The root is {main} (the topic itself). The first branch is A, the next is B, and so on. A reply to A is the next available letter, with its parent set to A. The history tree index on the topic page shows the full letter map with parent pointers. The index file names each writer once, with lore and rank: Topic.

Replying​

A reply nests a letter under a branch. Present on the branch ⋯ for post, ask, context, argument, and graph. Absent on proposal, poll, and prediction. The dialog is Reply to {letter}. Fields are the response, a description, up to two context links, and three tags.

Voting on branches​

The same relevance vote that applies to topics also applies to individual branches. A branch vote sets branch_id to the branch's UUID. The branch score contributes to the topic's overall relevance score. On polls and proposals, branch options accept only +1 — one choice per user.

Details: Cast.

Editing and deleting​

A user can edit or delete their own branch while the topic is open. Deleting a branch removes its votes. If the author deletes all their branches on a topic, the topic itself is hard-deleted. On a poll, deleting branches below the minimum of two is blocked.

A closed topic drops all branch controls. What remains is read-only.


2. Spec​

The fields a branch carries and the shape it takes in the public files.

Fields​

A branch carries a title, a description (plain text or Markdown), up to three context links, and three tags. On a context topic, the branch also requires a subtitle, its context links are required (up to three), and at least one tag must overlap with the root topic's tags. On other types the URL is optional and tag overlap is optional.

FieldRule
Title15–280 characters
DescriptionPlain text or Markdown
Context links0–3 (context requires at least 1)
TagsUp to 3

Branches in the document twin​

In the topic's .md and .json files, branches appear as a flat array under branches. Each entry carries letter, body, description, parent (main or a letter), context_links, and tags. The history-tree index uses letter, title (= branch body), and parent.

Details: Topic.


Code​

PiecePath
Proposeapps/frontend/src/server/routers/branches.ts
Formapps/frontend/src/components/topic/BranchForm.tsx
Edit modalapps/frontend/src/components/topic/BranchEditModal.tsx
Reply formapps/frontend/src/components/topic/ReplyForm.tsx
Boardapps/frontend/src/components/branches-board/BranchesBoard.tsx
Rowapps/frontend/src/components/branches-board/BranchRow.tsx