ibidem / docs

Documentation

A snappy, native git GUI - GPU-rendered, configured in Lua. One window, a tab per repo: the history as a commit graph, the working tree with its diffs, and the everyday actions a click away. This page walks through the window and lists every init.lua option, keybinding and theme colour.

01Install & first launch

Download the installer from the home page and run it. Windows is available now; macOS and Linux are on the way.

On first launch the window asks you to open a folder - pick a repo with Ctrl+O or the + in the title bar and it opens in a tab. ibidem is single-instance: launching it again with a folder opens that repo in a tab of the running window and raises it. The window's position and size, your open tabs, column widths and sidebar layout are all remembered for next launch.

The window idles at 0% CPU and wakes on input. All git work runs on a background thread and reports back, so nothing ever holds up the UI.

Git - ibidem drives the git already installed on your system. Outside a repo, or with no git on your PATH, the window says so rather than failing.

02The title bar & tabs

The title bar: a tab per open repo, the + button, the logo and the window controls.
A tab per open repo, named for its folder; + opens another. On the right, the logo opens the config editor, then minimize / maximize / close.

Drag the empty title bar to move the window, and any edge to resize it.

03History

ibidem's History view: every commit with its branch graph.
Every commit as a row, with the branch topology drawn as a graph down the left. Lanes are coloured per branch and the HEAD commit is marked with a dot.

Columns (graph, description, date, author) drag to resize. Double-click a commit to check it out - its branch if exactly one points at it, otherwise the commit itself. git_history_all_branches = false narrows the view to the current branch.

04File Status & committing

ibidem's File Status view: staged and unstaged changes beside the diff.
Staged above unstaged, with the diff of the selected file beside them. Push after commit and Amend last commit sit by the Commit button.

05The toolbar & merging

The toolbar: Commit, Fetch, Pull, Push, Branch, Merge, Stash, Discard, Tag.
Commit, Fetch, Pull, Push, Branch, Merge, Stash, Discard, Tag - with badges for changed files and commits behind / ahead.

Commit takes you to File Status; the rest do what they say. The running action and any message from git show at the toolbar's right.

Merge

Merge opens a picker - the same history view in a modal - so you pick the commit to merge by selecting its row, or walking it with / . Commit merge immediately (if no conflicts) does the obvious thing; on conflict the window takes you to File Status to resolve them.

The Merge picker: the history in a modal with a commit selected.
The Merge picker.

07Configuration & init.lua

Click the logo in the title bar to open your init.lua in the config editor - it's created from a template on first open. It's a small window with line numbers and Lua syntax highlighting, and nothing else. Ctrl+S saves and applies it immediately: theme, font and keybinds update in real time, and the strip along the bottom says so, or shows the Lua error if it didn't load. Closing it with unsaved changes asks first.

The config editor window with init.lua open.
The config editor.

Editing the file in another program works too: ibidem notices it being saved and applies it the same way. It lives at <config-dir>/ibidem/init.lua:

OSPath
Windows%APPDATA%\ibidem\init.lua
Linux~/.config/ibidem/init.lua
macOS~/Library/Application Support/ibidem/init.lua

The script returns a table; everything in it is optional. A bad config is reported and falls back to defaults - it won't stop the app starting. A minimal example:

-- ibidem - your config. Ctrl+S saves it and applies it immediately.
return {
  theme = "eink",   -- eink, space, forest, deep_ocean, mars, or your own
  git_history_all_branches = true,
  restore_tabs = true,

  -- ui_font = "Cascadia Code",  -- default is the bundled JetBrains Mono

  keys = {
    open_folder = "ctrl+o",
  },
}

Your config dir is on Lua's package.path and config_dir holds the path, so you can split things across files:

theme = require("mytheme")            -- <config>/mytheme.lua
local keys = dofile(config_dir .. "/keys.lua")

08All config options

Every top-level key you can put in the returned table. Leave one out to get its default.

OptionDefaultWhat it does
theme"eink"a bundled name, a table, or require("yours")
ui_fontJetBrains Monothe font, by family name
cursor_blinktruefalse = solid caret
cursor_blink_ms530blink half-period
git_history_all_branchestruefalse = current branch only
tab_bar_width180width of each repo tab, px
tab_bar_height30height of the title bar the tabs sit in, px
tab_reordertruedrag tabs to reorder
animationstruetabs slide into place
restore_tabstruereopen last session's tabs at launch
keyssee belowremap command chords

09Keybindings

Every command, with its default chord. Override any subset in keys = { ... }; the rest keep theirs.

keys = {
  open_folder = "ctrl+o",  close_tab = "ctrl+w",
  select_all = "ctrl+a",   copy = "ctrl+c",
  cut = "ctrl+x",          paste = "ctrl+v",
  save = "ctrl+s",         -- the config editor
  undo = "ctrl+z",         redo = "ctrl+y",  -- ctrl+shift+z also redoes
}

Everything else

KeyAction
Ctrl+Oopen a folder in a new tab
Ctrl+Wclose the tab
Ctrl+Tab / Ctrl+Shift+Tabnext / previous tab
Ctrl+Ssave and apply (config editor)
Ctrl+Z / Ctrl+Y (or Ctrl+Shift+Z)undo / redo (config editor)
Ctrl+Entercommit (in the message box)
Ctrl+A / C / X / Vselect all / copy / cut / paste in a text box; Ctrl+A in File Status selects the pane
Enter / Escconfirm / cancel a dialog (Esc also closes a menu)
/ walk the Merge picker
double-clickcheck out a commit or branch, apply a stash, open a submodule
middle-click a tabclose it
macOS - in a chord, cmd is accepted as a synonym for ctrl.

10Themes

Bundled: eink (soft charcoal-on-paper, the default), plus the dark space, forest, deep_ocean and mars. Pick one by name, or write your own. A theme is a table - base picks a bundled theme to start from, and you override only what you want; the rest is inherited. Colours are #rrggbb or #rgb.

theme = {
  name = "midnight",
  base = "space",
  bg = "#0f1115",
  fg = "#d6d9df",
}

Put your theme in a .lua file next to init.lua and load it with theme = require("mytheme"). Every field:

FieldControls
bg fg sel dim panelbase surfaces and text
border border_widthwindow border; width 0 hides it
cur_linethe config editor's current-line background
keyword function type string comment numberthe config editor's syntax colours
head_dot git_badgeHEAD marker, toolbar count badges
diff_add diff_removed diff_hunkthe File Status diff
conflictconflicted files during a merge
graph_colorscommit-graph lane palette (cycled)
graph_lane_width graph_line_width graph_node_scalegraph geometry

function is a Lua keyword, so write it as ["function"] = "#7fd6c2". The full example config has a complete theme with every field filled in.