Summary
Deep-linking to the Cluster tab on a collection page using a URL such as:
https://<host>/dashboard#/collections/<name>#cluster
works intermittently. When it fails, the UI/API returns 404 because the collection name is parsed as <name>#cluster instead of <name>.
Additionally, clicking the Cluster tab calls navigate('#cluster'), which can replace the route hash and drop the /collections/<name> path, breaking refresh and shareable URLs.
Steps to reproduce
- Deploy Qdrant with API key authentication enabled.
- Open the Web UI and configure a valid API key in settings.
- Ensure a collection exists (e.g.
sample).
- Navigate directly to:
https://<host>/dashboard#/collections/sample#cluster
- Observe: sometimes the Cluster tab loads; sometimes the page shows 404 / "collection not found".
- Alternatively:
- Open
https://<host>/dashboard#/collections/sample
- Click the Cluster tab
- Note the browser URL changes to
https://<host>/dashboard#cluster (route path lost)
- Refresh the page → collection context is lost
Expected behavior
#/collections/sample#cluster should consistently open the sample collection with the Cluster tab selected.
- Clicking a collection sub-tab should preserve the collection route in the URL so refresh and deep links work reliably.
Actual behavior
Intermittent 404 on deep link
The browser treats everything after the first # as a single fragment: /collections/sample#cluster. Depending on parse timing / router behavior, :collectionName may become sample#cluster. The API then returns:
{
"status": {
"error": "Not found: Collection `sample#cluster` doesn't exist!"
}
}
Tab navigation breaks route
In src/pages/Collection.jsx:
const [currentTab, setCurrentTab] = useState(location.hash.slice(1) || 'points');
const handleTabChange = (event, newValue) => {
setCurrentTab(newValue);
navigate(`#${newValue}`);
};
Calling navigate('#cluster') under HashRouter replaces the hash with #cluster, removing #/collections/<name> from the URL.
Root cause (proposed)
HashRouter uses the URL hash for route paths (#/collections/:collectionName), while Collection.jsx also uses the hash for tab state (#cluster, #points, etc.). Browsers only support one # fragment per URL, so route and tab compete for the same mechanism.
Suggested fix
One of:
- Query parameter for tabs — e.g.
#/collections/sample?tab=cluster
- Nested route segments — e.g.
#/collections/sample/cluster (add tab routes in routes.jsx)
- In-memory tab state only — don't call
navigate('#cluster'); update tab state without mutating the route hash
Environment
| Item |
Value |
| Qdrant version |
v1.18.2 |
| Web UI |
Bundled with Qdrant (served at /dashboard) |
| Router |
HashRouter (src/index.jsx) |
| Auth |
API key required; key via Web UI settings (localStorage) |
API endpoints used by Cluster tab work consistently when called directly (GET /collections/sample, GET /collections/sample/cluster, GET /cluster → all 200).
Workaround
- Open
https://<host>/dashboard#/collections/<name> (no #cluster suffix).
- Click the Cluster tab in the UI.
- Avoid refreshing after the URL collapses to
#cluster only.
References
src/pages/Collection.jsx
src/components/Collections/ClusterMonitor/ClusterMonitor.jsx
src/index.jsx
Summary
Deep-linking to the Cluster tab on a collection page using a URL such as:
works intermittently. When it fails, the UI/API returns 404 because the collection name is parsed as
<name>#clusterinstead of<name>.Additionally, clicking the Cluster tab calls
navigate('#cluster'), which can replace the route hash and drop the/collections/<name>path, breaking refresh and shareable URLs.Steps to reproduce
sample).https://<host>/dashboard#/collections/sample#clusterhttps://<host>/dashboard#/collections/samplehttps://<host>/dashboard#cluster(route path lost)Expected behavior
#/collections/sample#clustershould consistently open thesamplecollection with the Cluster tab selected.Actual behavior
Intermittent 404 on deep link
The browser treats everything after the first
#as a single fragment:/collections/sample#cluster. Depending on parse timing / router behavior,:collectionNamemay becomesample#cluster. The API then returns:{ "status": { "error": "Not found: Collection `sample#cluster` doesn't exist!" } }Tab navigation breaks route
In
src/pages/Collection.jsx:Calling
navigate('#cluster')underHashRouterreplaces the hash with#cluster, removing#/collections/<name>from the URL.Root cause (proposed)
HashRouteruses the URL hash for route paths (#/collections/:collectionName), whileCollection.jsxalso uses the hash for tab state (#cluster,#points, etc.). Browsers only support one#fragment per URL, so route and tab compete for the same mechanism.Suggested fix
One of:
#/collections/sample?tab=cluster#/collections/sample/cluster(add tab routes inroutes.jsx)navigate('#cluster'); update tab state without mutating the route hashEnvironment
/dashboard)HashRouter(src/index.jsx)API endpoints used by Cluster tab work consistently when called directly (
GET /collections/sample,GET /collections/sample/cluster,GET /cluster→ all 200).Workaround
https://<host>/dashboard#/collections/<name>(no#clustersuffix).#clusteronly.References
src/pages/Collection.jsxsrc/components/Collections/ClusterMonitor/ClusterMonitor.jsxsrc/index.jsx