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:
| Type | Dialog label |
|---|---|
| post | Submit response |
| ask | Submit answer |
| context | Add Context |
| proposal | New branch |
| prediction | New Counter |
| argument, graph | New branch |
| poll | Opens /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.
| Field | Rule |
|---|---|
| Title | 15–280 characters |
| Description | Plain text or Markdown |
| Context links | 0–3 (context requires at least 1) |
| Tags | Up 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
| Piece | Path |
|---|---|
| Propose | apps/frontend/src/server/routers/branches.ts |
| Form | apps/frontend/src/components/topic/BranchForm.tsx |
| Edit modal | apps/frontend/src/components/topic/BranchEditModal.tsx |
| Reply form | apps/frontend/src/components/topic/ReplyForm.tsx |
| Board | apps/frontend/src/components/branches-board/BranchesBoard.tsx |
| Row | apps/frontend/src/components/branches-board/BranchRow.tsx |