{"slug": "show-hn-vibe-zsh-turn-natural-language-into-shell-commands", "title": "Show HN: Vibe zsh, turn natural language into shell commands", "summary": "Developer Skymoore released Vibe Zsh, an open-source tool that converts natural language descriptions into shell commands using AI. The plugin integrates with Oh-My-Zsh and supports multiple AI providers including OpenAI, Anthropic, and local models via Ollama, offering features like OS-aware generation and command previews.", "body_md": "Transform natural language into shell commands using AI. Works natively with OpenAI, Anthropic, Groq, OpenRouter, Ollama, LM Studio, and more.\n\n```\n# Type your intent in natural language\nlist all docker containers\n\n# Press Ctrl+G\n\n# Get the command with explanations\ndocker ps -a\n# docker: Docker command-line tool\n# ps: List containers\n# -a: Show all containers (not just running)\n```\n\n- 🧠\n**Natural language to commands**- Just describe what you want - 🖥️\n**OS-aware generation**- Commands that work on YOUR system (macOS/Linux/Windows) - ⚡\n**Lightning fast**- Cached responses are 100-400x faster - 🎬\n**Streaming output**- Typewriter effect with progress indicators - 🔌\n**Multi-provider**- Native support for OpenAI, Anthropic, Groq, OpenRouter, Ollama, LM Studio, and more - 🛡️\n**Safe by default**- Preview commands before execution - 📚\n**Learn while you work**- Inline explanations for every command - 📜\n**Query history**- Interactive menu to browse and re-run previous queries - 🎯\n**Single binary**- One compiled binary, no runtime dependencies to install\n\n```\nbrew tap skymoore/tap\nbrew install --cask vibe-zsh\n```\n\nThe Homebrew installation automatically:\n\n- Installs vibe to\n`~/.oh-my-zsh/custom/plugins/vibe`\n\n- Adds\n`vibe`\n\nto your plugins list in`~/.zshrc`\n\n- Creates a global\n`vibe-zsh`\n\ncommand for CLI usage\n\nAfter installation, reload your shell:\n\n```\nsource ~/.zshrc\n```\n\n**Note:** Requires Oh-My-Zsh. If not installed, the installer will provide instructions.\n\nFor oh-my-zsh integration:\n\n```\ncurl -fsSL https://raw.githubusercontent.com/skymoore/vibe-zsh/main/install.sh | bash\n```\n\nOr using wget:\n\n```\nwget -qO- https://raw.githubusercontent.com/skymoore/vibe-zsh/main/install.sh | bash\n```\n\nThis script downloads the latest release and installs it to `~/.oh-my-zsh/custom/plugins/vibe`\n\n. You'll need to manually add `vibe`\n\nto your plugins list in `~/.zshrc`\n\n.\n\n-\n**Clone the repository:**\n\n```\ngit clone https://github.com/skymoore/vibe-zsh.git ~/.oh-my-zsh/custom/plugins/vibe\n```\n\n-\n**Build the binary:**\n\n```\ncd ~/.oh-my-zsh/custom/plugins/vibe\nmake build\n```\n\n-\n**Add to your**`.zshrc`\n\n:\n\n```\nplugins=(... vibe)\n```\n\n-\n**Reload your shell:**\n\n```\nsource ~/.zshrc\n```\n\nAdd these to your `~/.zshrc`\n\n(all optional).\n\nvibe-zsh uses [gollm](https://github.com/teilomillet/gollm) to talk to each\nprovider natively. There are two kinds of provider:\n\n**Hosted providers**(`openai`\n\n,`anthropic`\n\n,`groq`\n\n,`openrouter`\n\n,`deepseek`\n\n,`google-openai`\n\n,`mistral`\n\n,`cohere`\n\n) have a fixed endpoint built in. You only need to choose the provider, set`VIBE_API_KEY`\n\n, and pick a`VIBE_MODEL`\n\n— you do**not** set`VIBE_API_URL`\n\n.**Local providers**(`ollama`\n\n,`lmstudio`\n\n,`vllm`\n\n) run on your machine. Set`VIBE_API_URL`\n\nto point at the local server; no API key is required.\n\nSelect a provider with `VIBE_PROVIDER`\n\n. If you don't set it, vibe infers the\nprovider from `VIBE_API_URL`\n\n(e.g. an `openrouter.ai`\n\nor `:11434`\n\nURL), which is\nmainly there to keep older configs working. **Setting VIBE_PROVIDER explicitly\nis the recommended approach.**\n\nThe default\n\n`VIBE_MODEL`\n\nis`llama3:8b`\n\n(chosen for the default Ollama setup). Always set`VIBE_MODEL`\n\nwhen you use a hosted provider, or requests will ask for a model that doesn't exist there.\n\n```\nexport VIBE_PROVIDER=\"openai\"\nexport VIBE_API_KEY=\"sk-...\"\nexport VIBE_MODEL=\"gpt-4o\"\n# No VIBE_API_URL needed — the openai provider always targets api.openai.com.\nexport VIBE_PROVIDER=\"anthropic\"\nexport VIBE_API_KEY=\"sk-ant-...\"\nexport VIBE_MODEL=\"claude-3-5-sonnet-20241022\"\nexport VIBE_PROVIDER=\"groq\"\nexport VIBE_API_KEY=\"gsk_...\"\nexport VIBE_MODEL=\"llama-3.1-70b-versatile\"\nexport VIBE_PROVIDER=\"openrouter\"\nexport VIBE_API_KEY=\"sk-or-...\"\nexport VIBE_MODEL=\"anthropic/claude-3.5-sonnet\"\nexport VIBE_PROVIDER=\"ollama\"\nexport VIBE_API_URL=\"http://localhost:11434/v1\"\nexport VIBE_MODEL=\"llama3:8b\"\n# Ollama must be running; no API key required.\nexport VIBE_PROVIDER=\"lmstudio\"\nexport VIBE_API_URL=\"http://localhost:1234/v1\"\nexport VIBE_MODEL=\"local-model\"\n# LM Studio must be running and reachable when vibe starts.\n```\n\nNote on validation:gollm checks your configuration when vibe starts. Hosted providers validate the API key format up front (for example, Anthropic keys must start with`sk-ant-`\n\n), and local providers must already be running and reachable. If a provider is misconfigured, vibe reports an actionable error on the first query rather than silently failing.\n\nCustom OpenAI-compatible gateways:the`openai`\n\nprovider always points at`api.openai.com`\n\n, so it can't be redirected to a self-hosted gateway via`VIBE_API_URL`\n\n. To use an OpenAI-compatible endpoint that isn't OpenAI itself, set`VIBE_PROVIDER`\n\nto`lmstudio`\n\nor`vllm`\n\nand point`VIBE_API_URL`\n\nat your gateway.\n\n- Type a natural language description in your terminal\n- Press\n`Ctrl+G`\n\n- Review the generated command (with explanations)\n- Press\n`Enter`\n\nto execute, or edit first\n\n**History Menu:**\n\nAccess your query history in two ways:\n\n**Keybinding**: Press`Ctrl+X`\n\nthen`H`\n\n**Command**: Type`vh`\n\nand press Enter\n\nBoth methods open an interactive menu where you can:\n\n- Browse previous queries with arrow keys\n- Search with\n`/`\n\n(filter mode) - Press\n`Enter`\n\nto insert the generated command into your buffer - Press\n`G`\n\nto regenerate a new command from the original query - Press\n`V`\n\nto edit the original query in your buffer - Press\n`A`\n\nor`Home`\n\nto jump to the first entry - Press\n`E`\n\nor`End`\n\nto jump to the last entry - Press\n`Esc`\n\nor`Q`\n\nto cancel\n\nThe selected command appears on your command line, ready to execute!\n\n**Quick Regenerate:**\n\nPress `Ctrl+X`\n\nthen `G`\n\nto instantly regenerate a new command from your most recent query without opening the menu.\n\n**Note**: Don't run `vibe-zsh history`\n\nor `./vibe history`\n\ndirectly - use `vh`\n\nor the keybinding instead.\n\nYou can also use vibe directly from the command line:\n\n```\n# Homebrew installation\nvibe-zsh \"list all docker containers\"\n\n# Manual installation (Oh-My-Zsh plugin)\n~/.oh-my-zsh/custom/plugins/vibe/vibe \"list all docker containers\"\n```\n\n**CLI Flags:**\n\n```\nvibe-zsh --help                    # Show all available flags\nvibe-zsh --debug \"query\"           # Enable debug logging\nvibe-zsh --temperature 0.1 \"query\" # Override temperature\nvibe-zsh --interactive \"query\"     # Confirm before execution\n```\n\n**History Commands:**\n\n```\nvh                                 # Interactive menu (recommended)\nvibe-zsh history list              # List history in plain text\nvibe-zsh history clear             # Clear all history\n\n# Note: Use 'vh' or Ctrl+X H for interactive menu\n# Don't use 'vibe-zsh history' directly (it just outputs to stdout)\n```\n\n**Query History:**\n\n```\n# Open history menu with keybinding\nCtrl+X H\n\n# Or use the command\nvh\n\n# List history in plain text\nvibe-zsh history list\n\n# Clear all history\nvibe-zsh history clear\n```\n\n**File Operations:**\n\n```\nshow me all hidden files including their sizes\n# → ls -lah\n```\n\n**Docker:**\n\n```\nshow logs of nginx container and follow them\n# → docker logs -f nginx\n```\n\n**Git:**\n\n```\nshow me commits from last week\n# → git log --since=\"1 week ago\"\n```\n\n**Find & Search:**\n\n```\nfind all python files modified today\n# → find . -name \"*.py\" -mtime 0\n```\n\n**Tab Completion:**\n\n```\nvibe <TAB><TAB>\n# Shows common query suggestions\n```\n\n**Hide Explanations:**\n\n```\nexport VIBE_SHOW_EXPLANATION=false\n```\n\n**Interactive Mode** (confirm before inserting):\n\n```\nexport VIBE_INTERACTIVE=true\n```\n\n**Disable Cache:**\n\n```\nexport VIBE_ENABLE_CACHE=false\n```\n\n**Disable Auto-Updates:**\n\n```\nexport VIBE_AUTO_UPDATE=false\n```\n\n**Customize History Keybinding:**\n\n```\nexport VIBE_HISTORY_KEY=\"^R\"      # Use Ctrl+R for history menu\nexport VIBE_REGENERATE_KEY=\"^[r\"  # Use Alt+R for quick regenerate\n# Note: Avoid ^H (Ctrl+H) as it conflicts with Backspace\n```\n\n**Disable History:**\n\n```\nexport VIBE_ENABLE_HISTORY=false\n```\n\n| Variable | Default | Description |\n|---|---|---|\nAPI Configuration |\n||\n`VIBE_PROVIDER` |\n(inferred from `VIBE_API_URL` ) |\nLLM provider. Hosted: `openai` , `anthropic` , `groq` , `openrouter` , `deepseek` , `google-openai` , `mistral` , `cohere` . Local: `ollama` , `lmstudio` , `vllm` . Recommended to set explicitly. |\n`VIBE_API_URL` |\n`http://localhost:11434/v1` |\nEndpoint URL for local providers only (`ollama` , `vllm` ). Hosted providers ignore this and use their fixed endpoints. |\n`VIBE_API_KEY` |\n`\"\"` |\nAPI key. Required for hosted providers; ignored by local providers. |\n`VIBE_MODEL` |\n`llama3:8b` |\nModel to use. Set this for hosted providers — the default only suits Ollama. |\n`VIBE_TEMPERATURE` |\n`0.2` |\nGeneration temperature (0.0-2.0) |\n`VIBE_MAX_TOKENS` |\n`1000` |\nMax response tokens |\n`VIBE_TIMEOUT` |\n`30s` |\nRequest timeout |\nDisplay Options |\n||\n`VIBE_SHOW_EXPLANATION` |\n`true` |\nShow command explanations |\n`VIBE_SHOW_WARNINGS` |\n`true` |\nShow warnings for dangerous commands |\n`VIBE_SHOW_PROGRESS` |\n`true` |\nShow progress spinner during generation |\n`VIBE_PROGRESS_STYLE` |\n`dots` |\nSpinner style: dots, line, circle, bounce, arrow, runes (ᛜ ᛃ ᛋ) |\n`VIBE_STREAM_OUTPUT` |\n`true` |\nStream output with typewriter effect |\n`VIBE_STREAM_DELAY` |\n`20ms` |\nDelay between streamed words |\nBehavior |\n||\n`VIBE_INTERACTIVE` |\n`false` |\nConfirm before inserting command |\n`VIBE_USE_STRUCTURED_OUTPUT` |\n`true` |\nUse JSON schema for structured responses |\n`VIBE_ENABLE_CACHE` |\n`true` |\nEnable response caching |\n`VIBE_CACHE_TTL` |\n`24h` |\nCache lifetime |\nParsing & Retry |\n||\n`VIBE_MAX_RETRIES` |\n`3` |\nMax retry attempts for failed parsing |\n`VIBE_ENABLE_JSON_EXTRACTION` |\n`true` |\nExtract JSON from corrupted responses |\n`VIBE_STRICT_VALIDATION` |\n`true` |\nValidate response structure |\n`VIBE_SHOW_RETRY_STATUS` |\n`true` |\nShow retry progress during generation |\nHistory |\n||\n`VIBE_ENABLE_HISTORY` |\n`true` |\nEnable query history tracking |\n`VIBE_HISTORY_SIZE` |\n`100` |\nMaximum number of history entries |\n`VIBE_HISTORY_KEY` |\n`^Xh` (Ctrl+X H) |\nKeybinding for history menu |\n`VIBE_REGENERATE_KEY` |\n`^Xg` (Ctrl+X G) |\nKeybinding to regenerate last command |\nUpdates & Debugging |\n||\n`VIBE_AUTO_UPDATE` |\n`true` |\nEnable auto-update checks |\n`VIBE_UPDATE_CHECK_INTERVAL` |\n`7d` |\nHow often to check for updates |\n`VIBE_DEBUG_LOGS` |\n`false` |\nEnable debug logging for troubleshooting |\n\n**Capture**- You type natural language and press`Ctrl+G`\n\n**Context**- vibe detects your OS (macOS/Linux/Windows) and shell (zsh/bash/etc.)** Generate**- vibe sends your query with system context to the configured LLM** Parse**- Response is structured as command + explanations** Cache**- Response is cached for 24 hours (configurable)** Stream**- Command is streamed to your terminal with typewriter effect** Insert**- Command appears in your buffer for review** Execute**- You press Enter to run (or edit first)\n\nvibe automatically detects your operating system and shell, ensuring generated commands work on your system:\n\n**macOS**: Uses BSD utilities (e.g.,`find`\n\nwithout`-printf`\n\n,`sed -i ''`\n\n)**Linux**: Uses GNU utilities (e.g.,`find -printf`\n\n,`sed -i`\n\n)**Shell-specific**: Generates syntax appropriate for zsh, bash, etc.\n\nThis means you get commands that actually work on your system, not generic Linux commands that fail on macOS!\n\n**First query:**~500ms-2s (depends on LLM)** Cached query:**~5-10ms (100-400x faster!)** Binary size:**~8MB** Memory usage:**<10MB\n\n- ✅ Commands are never executed automatically\n- ✅ Full preview before execution\n- ✅ Edit commands before running\n- ✅ Warnings for dangerous commands\n- ✅ Optional interactive confirmation mode\n- ✅ Local-first with Ollama (your data stays private)\n\nvibe automatically checks for updates once a week in the background (zero impact on performance). When an update is available, you'll see a notification:\n\n```\n⚠️  vibe v1.2.4 available (current: v1.2.3)\n   Run: vibe --update\n```\n\n**Manual Commands:**\n\n```\nvibe --version              # Show current version\nvibe --update               # Download and install latest version\n```\n\n**Configuration:**\n\n```\nexport VIBE_AUTO_UPDATE=false           # Disable auto-update checks\nexport VIBE_UPDATE_CHECK_INTERVAL=14d   # Check every 2 weeks instead\n```\n\n**Security:**\n\n- All downloads are verified using SHA256 checksums\n- Checksums are published with each release\n- Original binary is backed up before replacement\n- Safe atomic file replacement\n\nThe update check runs in a background process after each command, so it never slows down your workflow. Updates are never installed automatically - you always control when to update.\n\n**Command not working after install:**\n\n- Reload your shell:\n`source ~/.zshrc`\n\n- Verify plugin is in list:\n`echo $plugins`\n\n- Check binary exists:\n`ls ~/.oh-my-zsh/custom/plugins/vibe/vibe`\n\n**Slow responses:**\n\n- Enable caching:\n`export VIBE_ENABLE_CACHE=true`\n\n- Use a faster model or local LLM\n- Check your network connection\n\n**Bad command suggestions:**\n\n- Try a different/better model\n- Make your query more specific\n- Check model supports structured output\n\n**Corrupted or garbage output:**\n\n- vibe now automatically handles corrupted LLM responses with multi-layer parsing\n- Enable debug logs to see what's happening:\n`export VIBE_DEBUG_LOGS=true`\n\n- Check logs for raw responses and parsing attempts\n- Try increasing retries:\n`export VIBE_MAX_RETRIES=5`\n\n**Parsing errors:**\n\n- Enable JSON extraction:\n`export VIBE_ENABLE_JSON_EXTRACTION=true`\n\n(default) - Disable strict validation temporarily:\n`export VIBE_STRICT_VALIDATION=false`\n\n- Check debug logs to see which parsing layer succeeded/failed\n- Some models produce cleaner JSON with lower temperature:\n`export VIBE_TEMPERATURE=0.3`\n\n**Ctrl+G does nothing:**\n\n- Ensure plugin is loaded:\n`which vibe`\n\n(should show a function) - Check no other plugin uses Ctrl+G\n- Try rebinding:\n`bindkey '^G' vibe`\n\n- Zsh with Oh-My-Zsh\n- An LLM provider — hosted (OpenAI, Anthropic, Groq, OpenRouter, etc.) or local (Ollama, LM Studio, vLLM)\n- macOS or Linux\n\n```\nbrew uninstall --cask vibe-zsh\nbrew untap skymoore/tap  # Optional: remove the tap\n```\n\nThen remove `vibe`\n\nfrom your plugins list in `~/.zshrc`\n\nand reload:\n\n```\nsource ~/.zshrc\ncurl -fsSL https://raw.githubusercontent.com/skymoore/vibe-zsh/main/uninstall.sh | bash\n```\n\nOr using wget:\n\n```\nwget -qO- https://raw.githubusercontent.com/skymoore/vibe-zsh/main/uninstall.sh | bash\n```\n\nThen remove `vibe`\n\nfrom your plugins list in `~/.zshrc`\n\nand reload:\n\n```\nsource ~/.zshrc\ngit clone https://github.com/skymoore/vibe-zsh.git\ncd vibe-zsh\nmake build        # Build for current platform\nmake build-all    # Build for all platforms\nmake test         # Run tests\nmake install      # Install to oh-my-zsh\n```\n\nContributions welcome! This project uses:\n\n- Go 1.26+\n- Standard zsh scripting\n[gollm](https://github.com/teilomillet/gollm)for native multi-provider LLM access\n\nGPLv3 License - see [LICENSE](/skymoore/vibe-zsh/blob/main/LICENSE)\n\nInspired by [LoganPederson/vibe](https://github.com/LoganPederson/vibe)\n\nBuilt for terminal productivity enthusiasts 🚀", "url": "https://wpnews.pro/news/show-hn-vibe-zsh-turn-natural-language-into-shell-commands", "canonical_source": "https://github.com/skymoore/vibe-zsh", "published_at": "2026-06-29 23:01:22+00:00", "updated_at": "2026-06-29 23:19:34.064874+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "natural-language-processing", "generative-ai"], "entities": ["OpenAI", "Anthropic", "Groq", "OpenRouter", "Ollama", "LM Studio", "Skymoore", "Oh-My-Zsh"], "alternates": {"html": "https://wpnews.pro/news/show-hn-vibe-zsh-turn-natural-language-into-shell-commands", "markdown": "https://wpnews.pro/news/show-hn-vibe-zsh-turn-natural-language-into-shell-commands.md", "text": "https://wpnews.pro/news/show-hn-vibe-zsh-turn-natural-language-into-shell-commands.txt", "jsonld": "https://wpnews.pro/news/show-hn-vibe-zsh-turn-natural-language-into-shell-commands.jsonld"}}