diff --git a/web/vtadmin/src/components/routes/Vtctlds.tsx b/web/vtadmin/src/components/routes/Vtctlds.tsx
new file mode 100644
index 00000000000..5665f8d3158
--- /dev/null
+++ b/web/vtadmin/src/components/routes/Vtctlds.tsx
@@ -0,0 +1,90 @@
+/**
+ * Copyright 2021 The Vitess Authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { orderBy } from 'lodash';
+import { useMemo } from 'react';
+import { useVtctlds } from '../../hooks/api';
+import { useSyncedURLParam } from '../../hooks/useSyncedURLParam';
+import { filterNouns } from '../../util/filterNouns';
+import { DataCell } from '../dataTable/DataCell';
+import { DataFilter } from '../dataTable/DataFilter';
+import { DataTable } from '../dataTable/DataTable';
+import { ContentContainer } from '../layout/ContentContainer';
+import { WorkspaceHeader } from '../layout/WorkspaceHeader';
+import { WorkspaceTitle } from '../layout/WorkspaceTitle';
+
+export const Vtctlds = () => {
+ const { data: vtctlds = [], ...q } = useVtctlds();
+ const { value: filter, updateValue: updateFilter } = useSyncedURLParam('filter');
+
+ const data = useMemo(() => {
+ const mapped = vtctlds.map((v) => ({
+ cluster: v.cluster?.name,
+ clusterID: v.cluster?.id,
+ hostname: v.hostname,
+ fqdn: v.FQDN,
+ }));
+
+ const filtered = filterNouns(filter, mapped);
+
+ return orderBy(filtered, ['cluster', 'hostname']);
+ }, [filter, vtctlds]);
+
+ const renderRows = (rows: typeof data) => {
+ return rows.map((row) => {
+ return (
+
diff --git a/web/vtadmin/src/icons/index.tsx b/web/vtadmin/src/icons/index.tsx
index 9ddad6ebe32..464257fb194 100644
--- a/web/vtadmin/src/icons/index.tsx
+++ b/web/vtadmin/src/icons/index.tsx
@@ -40,6 +40,7 @@ export { ReactComponent as KeyK } from './keyK.svg';
export { ReactComponent as KeyR } from './keyR.svg';
export { ReactComponent as KeyS } from './keyS.svg';
export { ReactComponent as KeyT } from './keyT.svg';
+export { ReactComponent as KeyV } from './keyV.svg';
export { ReactComponent as Keyboard } from './keyboard.svg';
export { ReactComponent as Link } from './link.svg';
export { ReactComponent as PageFirst } from './pageFirst.svg';
diff --git a/web/vtadmin/src/icons/keyV.svg b/web/vtadmin/src/icons/keyV.svg
new file mode 100644
index 00000000000..07cc33d99e2
--- /dev/null
+++ b/web/vtadmin/src/icons/keyV.svg
@@ -0,0 +1,4 @@
+