Shelltify
Never wonder if your terminal command has finished again.
Shelltify notifies you the moment a terminal command completes, fails, or is cancelled. Whether you're building a Docker image, installing packages, running tests, compiling code, or executing long-running scripts, Shelltify lets you know the instant it's done.
Unlike extensions that scan terminal output, Shelltify uses VS Code's built-in Shell Integration API to detect command lifecycle events. It's lightweight, event-driven, and works without polling or parsing terminal output.
✨ Features
- 🔔 Instant notifications for successful, failed, cancelled, and unknown command completions.
- 🖥️ Native OS notifications when VS Code is minimized or unfocused.
- 🔊 Optional sound alerts using the system sound or your own audio file.
- ⏱️ Minimum duration filter to ignore short-lived commands.
- 🚫 Ignore list with exact matches or regular expressions.
- 📜 Command history with execution status, duration, terminal, and exit code.
- 📊 Status bar indicator showing the number of currently running commands.
- ⚡ Independent tracking across multiple terminals.
- 🎛️ Interactive notifications with actions like Open Terminal and Copy Command.
📸 Screenshots
Success Notification

Failure Notification

Cancelled Notification

History

🚀 Installation
Install Shelltify directly from the VS Code Marketplace, or install a packaged .vsix manually:
code --install-extension shelltify-0.1.0.vsix
📖 Usage
Run commands in the integrated terminal as you normally would.
Shelltify automatically watches command execution in the background and notifies you when the command finishes.
Common examples include:
docker build
npm install
cargo build
pytest
mvn package
python train.py
terraform apply
No additional setup is required for supported shells.
⚙️ Requirements
Shelltify relies on VS Code Shell Integration.
Shell Integration is enabled by default in modern versions of VS Code for most supported shells, including:
- PowerShell
- Bash
- Zsh
- Fish
- WSL
If notifications aren't appearing, open the Shelltify output channel to verify that Shell Integration has been detected.
Settings
| Setting |
Default |
Description |
shelltify.enableSuccessNotification |
true |
Notify when a command exits 0. |
shelltify.enableFailureNotification |
true |
Notify when a command exits non-zero. |
shelltify.enableCancelledNotification |
true |
Notify when a command is cancelled (e.g. Ctrl+C). |
shelltify.minimumDuration |
3 |
Minimum duration, in seconds, before a successful command notifies. Failures, cancellations, and undetermined-exit-code results always notify, regardless of duration. |
shelltify.enableSound |
false |
Play a sound alongside notifications. |
shelltify.soundType |
"system" |
"system" or "custom". |
shelltify.customSound |
"" |
Path to a sound file, used when soundType is "custom". |
shelltify.ignoreCommands |
[] |
Commands to never notify for — exact strings or /regex/flags. |
shelltify.showDuration |
true |
Include duration in the notification text. |
shelltify.showTerminalName |
true |
Include the terminal's name in the notification text. |
shelltify.showExitCode |
true |
Include the exit code in failure notifications. |
shelltify.nativeNotifications |
false |
Also raise a native OS notification when VS Code is unfocused/minimized. |
Example ignore list:
"shelltify.ignoreCommands": [
"npm run dev",
"tail -f",
"docker compose up",
"/^python .*\\.py$/"
]
Commands
Open the Command Palette (Ctrl+Shift+P / Cmd+Shift+P) and search for:
- Shelltify: Toggle Notifications
- Shelltify: View History
- Shelltify: Clear History
- Shelltify: Test Success Notification
- Shelltify: Test Failure Notification
- Shelltify: Open Settings
FAQ
Nothing's notifying me — what's wrong?
Almost always Shell Integration. Open a fresh integrated terminal and check the "Shelltify" output channel (View → Output, then pick it from the dropdown) — it logs whether integration was detected.
Why didn't npm run dev notify me?
It's still running — that's by design. Long-running/dev-server-style commands only notify once they actually exit.
Can I use a regex in the ignore list?
Yes — wrap it in slashes: "/^docker compose (up|logs)/". Optional flags go after the trailing slash, e.g. /pattern/i.
Does this work over SSH / in a devcontainer / in WSL?
Yes, as long as Shell Integration is active in that remote/container shell — it's a VS Code terminal feature, not tied to where the shell process actually runs.
Known Limitations
- cmd.exe has weak Shell Integration support in VS Code. Shelltify will warn you (once, plus every time in the output channel) if a cmd.exe terminal never establishes it. PowerShell, bash, zsh, and WSL are all reliable; cmd.exe is not. Switch the terminal's shell if you need notifications there.
- Shell Integration occasionally can't determine an exit code for commands that draw their own terminal UI (Docker BuildKit's progress output is a common case). These are shown as a distinct "finished (exit code unknown)" notification rather than being dropped — check the output channel for a warning explaining why.
- "Native OS notification" support depends on the underlying OS notification helper being available in your environment; it degrades silently (no popup, no crash) if it isn't — see Troubleshooting below.
- There's no single VS Code API for "shell type" — the terminal name is always accurate, but the reported shell type is best-effort.
Troubleshooting
Open View → Output, then pick Shelltify from the channel dropdown — every notify/skip decision is logged there with a reason.
Native (OS-level) notifications aren't appearing on Windows.
The in-editor popup still works even if this fails — native notifications are a separate channel via node-notifier's Windows toast helper (SnoreToast). Check the output channel: a failed attempt logs the underlying error. Common causes:
- Windows Focus Assist is on and suppressing toasts.
- Notifications are disabled for the helper app under Settings → System → Notifications.
- The helper binary got flagged/blocked by antivirus software.
Native notifications also only fire while the VS Code window is unfocused (by design — that's the point of them); the output channel logs when one is skipped for being focused, so you can tell the difference between "skipped because focused" and "attempted but failed."
A command finished but I never got notified.
Check the output channel for a line starting with "Notification skipped for..." — it names the exact reason (ignore list, notifications toggled off, etc.). If instead you see "Could not determine an exit code," that's the Shell Integration limitation above — you should still get a "❔ finished (exit code unknown)" notification for it; if you don't see even that, check whether shelltify.toggleNotifications was switched off.
Contributing
Issues and PRs welcome. Before submitting a PR:
npm install
npm run lint
npm run test:unit
npm run test:integration
Packaging & Publishing
Package a .vsix you can install locally or hand to someone else:
npm install
npm run compile
npx vsce package
This produces shelltify-<version>.vsix in the project root — install it with
code --install-extension shelltify-<version>.vsix.
To publish to the VS Code Marketplace:
- Create a publisher and replace
karthikeya-theDev in package.json (the publisher field, and the repository/bugs/homepage URLs)
with your real publisher id.
- Get a Personal Access Token from Azure DevOps with Marketplace: Manage scope.
- Log in and publish:
npx vsce login <publisher-id>
npx vsce publish
vsce publish runs vscode:prepublish (which compiles) automatically, so a plain
npx vsce publish patch|minor|major will also bump the version in package.json for you.
Before your first real publish, swap out the assets in resources/ with your final 128×128 branding if you want a more polished Marketplace appearance.
License
MIT