ebb

Commands & keys

Every command, its id and default shortcut, the fixed grid keys, and what each feature does.

Every feature is a command. The command palette (Cmd+Shift+P) runs any of them by name - a leading > forces command mode. Most commands have a default shortcut; rebind any of them from the config.

Shortcuts below are shown for macOS. On Windows/Linux, Cmd becomes Ctrl; Shift and Alt are the same on every platform. _unbound_ means the command ships with no default shortcut but still runs from the palette.

Editing

CommandCommand idDefaultWhat it does
Undoedit.undoCmd+ZStep back through editing history - reaches the whole session.
Redoedit.redoCmd+Shift+ZStep forward again.
Insert cellcell.insertCmd+ODrop a blank cell at the selection, shifting only that column down.
Insert row aboverow.insertAboveCmd+Shift+OAdd a blank row above the selection.
Insert row belowrow.insertBelowunboundAdd a blank row below the selection.
Delete rowrow.deleteCmd+DeleteRemove the current row.

Formatting

Decorations toggle over the whole current selection, so you can mark a range at once. They combine freely.

CommandCommand idDefaultWhat it does
Toggle boldformat.toggleBoldCmd+BBold a claim.
Toggle highlightformat.toggleHighlightCmd+Shift+HHighlight what matters.
Toggle cardformat.toggleCardCmd+TTag the cell as evidence. Card tags surface in cell search.
Toggle groupformat.toggleGroupCmd+GDraw a bar down the left of a run to bracket answers under one argument.

Sheets

CommandCommand idDefaultWhat it does
New aff sheetsheet.newAffCmd+Shift+AStart a fresh aff sheet.
New neg sheetsheet.newNegCmd+Shift+NStart a fresh neg sheet.
Next sheetsheet.next]Step to the next sheet (skips CX).
Previous sheetsheet.prev[Step to the previous sheet (skips CX).
Jump to sheet 1-9sheet.jump1-jump9Cmd+1 to Cmd+9Jump straight to a sheet by position (skips CX).
Rename active sheetsheet.renameCmd+RRename the current sheet.
Search cellssheet.quickSwitchCmd+PFuzzy-search every filled cell; running a result jumps the cursor.

Split view

Lays two sheets side by side - for example, a DA next to case. Picking a sheet in the sidebar or palette retargets whichever pane has focus.

CommandCommand idDefaultWhat it does
Toggle split viewsplit.toggleAlt+\Turn the second pane on or off.
Focus left panesplit.focusLeftCmd+HMove focus to the left pane.
Focus right panesplit.focusRightCmd+LMove focus to the right pane.

Panels

CommandCommand idDefaultWhat it does
Command palettepalette.openCmd+Shift+PRun any command by name (> forces command mode).
Open settingssettings.openCmd+,Open Settings.
Open round infoinfo.openunboundOpen the round-info panel.
Toggle RFDrfd.toggleCmd+JOpen or close the RFD drawer.
Toggle sidebarsidebar.toggleCmd+\Show or hide the sidebar.
Keyboard shortcutshelp.open?Open the in-app shortcut reference.

Theme

CommandCommand idDefaultWhat it does
Theme: Lighttheme.lightunboundSwitch to the light theme.
Theme: Darktheme.darkunboundSwitch to the dark theme.
Theme: Systemtheme.systemunboundFollow the system theme.

Grid keys

A handful of keys are owned by the grid itself. They are fixed - not rebindable commands.

KeyAction
EnterNext row / commit edit
Alt+EnterNew line in cell
TabCommit and move right
EscCancel edit
F2Edit cell
DeleteClear cell
ArrowsMove selection
Cmd/Ctrl+ArrowsJump to data edge

Features

The grid

Each sheet is a grid whose columns are speeches, in this order:

1AC | 1NC | 2AC | Block | 1AR | 2NR | 2AR

Select a cell and type to flow an argument. Committing an edit either drops down one row or moves one column right, so you can flow a speech straight down or step across speeches without leaving the keyboard. The Speech control in the header jumps every sheet to the same speech at once, so you can read one speech straight across your whole flow.

Sheets & sides

A sheet is one flow - one off-case position, the case, a kritik. Aff sheets and neg sheets are colored by side; recolor either from the config. Reorder sheets by dragging in the sidebar.

Every round carries a pinned CX sheet for cross-examination, with a question/response column pair for each CX period. It always sorts first and is skipped by the sheet-jump and next/previous commands.

Round info

Open round info records the round's metadata for scouting later: aff/neg schools, debaters (1A/2A, 1N/2N), tournament, round, date, and judge. Team codes derive automatically. Set the decision to Aff or Neg; click the chosen side again to clear it back to undecided. Paste a Tabroom pairing into the paste box to autofill the fields - if the sheet already holds details, ebb asks before replacing them, and a pasted aff never wipes an existing neg.

RFD editor

Toggle RFD opens a Markdown reason-for-decision drawer along the bottom edge, with the flow still visible above; drag its top handle to resize. On a > blockquote line, start typing and pick a suggestion to drop the exact wording of any cell into your reasoning - suggestions are colored aff or neg to match the grid. Toggle Preview to render the Markdown. A vim keybindings option for the editor lives in the config.

Dashboard, export & import

The Dashboard lists every flow on this device. Search by text; sort by last edited, date, tournament, or result; optionally group by tournament. A per-flow menu opens details. Export a flow as:

  • JSON - a full, re-importable ebb file. Lossless, so exporting and re-importing round-trips a flow exactly. Use it to back up or move a flow.
  • Excel - a .xlsx workbook, for sharing or reading outside ebb.

Import controls live in the Dashboard header.

Data & privacy

Everything lives in this browser or app and autosaves as you type. There is no telemetry and no network call for your data - the only place your rounds exist is your own machine. Deleting a flow moves it to Trash, where you can restore it, delete it permanently, or empty trash to clear all trashed flows at once.

On this page