Integrate consoles, shells, and terminals inside Obsidian.
Repository · Changelog · Community plugin · Related · Features · Installation · Usage · Contributing · Security

For first time users, read the installation section first!
This file is automatically opened on first install. You can reopen it in settings or command palette.
terminal under .obsidian/plugins of your vault.manifest.json, main.js, and styles.css from the latest release into the directory.python -m pip install --upgrade "psutil>=5.9.5" "pywinctl>=0.0.50" "typing_extensions>=4.7.1" if your profile uses python. python, python3, and py -3, using the first working interpreter. Stored profile values stay unchanged. An empty profile Python field no longer disables Python on Windows; the ConHost resizer runs whenever a usable Python with its packages is found, and there is no setting to turn it off. If ConPTY is selected but no usable Python is found, its ConPTY host cannot be confirmed, or the host already failed with this Python configuration, that terminal opens with ConHost. If the ConPTY host fails while a terminal starts, that terminal shows an error and later terminals open with ConHost. The saved backend stays ConPTY; after installing or repairing Python, select "Recheck Python" in the plugin settings (or restart Obsidian) to retry ConPTY. On other platforms, configure the Python executable per profile and press the "Check" button to validate it.Open terminal ribbon.Ctrl+P or click on the Open command palette ribbon next to the left window border.Ctrl to edit the profile before use. The item (Temporary profile) starts a terminal with a temporary profile.More optionsThe keyboard shortcuts can be customized in hotkeys settings.
Ctrl+Shift+`When a terminal is focused, other keyboard shortcuts (including Obsidian and plugin hotkeys) are disabled. Only the following keyboard shortcuts work. Thus you can ignore Obsidian complaining about conflicting keys for the following keyboard shortcuts.
This behavior can be turned off via the Intercept keys when terminal is focused setting; when disabled, Obsidian hotkeys keep working while the terminal has focus.
Ctrl+Shift+K, Command+Shift+K (Apple)Ctrl+Shift+W, Command+Shift+W (Apple)Ctrl+Shift+F, Command+Shift+F (Apple)Ctrl+Shift+` (same as above)Theming is possible. However, there is no user-friendly interface for now.
Edit button labeled Data. It should open up a new modal in which there is a large textbox.terminalOptions in the text area labeled Data. Refer to the xterm.js documentation (ITerminalOptions) to set the options. Nested objects may need to be used.Profile defaults). Those options act as a fallback for every profile unless a profile explicitly overrides them.This plugin comes with several profile presets that you can reference.
When setting up a terminal profile, you need to distinguish between shells and terminal emulators. (Search online if needed.) Generally, integrated profiles only work with shells while external ones only work with terminal emulators.
bash --loginshcmddash<Git installation>\bin\bash.exe --login (e.g. C:\Program Files\Git\bin\bash.exe)pwshpowershellwsl or wsl -d <distribution name>zsh --logincmdgnome-terminalkonsole/System/Applications/Utilities/Terminal.app/Contents/macOS/Terminal "$PWD"wt/Applications/iTerm.app/Contents/MacOS/iTerm2 "$PWD"xtermThis plugin patches require so that require("obsidian") and other Obsidian modules work in the developer console. It is toggleable as Expose internal modules in settings.
In the developer console, a context variable $$ is passed into the code, which can be used to dynamically change terminal options.
The full API is available from src/@types/obsidian-terminal.ts.
Ctrl+Shift+`, then you can use Obsidian hotkeys again. Alternatively, disable the Intercept keys when terminal is focused setting to keep Obsidian hotkeys working while the terminal has focus.Contributions are welcome!
This project uses changesets to manage the changelog. When creating a pull request, please add a changeset describing the changes. Add multiple changesets if your pull request changes several things. End each changeset with ([PR number](PR link) by [author username](author link)). For example, the newly created file under the directory .changeset should look like:
---
"example": patch
---
This is an example change. ([GH#1](https://github.com/ghost/example/pull/1) by [@ghost](https://github.com/ghost))
package.json defines the executable workflow:
bun run check runs TypeScript, ESLint, markdownlint, Prettier, Ruff, and Ty checks.bun run format applies ESLint, markdownlint, Prettier, and Ruff fixes, then runs Ty.bun run build runs bun run check, then creates the production bundle.bun run build:dev starts the development watcher without running the checks.bun run commitlint checks commits from origin/main through HEAD.Prek manages the Git hooks in prek.toml. The pre-commit hooks format supported files. The commit-message hook runs commitlint. The pre-push hook runs the full test suite.
To set up locally:
bun install to install JavaScript dependencies and Prek hooks.uv sync --locked to install the locked Python environment.Use these scoped commands when one check needs attention:
bun run check:tsc — TypeScript type checkbun run check:eslint — TypeScript and JavaScript lintbun run check:md — Markdown lintbun run check:prettier — Prettier checkbun run check:py — Ruff formatting, Ruff lint, and Ty checksbun run format:eslint — ESLint fixesbun run format:md — Markdown fixesbun run format:prettier — Prettier fixesbun run format:py — Ruff fixes and Ty checkConfiguration files:
eslint.config.mjs — ESLint rules.prettierrc.mjs — Prettier rules.prettierignore — Prettier ignore patterns.markdownlint.jsonc — markdownlint rules.markdownlint-cli2.mjs — markdownlint file selection.commitlintrc.mjs — commitlint configprek.toml — Git hooksThis repository uses Pytest for Python tests and Vitest for TypeScript and JavaScript tests.
bun run test.bun run test:py.bun run test:vitest.bun run test:watch.bun run test and blocks a push when a test fails.See vitest.config.mts for minimal config and further instructions.
The ConPTY host and ConHost resizer tests run on native Windows only. See Windows backend tests.
The todos here, ordered alphabetically, are things planned for the plugin. There are no guarantees that they will be completed. However, we are likely to accept contributions for them.
We hope that there will never be any security vulnerabilities, but unfortunately it does happen. Please report them!
| Version | Supported |
|---|---|
| rolling | ✅ |
| latest | ✅ |
| outdated | ❌ |
Please report a vulnerability by opening a private vulnerability report. We will get back to you as soon as possible.