Introduction¶
After equipping a model with a toolchain, a common issue is link quality. If you ask, “Do you have something to build a knowledge base?”, the model will likely recall a domain name from memory, write it up convincingly, but opening it results in a 404 or someone else’s site. Keeping the same batch of AI sites in the browser bookmarks bar takes longer to browse than to ask once.
naturalth2012/dsh-ai-nav targets this problem: it maintains a directory of verified AI websites, turns the entry point into a full wall of tiles in the sidebar, and hands the index over to the model as a tool. Below, I introduce its positioning, page capabilities, tools for the model, and installation/self-check methods.
What is it¶
A DSH plugin maintained by naturalth2012. After installation, an extra icon appears in the sidebar; clicking it opens the index page: a search box at the top and 95 entries across eight categories below. The purpose is stated bluntly—don’t keep flipping through the same batch of AI sites in your browser bookmarks anymore.
It solves two things at once: first, it provides a categorized entry point for humans; second, it gives the model a directory of real URLs, ensuring “what is found is a clickable address, not a link fabricated from memory.” The README explicitly states this is an “entry index,” not a “service promise”: whether it opens depends on the local network; overseas sites are usually not directly connectable in mainland China. This is a network reachability issue, not a broken link.
The positioning in package.json is dsh-ai-nav, version 1.0.0, license MIT, author naturalth2012.
What the page provides¶
The README lists the page areas in a table; here is an item-by-item explanation.
As you type in the search box, local candidates are provided. Matches include names, aliases, pinyin abbreviations, and domains; pressing Enter searches via the chosen engine. Next to candidates, there is “Site Search” (站内搜), which queries the site’s own search parameters. Sites without query parameters only offer “Open,” and search still uses the selected engine.
“Don’t know which to use” is scenario-based recommendation: describe a need in one sentence (e.g., “build a knowledge base for internal Q&A for the team”), and it recommends a complementary set based on the scenario, explaining why for each.
Pinning and Recent Access: A star appears when hovering over a tile; clicking pins or unpins it. Recent access automatically tracks the last 8, and repeated clicks on the same tile only keep one entry.
The categorized tile wall covers eight categories: Chat Assistants, AI Search & Deep Research, Knowledge Base & Notes, Coding & Agents, Images & Audio/Video, Office & Documents, Models & Communities, Learning & Resources, totaling 95 entries.
Add Site and Import Bookmarks: Manually add one, or select a browser-exported bookmarks HTML file (drag and drop is also supported), and known sites are automatically categorized.
Site icons go through the host’s same-origin proxy /plugins/ai-nav/favicon; the page itself does not connect directly to third parties. Icon parsing is divided into three steps; it stops if any step succeeds: first, try the site’s standard addresses (/favicon.ico, /apple-touch-icon.png, /favicon.png); second, try the root domain (e.g., chat.deepseek.com falls back to deepseek.com); finally, read the <link rel="icon"> declared in the page’s <head>.
The response body is judged as an image based on the first byte, because modern sites often return icons as application/octet-stream, and when an icon is missing, they often return 200 text/html. Checking only headers at either end would be wrong. Results are cached for 24 hours by domain; domains without icons are not retried within 20 minutes. If unavailable, a letter square colored by the domain is drawn.
Tools for the model¶
The plugin exposes six tools to the host; the README lists their uses as follows:
| Tool | Usage |
|---|---|
ai_nav_search |
Search directory by keyword, alias, or domain; return real URL, category, tags, and self-deployability |
ai_nav_recommend |
Recommend combinations based on a sentence of requirement; can limit to domestic direct access, only self-deployable, or prioritize free |
ai_nav_browse |
Browse categories and entries without keywords |
ai_nav_sites |
Manage custom sites and pins (list / add / remove / pin) |
ai_nav_import |
Import bookmarks file (provide content or local path) |
ai_nav_open |
Parse a sentence into an address to open: if it looks like a URL, open it; if it matches the directory, open the site; otherwise, search |
Two rules for directory quality¶
The README lists these two as the baseline for directory maintenance, written here because they determine whether this index is worth relying on.
- Every
urlis an officially verified entry that can be opened—having a 404 on a navigation site is worse than not listing it at all. - Only provide the
qsite search template if the site actually supports query parameters. Guessing a template results in a broken results page, which is the most annoying flaw of old-fashioned navigation sites.
Installation and enabling¶
Neither the README nor package.json provides a standalone installation command (e.g., dsh plugin add ... form). This article does not concatenate commands. You must read the source code to confirm behavior first, then load the plugin according to the host’s method.
The plugin’s entry declaration is in the dsh field of package.json:
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": {
"platform": "web",
"immediately": true,
"inject": ["@deepseek-ai/dsh-client-ui-conversation"]
}
}
bundle.patch points to ./cordis.patch.yml, which is the host-side patch entry. Configuration items are written in this file:
- insert:
- id: ai-nav
name: 'dsh-ai-nav'
config:
engine: metaso # Default search engine id (metaso / baidu / bing / google / perplexity …)
showSelfHost: true # Whether to show "self-deployable" entries
favicons: true # Whether to enable icon proxy (turn off to use all letter squares)
The engine selected in the page is saved to user data, taking precedence over the default value here.
It should be noted that the plugin runs with the permissions of the current DSH process. Before installing, check the source code and license. The license is MIT, and the repository address is https://github.com/naturalth2012/dsh-ai-nav.
Data location and write safety¶
Custom sites, pins, recent access, and engine selection are stored at $DSH_PROFILE_DIR/ai-nav/data.json, falling back to $DSH_HOME/ai-nav, and further falling back to ~/.dsh/ai-nav. Writing uses “temp file + rename”; corrupted files are treated as “no data” and won’t prevent the page from opening.
All stored links go through safeUrl() during write and read: only http(s): is accepted; javascript:, data:, and file: are all rejected.
Offline self-check¶
node scripts/selfcheck.mjs
Covers 138 pure function checks (directory integrity, alias vocabulary, sorting, URL guessing, bookmark parsing, recommendation, stored URL gating, icon candidate order and first-byte sniffing). No internet connection, no browser. Worth running after modifying catalog.js.
Code structure¶
The file list from the README is as follows:
| File | Content |
|---|---|
index.js |
Host side: directory assembly, same-origin routing, six tools, network part of icon proxy |
icon.js |
Icon strategy (pure functions): candidate order, first-byte sniffing, <link rel="icon"> parsing, caching and concurrency gating |
catalog.js |
Eight categories, twelve search engines, all built-in entries (pure data) |
search.js |
Normalization, tokenization, sorting, URL guessing, bookmark parsing, categorization |
recommend.js |
Scenario rules and recommendations (specificity weights prioritizing long words) |
store.js |
Writable state: custom sites, pins, recent, settings |
client.js |
Browser side: sidebar.panellist icon + main panel |
scripts/selfcheck.mjs |
Offline self-check |
Known boundaries¶
These boundaries come directly from the README, which is written specifically and is worth copying verbatim.
The directory is a manually maintained real entry point, not scraped; after a site redesign, individual links may need updating, which is done by modifying catalog.js. Site search only covers a few sites that actually support query parameters; for the rest, pressing Enter uses the search engine.
Recommendation is a rule engine, not a model call: it is explainable, testable offline, but does not understand expressions beyond the keyword list. The “max two per category” in recommendations is down-weighting, not filtering. Similar items after the second place are discounted based on the gap from the first place. Therefore, “write docs, make PPTs, organize meeting minutes” can return WPS AI, WorkBuddy, Feishu, Tencent Docs, and Tongyi Lingwu, rather than letting a 17-point chat assistant squeeze out an 83-point office tool.
The icon proxy limits each domain to 4 seconds and 96 KiB, follows at most one redirect, and rejects internal network addresses. It fetches 5 domains concurrently, merging requests for the same domain. If unavailable, it falls back to letter squares; the ratio of success depends on the local network; blocked sites are always squares.
Use cases¶
Suitable for two types of people. Those building DSH applications need a categorized, verified AI site index; it costs less to maintain than a custom bookmark list and provides a reliable query object for the model. Those interacting with models can use “recommended combinations” and “open address with one sentence” as ready-to-use capabilities without writing their own rules.
Not suitable as a means to access overseas sites: blocked sites’ icons and links will fail; the index itself does not solve network reachability.
Conclusion¶
The value of dsh-ai-nav lies not in the number of entries, but in “every link is verified” and “what is given to the model is a real URL.” If you are already using DSH and frequently use multiple AI sites, it is worth installing and trying.
Directory page: https://www.skillhub.cn/plugins/naturalth2012/dsh-ai-nav
GitHub: https://github.com/naturalth2012/dsh-ai-nav
The plugin runs with the permissions of the current DSH process. Before installing, please check the source code and MIT license.