Hunt is a command-line tool that opens a search query across multiple search engines simultaneously in your default browser. Search once, get results from multiple engines in separate browser tabs.
- 🔍 Search across 8 popular search engines with a single command
- 🛒 Subcommands: Search shopping sites with
shopsubcommand (Go version) - 🎯 Interactive mode to select specific services
- 🎛️ Command-line service selection with
-s/--servicesflag - 📝 Support for service names or numbers (mix and match)
- 🌐 Opens results in separate browser tabs
- 🚀 Two implementations available: Bash script and Go binary
- 🍎 Cross-platform support (macOS, Linux, Windows) via Go port
- ✅ Comprehensive test suite for both implementations
- Bing
- DuckDuckGo
- Kagi
- Mojeek
- StartPage
- Yahoo
- YouTube
- Amazon
- eBay
- Gazelle
- Slick Deals
- Swappa
- Hacker News
- Lobste.rs
- Engadget
- The Verge
- NPR
- NYT
- WSJ
- macOS (uses
opencommand) - Bash 3.2+ (default on macOS)
- Go 1.24+ (for building from source)
- Cross-platform: macOS, Linux, Windows
- Single binary - no runtime dependencies
- Clone or download this repository
- Make the script executable:
chmod +x hunt.sh
Option 1: Build from source
go build -o hunt .Option 2: Run directly (development)
go run . "your search term"The Go version provides the same functionality as the bash version with:
- Cross-platform support (macOS, Linux, Windows)
- Single portable binary
- Better error handling
- Comprehensive test suite
Both the bash and Go versions support the same command-line interface. The Go version also supports subcommands for different service categories.
Bash version:
./hunt.sh "your search term"Go version:
./hunt "your search term"
# or
go run . "your search term"Example:
./hunt "machine learning algorithms"This will open 8 browser tabs, one for each search engine with your search query.
The Go version supports subcommands to search different categories of services. Subcommands come before flags for backward compatibility.
Default (Search Engines):
./hunt "your search term"
# Searches across all search engines (default behavior)Shopping Sites:
./hunt shop "laptop"
# or
./hunt shopping "laptop"
# Searches across all shopping sitesTech News Sites:
./hunt technews "AI"
# or
./hunt tech-news "AI"
# or
./hunt tech "AI"
# Searches across all tech news sitesNews Sites:
./hunt news "election"
# Searches across all news sitesSubcommands work with all existing flags:
# Interactive mode with shopping sites
./hunt shop -i "laptop"
# Select specific shopping sites
./hunt shop -s 1 3 "laptop"
# Selects Amazon (1) and Gazelle (3)
# Select by name
./hunt shop -s Amazon eBay "laptop"Select specific services to use:
# Bash version
./hunt.sh -i "your search term"
# or
./hunt.sh --interactive "your search term"
# Go version (search engines)
./hunt -i "your search term"
# or
./hunt --interactive "your search term"
# Go version (shopping sites)
./hunt shop -i "laptop"
# Go version (tech news sites)
./hunt technews -i "AI"
# Go version (news sites)
./hunt news -i "election"Go version interactive mode flow:
When you run ./hunt -i (no subcommand), you'll first see a category selection menu:
Select category:
1) Search Engines
2) Shopping Sites
3) Tech News
4) News
Enter category number:
After selecting a category, you'll see the service selection menu for that category.
When you run ./hunt shop -i (with subcommand), it skips category selection and goes directly to the service menu for that category.
Service selection menu:
When you run in interactive mode, you'll see a numbered list of services for the selected category:
Search Engines (default):
Select services to use (enter numbers, separated by spaces):
0) All services
1) Bing
2) DuckDuckGo
3) Google
4) Kagi
5) Mojeek
6) StartPage
7) Yahoo
8) YouTube
Enter selection(s):
Shopping Sites (with shop subcommand):
Select services to use (enter numbers, separated by spaces):
0) All services
1) Amazon
2) eBay
3) Gazelle
4) Slick Deals
5) Swappa
Enter selection(s):
Tech News Sites (with technews subcommand):
Select services to use (enter numbers, separated by spaces):
0) All services
1) Hacker News
2) Lobste.rs
3) Engadget
4) The Verge
Enter selection(s):
News Sites (with news subcommand):
Select services to use (enter numbers, separated by spaces):
0) All services
1) NPR
2) NYT
3) WSJ
Enter selection(s):
You can:
- Enter a single number:
3(searches only Google or Gazelle, depending on category) - Enter multiple numbers:
1 3 5(searches multiple services) - Enter
0to select all services in the category
Select specific services directly from the command line without interactive prompts:
# Bash version
./hunt.sh -s SELECTION ... "your search term"
# or
./hunt.sh --services SELECTION ... "your search term"
# Go version (search engines)
./hunt -s SELECTION ... "your search term"
# or
./hunt --services SELECTION ... "your search term"
# Go version (shopping sites)
./hunt shop -s SELECTION ... "laptop"You can specify services by:
- Number:
0for all, or1throughN(corresponds to the numbered list for the selected category) - Name: The exact service name (case-insensitive), e.g.,
Bing,Google,Amazon,eBay - "all": Select all services in the category
Examples:
# Search engines - select by numbers
./hunt -s 1 3 5 "machine learning"
# Searches: Bing (1), Google (3), Mojeek (5)
# Search engines - select by names
./hunt -s Bing Google "machine learning"
# Searches: Bing and Google
# Shopping sites - select by numbers
./hunt shop -s 1 3 "laptop"
# Searches: Amazon (1), Gazelle (3)
# Shopping sites - select by names
./hunt shop -s Amazon eBay "laptop"
# Searches: Amazon and eBay
# Tech news sites - select by numbers
./hunt technews -s 1 3 "AI"
# Searches: Hacker News (1), Engadget (3)
# Tech news sites - select by names
./hunt technews -s "Hacker News" "The Verge" "AI"
# Searches: Hacker News and The Verge
# News sites - select by numbers
./hunt news -s 1 2 "election"
# Searches: NPR (1), NYT (2)
# News sites - select by names
./hunt news -s NPR WSJ "election"
# Searches: NPR and WSJ
# Mix numbers and names
./hunt -s 1 Google 5 "machine learning"
# Searches: Bing (1), Google, Mojeek (5)
# Select all services in category
./hunt -s all "machine learning"
# or
./hunt -s 0 "machine learning"Note: The script automatically detects when service selections end and the search term begins. If you need to be explicit, you can use -- as a separator:
./hunt -s Bing Google -- "test search"Search Engines (Default):
# Search all engines for "python tutorials"
./hunt "python tutorials"
# Interactive mode - select specific engines
./hunt -i "bash scripting"
# Services flag - select by numbers
./hunt -s 1 3 5 "python tutorials"
# Services flag - select by names
./hunt -s Bing Google YouTube "python tutorials"
# Services flag - mix numbers and names
./hunt -s 1 Google 5 "python tutorials"
# Search with special characters (automatically URL-encoded)
./hunt "C++ programming"Shopping Sites (Go version):
# Search all shopping sites
./hunt shop "laptop"
# Interactive mode - select specific shopping sites
./hunt shop -i "laptop"
# Services flag - select by numbers
./hunt shop -s 1 3 "laptop"
# Searches: Amazon (1), Gazelle (3)
# Services flag - select by names
./hunt shop -s Amazon eBay "laptop"
# Mix numbers and names
./hunt shop -s 1 eBay 3 "laptop"Tech News Sites (Go version):
# Search all tech news sites
./hunt technews "AI"
# Interactive mode - select specific tech news sites
./hunt technews -i "machine learning"
# Services flag - select by numbers
./hunt technews -s 1 3 "AI"
# Searches: Hacker News (1), Engadget (3)
# Services flag - select by names
./hunt technews -s "Hacker News" "The Verge" "AI"
# Mix numbers and names
./hunt technews -s 1 "The Verge" 3 "AI"News Sites (Go version):
# Search all news sites
./hunt news "election"
# Interactive mode - select specific news sites
./hunt news -i "politics"
# Services flag - select by numbers
./hunt news -s 1 2 "election"
# Searches: NPR (1), NYT (2)
# Services flag - select by names
./hunt news -s NPR WSJ "election"
# Mix numbers and names
./hunt news -s 1 WSJ "election"- Subcommand Parsing (Go version): Detects subcommands (e.g.,
shop) before parsing flags for backward compatibility - Category Selection: Filters services by category (default:
search, orshopwith subcommand) - Argument Parsing: The script parses command-line flags (
-i,-s) and service selections - Service Selection: In interactive mode, prompts for selection. With
-sflag, validates service names/numbers automatically - Input Processing: The script takes your search term and URL-encodes it appropriately
- URL Construction: For each selected service, it constructs the appropriate search URL with your encoded query
- Browser Opening: Uses platform-specific commands (
openon macOS,xdg-openon Linux,cmd /c starton Windows) to open each URL - Tab Management: Opens URLs sequentially with small delays to ensure each opens in a separate tab
- Bash Compatibility: Uses parallel arrays instead of associative arrays for compatibility with bash 3.2 (macOS default)
- Category-Based Configuration (Go version): Services organized by category in JSON (e.g.,
search,shop) - Subcommand Parsing (Go version): Subcommands parsed before flags to maintain backward compatibility
- Service Name Matching: Case-insensitive matching for service names (e.g.,
bing,Bing,BINGall work) - Automatic Detection: The
-sflag automatically detects when service selections end and the search term begins - URL Encoding: Handles spaces, special characters, and Unicode properly
- Sequential Opening: Opens URLs one at a time with 0.3 second delays to ensure reliable tab creation
- Duplicate Handling: Automatically removes duplicate service selections
- Test Mode: Supports
HUNT_TEST_MODEenvironment variable to skip delays during automated testing - Modular Functions: Code organized into testable functions (URL encoding, service selection, URL construction)
hunt/
├── hunt.sh # Bash implementation
├── search_engines.json # Search engine definitions
├── README.md # This file
├── PROJECT_CONTEXT.md # Detailed project documentation
├── CLAUDE.md # AI assistant instructions
├── initial-sketch.md # Original project specification
├── LICENSE # MIT License
├── .gitignore # Git ignore patterns
├── go.mod # Go module definition
├── main.go # Go implementation - main entry point
├── config.go # Go - JSON configuration loading
├── url.go # Go - URL encoding and construction
├── selection.go # Go - Service selection logic
├── browser.go # Go - Cross-platform browser opening
├── *_test.go # Go test files (unit and integration tests)
└── tests/ # Bash test suite
├── README.md # Test documentation
├── run_tests.sh # Test runner script
├── test_helpers.sh # Test helper functions
├── test_url_encode.sh # URL encoding unit tests
├── test_service_selection.sh # Service selection unit tests
├── test_url_construction.sh # URL construction unit tests
└── test_acceptance.sh # End-to-end acceptance tests
The bash implementation includes a comprehensive test suite:
# Run all bash tests
./tests/run_tests.shThe Go implementation includes unit and integration tests:
# Run all Go tests
go test ./...
# Run with coverage
go test -cover ./...
# Run with verbose output
go test -v ./...Test Coverage:
- URL encoding: 100% coverage
- URL construction: 100% coverage
- Service selection: 100% coverage
- Configuration loading: 88.9% coverage
- Integration tests for full pipeline
See tests/README.md for detailed bash testing documentation.
Planned features (see PROJECT_CONTEXT.md for details):
- ✅ Subcommands: Completed! Go version now supports subcommands for different service categories
- ✅ Help Flag: Completed!
--help/-hflag displays usage information and exits with code 0 - Additional service categories (Reddit, StackOverflow, Wikipedia)
- Subcommand support in bash version
- Configuration file for custom service definitions
- Browser detection and optimization
- Better error handling
- Browser Extension: Create a browser extension for quick access from the browser toolbar
- System Path Integration: Package the script for easy installation as a system command (e.g.,
huntinstead of./hunt.sh) - Homebrew Distribution: Create a Homebrew formula for easy installation via
brew install hunt - ✅ Go Port: Completed! Cross-platform Go implementation with comprehensive tests
- Multi-Platform Testing: Expand GitHub Actions workflow to test Go implementation on multiple platforms (macOS, Linux, Windows) to ensure cross-platform compatibility
Only some tabs are opening:
- Make sure your browser is running before executing the script
- The script uses sequential opening with delays - if your browser is slow, you may need to increase the delay
Script doesn't work:
- Bash version: Ensure the script is executable:
chmod +x hunt.sh - Bash version: Verify you're on macOS (the
opencommand is macOS-specific) - Bash version: Check that standard Unix utilities are available (
odcommand for URL encoding) - Go version: Ensure Go is installed (1.24+) if building from source
- Go version: Verify
search_engines.jsonis in the same directory as the binary
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! See PROJECT_CONTEXT.md for technical details and development notes.