Open Terminal Panel

approved

by aione314159

A real terminal below the editor: several shells in tabs, each with a real TTY, plus one-click cd to your vault or to the folder of the note you are editing. - This plugin has not been manually reviewed by Obsidian staff.

142 downloadsUpdated 23d agoMIT

English · 繁體中文 · 日本語 · 한국어

Open Terminal Panel — your shell, below the editor

Open Terminal Panel

An Obsidian plugin that docks a real terminal below the editor — several shells in tabs, each with its own TTY. Desktop only.

release downloads Obsidian 1.8.7+ Desktop only Prebuilt for Apple silicon and Intel License MIT

A real terminal inside Obsidian. It opens as a panel below the editor — where a terminal belongs in an editor window — and keeps several shells in tabs.

📥 Download · 💡 What it does · ⚙️ Settings · 🖥️ Real TTY · 🐞 Report an issue


Not a fake shell: every tab gets a real TTY, so vim, htop, git rebase -i, a dev server and colored output all behave the way they do in your terminal app.

Desktop only. The plugin drives a native pty and cannot run on mobile.

The terminal panel, below the editor

What it does

  • Opens below the editor, and comes back on the next start if you left it open. Its height is a share of the editor area that you set once; the divider stays draggable.
  • Tabs. Each tab is its own shell. Closing one kills that shell and nothing else, and a shell that exits keeps its output so you can still read what happened.
  • Jump to a folder. One button types cd to the vault, another to the folder of the note you are editing. Paths are quoted, so a folder named $(id) is typed, not executed.
  • Its own palette. Light or dark, deliberately independent of the Obsidian theme: the 16 ANSI colors need a fixed contrast baseline to stay readable.
  • Six interface languages, following Obsidian by default.

Install

From the community store

Install and enable Open Terminal Panel, then open the panel. The first time, it asks to download one more piece: node-pty, the native module that provides the TTY.

The store only ever installs main.js, manifest.json and styles.css, so a native binary cannot travel with a plugin. Instead the panel shows the exact URL — an asset on this repository's own release, matching the plugin version and your platform — and waits for you to press the button. Nothing is downloaded in the background, and the archive is unpacked only into the plugin's own folder. The SHA-256 of what was downloaded is printed after the install, and the same checksum is published next to the release as node-pty-<platform>.tar.gz.sha256.txt.

To do it yourself instead, unpack that archive into <vault>/.obsidian/plugins/open-terminal-panel/.

Prebuilt components are published for macOS on Apple silicon and Intel — those are the builds this project can produce and verify. On Windows or Linux the panel says so and you install from source instead, which builds node-pty on the machine itself.

From source

git clone https://github.com/aione314159/open-terminal.git
cd open-terminal
./cli/install_obsidian_plugin.sh            # first vault found in obsidian.json
./cli/install_obsidian_plugin.sh /path/to/vault

This builds the bundle, copies it into the vault, and installs node-pty from your own npm install — so the download step never appears. Then reload community plugins in Obsidian and enable Open Terminal Panel.

Use

WhereWhat
Ribbon iconOpen the panel
Command paletteOpen / toggle the panel, new tab
+ in the tab stripNew tab in the configured working folder
Middle click a tabClose it
Header buttonscd to vault · cd to the note's folder · clear · restart · light/dark

A tab whose shell has exited keeps its output, struck through in the tab strip. Press restart to get a live shell back in the same folder.

Settings

SettingDefaultNotes
Working foldervault folderWhere new tabs start. ~ is expanded. A folder that no longer exists falls back to the vault.
Shell path$SHELLStarted as a login shell, so PATH and your profile are complete — Obsidian is launched from the GUI and inherits almost nothing.
Always open on startupoffOpens the panel on every start. Off, the panel follows the saved workspace: it comes back only if it was open when you quit.
Panel height30 %Share of the editor area.
PalettedarkTerminal only; does not follow the Obsidian theme.
Font size12 pxApplies to every tab.
Interface languagefollow ObsidianEnglish and 繁體中文 are reviewed; 日本語, 한국어, Deutsch, Français are community translations.

"Test the setup" in the settings tab checks the shell path, the working folder and whether the native component is installed.

How it works

main.ts      plugin, settings tab, panel placement below the editor
view.ts      the panel: tab strip, header actions, one visible session
session.ts   one shell — an xterm instance bound to a pty
runtime.ts   first-run download and unpack of the native component
pty.ts       loads node-pty from the plugin folder by absolute path
theme.ts     the two 16-color palettes
i18n.ts      string lookup; tables live in src/locales/

node-pty is native and cannot be bundled by esbuild, nor is it on Obsidian's module resolution path — hence loading it by absolute path out of the plugin folder, and hence the first-run download that puts it there.

Placing the panel uses createLeafBySplit on the most recent leaf of the root split, so it lands under the editor rather than inside a sidebar. Its height is set through setDimension on the leaf's tab container — and on every sibling, because a container left unsized is treated as "as small as possible" and the terminal would take the whole area. setDimension is not public API; if a future Obsidian release drops it, the panel simply opens at the default split height and stays usable.

Development

npm install
npm run dev      # esbuild watch
npm run build    # tsc --noEmit + production bundle

./cli/pack_pty_runtime.sh          # build the node-pty archive for this platform
node cli/test_unpack.mjs           # unpack it with the plugin's own reader and verify
node cli/build_hero.mjs            # regenerate docs/images/hero.<lang>.png

Adding a language means one file in src/locales/ and one line in its index.ts. src/locales/zh.ts is the source of truth for the key set — the build fails if any other table is missing a key.

Releasing: tag the commit with the version in manifest.json, attach main.js, manifest.json, styles.css and the node-pty-<platform>.tar.gz archives with their .sha256.txt files.

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.