krzysztofkut5 downloadsOpen an integrated terminal with tabs in your vault.
A terminal built into Obsidian, started in your vault folder, with many tabs at once. Run your shell — or a tool such as Claude Code — right next to your notes.
Desktop only (macOS, Linux, Windows).

Private by design. Terminal Tabs has no network access, no telemetry, no accounts and no ads. It collects nothing and sends nothing anywhere; everything runs locally on your computer. Details: Privacy and system access.
Local, Local (2)… Open a new tab (+ or ⌘T / Ctrl+T) and choose Open terminal, then drag it anywhere: next to a note, into a split or a sidebar. Tabs can be split and pinned like any other.vim, htop, less, git log, 24-bit colour, resizing, Ctrl+C.ls, grep -n, git status…, Cmd/Ctrl+click opens the file in Obsidian. Web links too.src/locales/.Terminal Tabs uses Python 3 to create the pseudo-terminal (see How it works):
python3 is enough (on macOS: xcode-select --install or Homebrew).python -m pip install pywinpty.If Python is not on your PATH, set it in the plugin settings; the Check button shows what was found.
From Obsidian: Settings → Community plugins → Browse, search for Terminal Tabs, install and enable it.
Manually: download main.js, manifest.json and styles.css from the latest release into <vault>/.obsidian/plugins/terminal-tabs/, then enable Terminal Tabs in Settings → Community plugins.
Settings → Terminal Tabs → Shell profiles lists the shells found on your system. Each profile is a command with arguments, so it can start any program, not only a shell. The default profile is used by Toggle terminal and Open terminal; the others are available from the tab menu, the empty New tab page and New terminal tab with profile….
To open Claude Code in your vault with one click, add a profile:
| Name | Command | Arguments |
|---|---|---|
| Claude | /bin/zsh |
-l -c claude |
The login shell (-l) loads your PATH, so claude is found; if it isn't, use -l -i -c claude to load ~/.zshrc too. To get back to a shell after Claude exits, use -l -c "claude; exec zsh -l". On Windows: command powershell.exe, arguments -NoLogo -NoExit -Command claude.
Make it the default profile and the terminal opens straight into Claude Code. The same works for any other CLI tool.
| Group | What you can change |
|---|---|
| Shell | Default profile, shell profiles, Python executable, extra environment variables |
| Behaviour | Where the first terminal opens (bottom, right sidebar, new tab), start folder (vault root, active file's folder, custom), close the tab when the shell exits, copy on select, terminal takes over Obsidian hotkeys, clickable vault file paths, Option as Meta (macOS) |
| Appearance | Colour scheme (follow Obsidian, Dark, Light), font family and size, line height, cursor style and blinking, view header, scrollback lines |
The plugin sets no Obsidian hotkeys. Assign one to Terminal Tabs: Toggle terminal in Settings → Hotkeys, e.g. Alt+F12. Without a hotkey, open a new tab and choose Open terminal, or use the command palette.
Inside the terminal:
| Action | macOS | Windows / Linux |
|---|---|---|
| Back to the editor | ⌥F12 | Alt+F12 |
| New terminal tab (next to the current one) | ⌘T | Ctrl+Shift+T |
| Close tab | ⌘W | Ctrl+Shift+W, Ctrl+F4 |
| Next / previous tab | ⌘⇧] / ⌘⇧[, Ctrl+Tab | Ctrl+Tab / Ctrl+Shift+Tab, Ctrl+PgDn / PgUp |
| Tab 1–9 | ⌘1…⌘9 | – |
| Rename tab | ⇧F6 | Shift+F6 |
| Copy / paste | ⌘C / ⌘V | Ctrl+Shift+C / Ctrl+Shift+V (Ctrl+C copies when there is a selection) |
| Find | ⌘F | Ctrl+Shift+F |
| Clear | ⌘K | Clear terminal command |
While the terminal is focused, Obsidian hotkeys are disabled so they don't take keys from the shell (Ctrl+P, Ctrl+W, Esc…). On macOS ⌘P, ⌘O and ⌘, still work. This can be turned off in the settings.
pgrep plus lsof (macOS) to read the shell's current folder.data.json) and the bridge script pty_helper.py, both in its own plugin folder. Open tabs are saved in Obsidian's workspace like any other tab.TERM, COLORTERM, TERM_PROGRAM=terminal-tabs, OBSIDIAN_VAULT (the vault path) and the variables you add in the settings.Obsidian's native node-pty module would have to be compiled for the Electron version of every Obsidian release. Instead, the plugin runs a small Python bridge (src/pty_helper.py, standard library only; pywinpty on Windows) that creates a pseudo-terminal and passes bytes between the shell and xterm.js. The bridge is embedded in main.js, so installing needs only the standard three files.
On macOS and Linux shells start as a login shell (-l), so PATH from ~/.zprofile works even when Obsidian was launched from the Dock.
npm install
npm run build # typecheck + main.js + styles.css
npm run install-plugin -- "/path/to/vault" # copies into .obsidian/plugins/terminal-tabs
OUT_DIR="/path/to/vault/.obsidian/plugins/terminal-tabs" npm run dev # watch mode
npm test # PTY bridge + translations
npm run test:e2e # main.js in Electron with a mocked Obsidian API
MIT