Features
All of ebb's features and associated documentation.
All commands in ebb run from the command palette (Mod+Shift+P). Most commands have a default shortcut, and you can push ? in the app to see the full shortcut reference. You can rebind each command from the config.
On this page, when a shortcut refers to Mod, it means:
- macOS: Cmd
- Windows / Linux: Ctrl
Flow files
ebb saves flows as .ebb files on your disk, which you can move, copy, back up,
etc. as you would other files.
By default, ebb saves new flows in ~/Documents/ebb. To keep them somewhere
else, set Flows folder in Settings > Editor. Files that ebb already
wrote stay where they are.
A new flow becomes a file the moment you create it, and ebb automatically saves all edits.
File menu
The desktop app has these items in its File menu:
| Item | Shortcut | What it does |
|---|---|---|
| New Flow | Opens the new flow menu. | |
| Open Flow... | Opens the file picker. | |
| Join Round... | Opens the join dialog for a code. | |
| Save | Mod+S | Writes the flow at once. |
| Save As... | Mod+Shift+S | Writes the flow to a path you select. |
| Show in Finder | Shows the file in your file manager. | |
| Close Flow | Saves the flow and closes it. |
Opening a flow
Double-click a .ebb file and it opens in ebb. On Windows and Linux, a second
launch goes to the window you already have and does not start a second copy of
ebb. When opening a flow that's already open in an ebb window, the app is
focused instead of opening a new copy.
Windows
Mod+N opens a new window. Mod+W closes the window that you are in, and ebb exits when you close the last window.
Flows from an earlier version
An earlier version of ebb kept your rounds in browser storage. The first launch after the update shows a question: move them into files, or not. The question gives the count and the target folder, and a Change button selects a different folder.
Not now leaves the rounds where they are, and the question returns at the next launch.
Start screen
ebb opens on a start screen with the following options:
- n new flow
- o open a flow
- j join a shared round with a code
- s settings
- 1 to 6 the six flows you were in last
- i the first invite, when a saved partner offers you a round
You can use the arrow keys to move through the list, and hit Enter to activate the currently selected item.
Mod+N opens a new window and Mod+O opens the file picker.
New flow
The new flow menu has the following options:
| Key | Event |
|---|---|
| p | Policy |
| l | Lincoln-Douglas |
| a | Public Forum, aff first |
| n | Public Forum, neg first |
| r | Parliamentary |
Each event opens with its own speech columns:
| Event | Aff or Gov columns | Neg or Opp columns | Cross-examination |
|---|---|---|---|
| Policy | 1AC, 2AC, 1AR, 2AR | 1NC, Block, 2NR | 1AC, 1NC, 2AC, 2NC |
| Lincoln-Douglas | 1AC, 1AR, 2AR | 1NC, 2NR | 1AC, 1NC |
| Public Forum | AC, AR, AS, AF | NC, NR, NS, NF | First, Second, Grand |
| Parliamentary | PM, MGC, PMR | LOC, Block | none |
A Block column represents two speeches that run back to back. In Policy it means the 2NC and the 1NR. In Parliamentary it means the MOC and the LOR.
Public Forum
The two Public Forum rows in the new flow menu set which side speaks first. The Swap speaking order command changes the order at any time.
Grid navigation
Each flow sheet is a grid, and you flow arguments into 'cells' that you can operate on.
Select a cell and type to flow an argument. When you commit an edit, the cursor moves down one row (Enter), or right one column (Tab).
That lets you flow a speech straight down, or shadow flow the responses to it.
The cell editor leaves what you type alone. Autocorrect, autocapitalization, autocomplete, and the spellchecker are all off in it, so debate shorthand stays as you wrote it and no red underline sits below a round's vocabulary.
The Speech dropdown in the ribbon moves your cursor to the top of whatever row you select across all sheets. That lets you quickly set yourself up to flow whatever speech is about to be given.
You can search for the text in each cell with the search palette (Mod+P).
Speech names
The command palette and cell search match a speech by the abbreviation its
column header shows. Thus ns finds the Neg Summary, and mgc finds the Member
of the Government Constructive. The two speeches inside a Block match it too:
2nc and 1nr in Policy, moc and lor in Parliamentary.
Parliamentary speeches also match the Policy-style numbers that some debaters
use for them. Thus 1ac finds the Prime Minister, 2ac the MGC, 1nc the LOC,
and 1ar the PMR. The opening speech also matches pmc, the Constructive name
that some circuits give it.
ebb displays none of these other names. The column header and the palette read the one name that the speech goes by.
Grid operations
ebb lets you operate on the grid as you like, for dynamic flowing that matches the flexibility of paper.
To make space for an argument, you can use the following commands:
- Insert cell (Mod+O): inserts a blank cell above the cell your cursor is currently on.
- Insert cell below (Mod+Alt+O): inserts a blank cell below the cell your cursor is currently on.
- Insert row (Mod+Shift+O): inserts a full blank row above the row your cursor is currently on.
- Insert row below : inserts a full blank row below the row your cursor is currently on.
A right-click on a cell opens Insert row above, Insert row below, and Remove row. A cell that came in from CardMirror also shows Jump to source below those items. The menu acts on the cell you clicked, which in split view can sit in the pane that does not hold the cursor.
Move mode
ebb has a 'move' mode, inspired by Vim's visual select. Select an arbitrary group of cells and push Mod+Shift+M to enter it.
In move mode, your arrow keys (Up and Down) move the selected group of cells. Push Enter to commit the movement, or
Esc to cancel it.
Zoom
There are four ways to zoom the grid:
- The slider in the ribbon.
- The zoom value in the text field next to the slider.
- Mod+Scroll Wheel, when Scroll to zoom is on.
- The zoom commands in the palette.
Formatting
ebb has these ways to format cells and to help you organize a flow. You can format one cell or a selected range, and you can combine the formats.
- Bold: (Mod+B).
- Highlight: (Mod+Shift+H).
- Card: (Mod+T) adds a border to the bottom of the cells. The search palette (Mod+P) shows which cells are cards.
- Group: (Mod+G) draws a bar down the left of a run of cells.
- Kicked: (Mod+K) draws a slash from corner to corner across the
cells, for an argument that is out of the round. The slash sits behind the
text, so a cell that you go back to in the 2AR is still readable. It prints,
and an Excel export writes it as a diagonal border. The command also answers
to
strikethroughin the palette.
Sheets & sides
Each sheet in ebb is equivalent to a page of paper. A new sheet for each off-case position works best, and one for each advantage or aff page. You can create a new aff sheet with
Mod+Shift+A, or a new neg sheet with Mod+Shift+N. In Parliamentary the same two commands add Gov and Opp sheets.
ebb colors the sheets by side, and you can change the two colors in the config. Mod+\ shows or hides the sidebar.
To move between sheets, push Mod+] (next) and Mod+[ (previous), or jump straight to a sheet by position with Mod+1 through Mod+9.
The two step commands carry the platform modifier, so they work while a cell editor is open. A bare bracket is text to that editor. The cell that you were part-way through stays on the sheet that you left, with the text that you typed into it.
Rename the current sheet with Mod+R.
Policy, Lincoln-Douglas, and Public Forum rounds have a pinned cross-examination sheet. It has one question and response column pair for each cross-examination or crossfire period. It is always first, and the sheet-jump, next, and previous commands do not go to it. Parliamentary rounds have no such sheet.
Sheet order
Drag a sheet in the sidebar to move it, or push Mod+{ and
Mod+} (the shifted brackets) to move your current sheet one slot up or down. Move sheet up and Move sheet down are in the command palette and the View menu beside Next Sheet and Previous Sheet.
To move several sheets at once, select a range of them first:
- Shift+click a sidebar row paints the range from the sheet you are on to the row you clicked.
- Alt+[ and Alt+] extend the selected range.
The move chords then slide the whole block, and dragging any row of the range drags all of it.
Align speeches
Visually align speeches in Settings > Display is off by default. On, each flow sheet aligns on the speaking order of the round.
A sheet gets gray columns for any speeches that it skips (e.g. the 1AC for neg sheets). That ensures the cursor is visually aligned when swapping sheets.
Split view
Split view (Alt+\) puts two sheets side by side, for example a DA next to case. When you select a sheet in the sidebar or the palette, it replaces the sheet in the focused pane. Alt+H and Alt+L move focus between the panes.
Round info
Round info holds the information about the round, and ebb keeps it in the flow file. Open it with Open round info from the palette, or with the Info button in the ribbon.
To fill the fields automatically, paste a pairing blast from Tabroom into the paste box.
RFD editor
Toggle RFD (Mod+J) opens a Markdown scratchpad where you can type notes for the decision rendered in a round.
When a line starts with a >, ebb shows suggestions from all cells in the flow.
Your RFD then carries the exact words that the debaters used.
The Preview tab renders the Markdown. Vim keybindings in Settings > Display sets vim keys on for this editor.
A link in the preview reads as its text and does not open. Thus nobody can put a page in front of your round with a link in a note.
Export and print
Export in the ribbon writes an Excel workbook, a .xlsx file with each
sheet, its cell styling, and Info and RFD worksheets. Use it to share a flow, or
to read one outside of ebb. The name of the file is the date of the export, for
example debate-flow-20260725.xlsx.
There is no JSON export, because a .ebb file already is the round's JSON.
Save As writes one wherever you want it.
ebb draws a print version of each sheet and of the RFD. Use the print command of your system to get it.
Shared editing
Two debaters can flow one round together. Each cell that one of you writes goes
to the other. Cells can only be written into by one person at a time. Each of
you keeps a .ebb file on your machine, and you keep the round if a laptop or
the network fails.
Shared editing is off by default; it is in the desktop app only, and can be enabled through Settings > Collaboration.
Starting a session
The share controls are in the sidebar, next to the session corner, and not in Settings. When a flow is open, the Invite button opens a short menu. The menu has the two methods to share a round:
| Group | Item | What it does |
|---|---|---|
| Saved partner | Invite to edit | Sends an invitation to a contact who can write to it. |
| Saved partner | Invite to view | Sends an invitation to a contact who can look at it. |
| Generate a code | Code to edit | Shows a code for a partner who writes to the round. |
| Generate a code | Code to view | Shows a code for a viewer who looks at the round. |
Codes
An ebb share code has eight characters, for example K7QM-3XPV. Your partner
can enter this code in the Join screen. Codes are single-use.
What a partner can do
You select edit or view in the menu before ebb opens the contact picker. The dialog then shows Invite a partner to edit or Invite a partner to view. A view-only partner sees each edit but cannot write to the round.
Contacts
After a session, you can add that partner to Contacts. To invite them again, you can select Invite to edit or Invite to view, then select the partner. A pill with the text Invited then shows in the corner of their screen. The pill expands into a row for the round, with a Join button and a Dismiss button.
You can also add a partner before your first round together. Settings > Collaboration shows Your ID, with a Copy button next to it. Send that ID to a partner, and they can add you in Contacts with the ID and a name.
Listen for invites
Listen for invites is is off by default. When the switch is on, ebb holds an endpoint open until you close the app. A saved partner can then send you a round while you have no round open. When the switch is off, that partner must show you a code.
A round keeps a record of the partners that you shared it with. When you open the file again, ebb connects to them with no new code. That connection requires Listen for invites to be on.
Allow relay
Allow relay is on by default. When the switch is off, a session uses only a connection between the two machines. When the switch is on, a session can also connect across networks through a relay if no connection between the two machines is available.
Show viewer cursors
Show viewer cursors is on by default. It identifies the cell that a view-only partner looks at. When the switch is off, the grid identifies only the cells that a person edits.
The session chip
The session chip is in the bottom left corner while a session operates. It shows the condition of the connection and the number of partners. Click the chip to see who is in the round. Each row shows the name of the partner, whether they're an editor or viewer, the type of the connection, and a Disconnect button. An End session button is at the bottom of the panel, and End shared session in the palette does the same.
Leaving a session
When you close the window or stop ebb, ebb writes the flow, sends a message to each partner, and then exits. Your partners see this immediately. They do not wait for the connection to stop, and no machine connects to you again.
CardMirror integration
ebb provides a CardMirror plugin that connects the two apps together. Set plugins on in CardMirror, then install the CardMirror ebb plugin. The plugin shows in CardMirror after you start it again.
You can access the settings in Settings > Editor in the CardMirror section.
Sending text
The plugin sends text in the two directions.
In CardMirror, the Send to Flow command (default Mod+Alt+F) sends the selected text to the location of your cursor in ebb. By default that text is the text below your current header, without the card body.
By default, each 'tag' goes into a new cell, but you can change that behavior and send all the selected text into a single cell.
A send can also leave empty cells below itself. Two sends in a row then read as separate cards and not as one continuous run. The count is a setting of the ebb plugin inside CardMirror, in its gear in Settings > Plugins there, and it travels with each send. A send that names no count leaves no empty cells.
In ebb, Send to CardMirror (Mod+Shift+E) sends a selection of cells to the document that CardMirror has open.
Send to CardMirror as in Settings > Editor picks the style that CardMirror applies to that text: Analytic, Tag, Block, Hat, Pocket, or Body. The default is Analytic.
Permission
CardMirror can ask your permission before a different app writes into a document, and ebb identifies itself so that the question names it. ebb keeps your answer: allow ebb one time, allow it always, or deny it. You can change your mind later in External apps in CardMirror's settings.
Provenance
Text that comes from CardMirror keeps a record of where it came from. A teal rail along the left side of the cell shows that record. With your selection on linked cells, Jump to source in CardMirror (Mod+E) tells CardMirror to go to the card that those cells came from.