@dwk/noodle
v1.0.0
Published
A self-hosted search engine that uses LLMs to return relevant results like Google used to.
Maintainers
Readme
Noodle
A self-hosted search engine that uses LLMs to return relevant results—like Google used to, before enshittification started.
Why?
Modern search engines prioritize ad revenue over relevance. Noodle uses AI to search the web and return results ranked purely by how well they answer your question.
No ads. No SEO spam. No affiliate links. Just results.
Features
- Classic Google UI - Clean, fast, familiar interface
- Claude CLI integration - Uses your local Claude installation (recommended)
- OpenAI support - Alternative provider with API key
- Lucky Me - Jump directly to the top result
- Caching - Results cached for 6 hours, persists across restarts
- Pagination - Browse through pages of results
- Browser integration - Add as your default search engine
- Self-hosted - Your searches, your server, your privacy
- API included - JSON endpoint for programmatic access
Quick Start
npx @dwk/noodleOn first run, you'll be prompted to:
- Choose a provider (Claude CLI or OpenAI)
- Enter your API key (OpenAI only)
- Select a port
Then open http://localhost:3000 and search!
Installation
Global install (recommended)
npm install -g @dwk/noodle
noodleRun without installing
npx @dwk/noodleClone and run locally
git clone https://gitlab.com/dwk-io/noodle.git
cd noodle
npm install
npm startConfiguration
Config is stored in ~/.noodle/config.json:
{
"provider": "claude",
"providers": {
"openai": {
"apiKey": "sk-...",
"model": "gpt-4o"
}
},
"port": 3000
}Cache is stored in ~/.noodle/cache.json and persists across server restarts.
CLI Options
noodle # Start with saved config
noodle --port 8080 # Use different port
noodle --provider openai # Use OpenAI instead of default
noodle --cache-ttl 12 # Set cache TTL to 12 hours
noodle --setup # Run setup wizard again
noodle --help # Show helpAdding as Default Search Engine
Chrome / Edge / Brave
- Visit http://localhost:3000
- Right-click the URL bar
- Select "Add as search engine" or go to Settings → Search engines
- Find "Noodle" and set as default
Firefox
- Visit http://localhost:3000
- Click the address bar
- At the bottom, click the Noodle icon with the + symbol
- Go to Settings → Search → Default Search Engine
Safari
Safari doesn't support custom search engines natively. Options:
- Use the Finicky app to redirect searches
- Use a browser extension like Search Engines for Safari
API
Search (JSON)
curl "http://localhost:3000/api/search?q=best+mechanical+keyboards"Response:
{
"query": "best mechanical keyboards",
"results": [
{
"title": "The Best Mechanical Keyboards for 2024",
"url": "https://example.com/keyboards",
"snippet": "We tested 50 mechanical keyboards...",
"domain": "example.com"
}
],
"totalResults": 1500000,
"page": 1,
"duration": 2341,
"provider": "claude",
"error": null,
"cached": false
}Query Parameters
| Parameter | Description |
|-----------|-------------|
| q | Search query (required) |
| page | Page number (default: 1) |
| refresh | Set to 1 to bypass cache |
OpenSearch
GET /opensearch.xmlReturns the OpenSearch description document for browser integration.
How It Works
- You enter a search query
- Noodle sends it to your chosen LLM (Claude CLI or GPT-4) with web search enabled
- The LLM searches the web and applies this ranking criteria:
- Direct relevance to query intent
- Source authority and trustworthiness
- Content quality and depth
- Recency (when time-sensitive)
- Results that are primarily ads, SEO spam, or affiliate content are filtered out
- Results are cached for 6 hours to speed up repeated searches
- You get clean, relevant results
Providers
| Provider | Requirements | Search Method |
|----------|--------------|---------------|
| Claude CLI (recommended) | claude CLI installed | WebSearch tool |
| OpenAI | API key | Web browsing tool |
Claude CLI Setup
Install the Claude CLI:
npm install -g @anthropic-ai/claude-codeAuthenticate with your Anthropic account:
claudeFollow the prompts to sign in. This only needs to be done once.
Run
noodleand select Claude as your provider. No API key needed—it uses your local Claude installation.
OpenAI Setup
- Go to https://platform.openai.com
- Create an account and add billing
- Generate an API key
- Run
noodle --setupand select OpenAI
Caching
Noodle caches search results to reduce API costs and speed up repeated searches:
- TTL: 6 hours
- Storage:
~/.noodle/cache.json - Persistence: Survives server restarts
- Refresh: Click "(cached)" link or add
?refresh=1to bypass
Cost
Each search costs approximately:
- Claude CLI: Uses your Claude subscription/credits
- OpenAI: ~$0.01-0.05 depending on result complexity
Caching significantly reduces costs for repeated searches.
Privacy
- Noodle runs entirely on your machine
- Searches are sent to your chosen AI provider
- Results are cached locally in
~/.noodle/cache.json - No analytics, tracking, or telemetry
Contributing
PRs welcome! Some ideas:
- [ ] Speed optimizations
- [ ] Search suggestions/autocomplete
- [ ] Search history
- [ ] Did you mean? (spelling)
- [ ] Related searches
License
ISC
