+ NeoSearch
Xprivo
DuckDuckGo
Altpower
diff --git a/apps/desktop/extensions/ai-sidebar/newtab.js b/apps/desktop/extensions/ai-sidebar/newtab.js
index b9eeb2e..b43b790 100644
--- a/apps/desktop/extensions/ai-sidebar/newtab.js
+++ b/apps/desktop/extensions/ai-sidebar/newtab.js
@@ -11,8 +11,9 @@ const DEFAULT_TICKERS = 'SPY, AAPL, NVDA, BTC-USD';
const DEFAULT_LEAGUES = 'nfl, nba';
const splitList = (s) => String(s || '').split(',').map((x) => x.trim()).filter(Boolean);
-// --- Search: Web (Xprivo by default, DuckDuckGo alternative) or AI (sidebar) ---
+// --- Search: Web (NeoSearch by default) or AI (sidebar) ---
const SEARCH_ENGINES = {
+ neosearch: { name: 'NeoSearch', url: 'https://neosearch.org/?q=' },
xprivo: { name: 'Xprivo', url: 'https://www.xprivo.com/search/?q=' },
ddg: { name: 'DuckDuckGo', url: 'https://duckduckgo.com/?q=' },
// Altpower is a Google Programmable Search — query lives in the URL fragment.
@@ -20,7 +21,7 @@ const SEARCH_ENGINES = {
oxiverse: { name: 'Oxiverse', url: 'https://search.oxiverse.com/?q=', suffix: '&tab=web' },
};
let searchMode = 'web';
-let searchEngine = 'xprivo';
+let searchEngine = 'neosearch';
function setMode(mode) {
searchMode = mode;
@@ -28,14 +29,14 @@ function setMode(mode) {
el('mode-ai').classList.toggle('active', mode === 'ai');
el('mode-web').setAttribute('aria-selected', mode === 'web');
el('mode-ai').setAttribute('aria-selected', mode === 'ai');
- const eng = SEARCH_ENGINES[searchEngine] || SEARCH_ENGINES.xprivo;
+ const eng = SEARCH_ENGINES[searchEngine] || SEARCH_ENGINES.neosearch;
el('q').placeholder = mode === 'ai' ? 'Ask AI anything…' : `Search ${eng.name}…`;
el('q').focus();
}
el('mode-web').addEventListener('click', () => setMode('web'));
el('mode-ai').addEventListener('click', () => setMode('ai'));
-// Load the chosen web search engine (default Xprivo).
+// Load the chosen web search engine (default NeoSearch).
chrome.storage.local.get('searchEngine').then(({ searchEngine: se }) => {
if (se && SEARCH_ENGINES[se]) searchEngine = se;
if (searchMode === 'web') setMode('web');
@@ -51,7 +52,7 @@ el('search').addEventListener('submit', async (e) => {
chrome.runtime.sendMessage({ type: 'open-sidepanel' });
el('q').value = '';
} else {
- const eng = SEARCH_ENGINES[searchEngine] || SEARCH_ENGINES.xprivo;
+ const eng = SEARCH_ENGINES[searchEngine] || SEARCH_ENGINES.neosearch;
location.href = eng.url + encodeURIComponent(q) + (eng.suffix || '');
}
});
diff --git a/apps/desktop/extensions/ai-sidebar/options.html b/apps/desktop/extensions/ai-sidebar/options.html
index 92bd0d9..267a949 100644
--- a/apps/desktop/extensions/ai-sidebar/options.html
+++ b/apps/desktop/extensions/ai-sidebar/options.html
@@ -105,12 +105,13 @@ bittorrented.com — Live TV, Radio & Podcasts
Search
- Default search engine for the new-tab search box. Xprivo is the
- private default; DuckDuckGo is available as an alternative. (The omnibox default
+
Default search engine for the new-tab search box. NeoSearch is the
+ private default; Xprivo, DuckDuckGo, and others are available as alternatives. (The omnibox default
is set separately in chrome://settings/search.)
New-tab search engine
- Xprivo (private, default)
+ NeoSearch (private, default)
+ Xprivo (private)
DuckDuckGo
Altpower
Oxiverse
diff --git a/apps/desktop/extensions/ai-sidebar/settings-sections.js b/apps/desktop/extensions/ai-sidebar/settings-sections.js
index 7f441f7..d2fc41f 100644
--- a/apps/desktop/extensions/ai-sidebar/settings-sections.js
+++ b/apps/desktop/extensions/ai-sidebar/settings-sections.js
@@ -42,7 +42,7 @@ export async function mountSettingsSections({ store, el, flash }) {
const cur = await store.get(['feeds', 'tickers', 'leagues', 'searchEngine']);
// Populate current values (on every mount, e.g. after a cloud pull).
- if (el('searchEngine')) el('searchEngine').value = cur.searchEngine || 'xprivo';
+ if (el('searchEngine')) el('searchEngine').value = cur.searchEngine || 'neosearch';
if (el('tickers')) el('tickers').value = cur.tickers ?? '';
if (el('leagues')) el('leagues').value = cur.leagues ?? '';
feeds = Array.isArray(cur.feeds) && cur.feeds.length ? cur.feeds.slice() : DEFAULT_FEEDS.slice();
diff --git a/apps/desktop/launcher/tronbrowser b/apps/desktop/launcher/tronbrowser
index fe333cc..28872a5 100755
--- a/apps/desktop/launcher/tronbrowser
+++ b/apps/desktop/launcher/tronbrowser
@@ -186,10 +186,9 @@ if flag not in exp:
PY
fi
-# Default the omnibox to Xprivo. Force this ONCE per profile (older builds
-# defaulted to DuckDuckGo, and seeding-only-when-empty left existing profiles on
-# DDG) via a marker file, then respect the user's chrome://settings/search choice.
-if command -v python3 >/dev/null 2>&1 && [ ! -f "$DATA/.tron-search-xprivo" ]; then
+# Default the omnibox to NeoSearch once per profile, then respect the user's
+# chrome://settings/search choice.
+if command -v python3 >/dev/null 2>&1 && [ ! -f "$DATA/.tron-search-neosearch" ]; then
TB_PREFS="$DATA/Default/Preferences" python3 - <<'PY' 2>/dev/null || true
import json, os
p = os.environ["TB_PREFS"]
@@ -199,15 +198,16 @@ try:
except Exception:
d = {}
d.setdefault("default_search_provider_data", {})["template_url_data"] = {
- "short_name": "Xprivo",
- "keyword": "xprivo.com",
- "url": "https://www.xprivo.com/search/?q={searchTerms}",
- "favicon_url": "https://www.xprivo.com/favicon.ico",
+ "short_name": "NeoSearch",
+ "keyword": "neosearch.org",
+ "url": "https://neosearch.org/?q={searchTerms}",
+ "suggestions_url": "https://neosearch.org/suggestions?q={searchTerms}",
+ "favicon_url": "https://neosearch.org/favicon-32x32.png",
"safe_for_autoreplace": False,
}
json.dump(d, open(p, "w"))
PY
- mkdir -p "$DATA"; : > "$DATA/.tron-search-xprivo"
+ mkdir -p "$DATA"; : > "$DATA/.tron-search-neosearch"
fi
# Show the feed (ai-sidebar New Tab page) on startup. We can't pass a startup URL —
diff --git a/apps/web/public/settings-sections.js b/apps/web/public/settings-sections.js
index 7f441f7..d2fc41f 100644
--- a/apps/web/public/settings-sections.js
+++ b/apps/web/public/settings-sections.js
@@ -42,7 +42,7 @@ export async function mountSettingsSections({ store, el, flash }) {
const cur = await store.get(['feeds', 'tickers', 'leagues', 'searchEngine']);
// Populate current values (on every mount, e.g. after a cloud pull).
- if (el('searchEngine')) el('searchEngine').value = cur.searchEngine || 'xprivo';
+ if (el('searchEngine')) el('searchEngine').value = cur.searchEngine || 'neosearch';
if (el('tickers')) el('tickers').value = cur.tickers ?? '';
if (el('leagues')) el('leagues').value = cur.leagues ?? '';
feeds = Array.isArray(cur.feeds) && cur.feeds.length ? cur.feeds.slice() : DEFAULT_FEEDS.slice();
diff --git a/apps/web/public/settings.html b/apps/web/public/settings.html
index cf068d1..034bb21 100644
--- a/apps/web/public/settings.html
+++ b/apps/web/public/settings.html
@@ -80,7 +80,8 @@ Search
Default search engine for the new-tab search box.
New-tab search engine
- Xprivo (private, default)
+ NeoSearch (private, default)
+ Xprivo (private)
DuckDuckGo
Altpower
Oxiverse