Terminal Tabs

approvedunreviewed

by krzysztofkut

Open an integrated terminal with tabs in your vault.

↓ 5 downloadsUpdated todayMIT

Terminal Tabs

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).

Terminal Tabs: a note above, terminal tabs below

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.

Features

  • Every terminal is a regular Obsidian tab, titled 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.
  • Toggle terminal opens the first terminal at the bottom, below the editor; further ones open as tabs next to it.
  • Shell profiles — zsh, bash, fish, PowerShell, Git Bash, WSL… are detected automatically; add your own for any command, e.g. Claude Code.
  • Starts in the vault folder, the active file's folder or a custom one. In the file explorer: right-click → Open in Terminal.
  • A real PTY: vim, htop, less, git log, 24-bit colour, resizing, Ctrl+C.
  • Clickable note paths — in the output of ls, grep -n, git status…, Cmd/Ctrl+click opens the file in Obsidian. Web links too.
  • Search the buffer, copy on select, drag files from the file explorer or Finder to paste their paths.
  • Run selected text in terminal sends the selection (or the current line) from a note to the shell.
  • Rename, duplicate, restart and clear tabs from the tab's context menu. Tabs with their names and folders come back after restarting Obsidian.
  • Colours follow the Obsidian theme (or a fixed Dark / Light).
  • UI in English, Chinese (Simplified and Traditional), French, German, Italian, Japanese, Korean, Polish, Portuguese (Brazil), Russian, Spanish, Turkish and Ukrainian, following Obsidian's language. Translation fixes are welcome: each language is one file in src/locales/.

Requirements

Terminal Tabs uses Python 3 to create the pseudo-terminal (see How it works):

  • macOS / Linux – the system python3 is enough (on macOS: xcode-select --install or Homebrew).
  • Windows – Python 3 and 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.

Installation

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.

Shell profiles

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….

Example: Claude Code

To open Claude Code in your vault with one click, add a profile:

NameCommandArguments
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.

Settings

GroupWhat you can change
ShellDefault profile, shell profiles, Python executable, extra environment variables
BehaviourWhere 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)
AppearanceColour scheme (follow Obsidian, Dark, Light), font family and size, line height, cursor style and blinking, view header, scrollback lines

Hotkeys

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:

ActionmacOSWindows / Linux
Back to the editor⌥F12Alt+F12
New terminal tab (next to the current one)⌘TCtrl+Shift+T
Close tab⌘WCtrl+Shift+W, Ctrl+F4
Next / previous tab⌘⇧] / ⌘⇧[, Ctrl+TabCtrl+Tab / Ctrl+Shift+Tab, Ctrl+PgDn / PgUp
Tab 1–9⌘1…⌘9–
Rename tab⇧F6Shift+F6
Copy / paste⌘C / ⌘VCtrl+Shift+C / Ctrl+Shift+V (Ctrl+C copies when there is a selection)
Find⌘FCtrl+Shift+F
Clear⌘KClear 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.

Privacy and system access

  • No network, no telemetry, no accounts. The plugin never connects anywhere and installs or downloads nothing. Tools you run in the terminal (e.g. Claude Code) have their own network access and accounts.
  • Files outside the vault. The terminal runs your own shell with your user's permissions, so it can read and change any file you can, not only the vault. That is the purpose of a terminal.
  • Programs it starts: Python 3 (the PTY bridge), the shell or command from your profile, and pgrep plus lsof (macOS) to read the shell's current folder.
  • Files it writes: its settings (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.
  • Environment: shells get Obsidian's environment plus TERM, COLORTERM, TERM_PROGRAM=terminal-tabs, OBSIDIAN_VAULT (the vault path) and the variables you add in the settings.

How it works

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.

Known limitations

  • Obsidian popout windows have not been tested.
  • Clickable paths work for files inside the vault and paths without spaces.
  • On Windows the shell's current folder is not tracked (unless the shell sends OSC 7), so Duplicate tab and restoring use the start folder.

Development

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

License

MIT

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.