diff --git a/.eslintrc.yaml b/.eslintrc.yaml
index 8495972640..689a4f919c 100644
--- a/.eslintrc.yaml
+++ b/.eslintrc.yaml
@@ -18,6 +18,7 @@ plugins:
   - eslint-plugin-regexp
   - eslint-plugin-sonarjs
   - eslint-plugin-unicorn
+  - eslint-plugin-vitest-globals
   - eslint-plugin-wc
 
 env:
@@ -45,6 +46,9 @@ overrides:
   - files: ["*.config.*"]
     rules:
       import/no-unused-modules: [0]
+  - files: ["**/*.test.*", "web_src/js/test/setup.js"]
+    env:
+      vitest-globals/env: true
   - files: ["web_src/js/modules/fetch.js", "web_src/js/standalone/**/*"]
     rules:
       no-restricted-syntax: [2, WithStatement, ForInStatement, LabeledStatement, SequenceExpression]
diff --git a/package-lock.json b/package-lock.json
index 54ab43c117..e5fec6aa96 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -67,6 +67,7 @@
         "eslint-plugin-regexp": "1.15.0",
         "eslint-plugin-sonarjs": "0.21.0",
         "eslint-plugin-unicorn": "48.0.1",
+        "eslint-plugin-vitest-globals": "1.4.0",
         "eslint-plugin-vue": "9.17.0",
         "eslint-plugin-vue-scoped-css": "2.5.0",
         "eslint-plugin-wc": "2.0.3",
@@ -4963,6 +4964,12 @@
         "eslint": ">=8.44.0"
       }
     },
+    "node_modules/eslint-plugin-vitest-globals": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vitest-globals/-/eslint-plugin-vitest-globals-1.4.0.tgz",
+      "integrity": "sha512-WE+YlK9X9s4vf5EaYRU0Scw7WItDZStm+PapFSYlg2ABNtaQ4zIG7wEqpoUB3SlfM+SgkhgmzR0TeJOO5k3/Nw==",
+      "dev": true
+    },
     "node_modules/eslint-plugin-vue": {
       "version": "9.17.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz",
diff --git a/package.json b/package.json
index 94c30030d5..fb0ee33998 100644
--- a/package.json
+++ b/package.json
@@ -66,6 +66,7 @@
     "eslint-plugin-regexp": "1.15.0",
     "eslint-plugin-sonarjs": "0.21.0",
     "eslint-plugin-unicorn": "48.0.1",
+    "eslint-plugin-vitest-globals": "1.4.0",
     "eslint-plugin-vue": "9.17.0",
     "eslint-plugin-vue-scoped-css": "2.5.0",
     "eslint-plugin-wc": "2.0.3",
diff --git a/vitest.config.js b/vitest.config.js
index 49f59ba982..9a6cb4e560 100644
--- a/vitest.config.js
+++ b/vitest.config.js
@@ -11,6 +11,7 @@ export default defineConfig({
     open: false,
     allowOnly: true,
     passWithNoTests: true,
+    globals: true,
     watch: false,
   },
   plugins: [
diff --git a/web_src/js/features/common-issue-list.test.js b/web_src/js/features/common-issue-list.test.js
index 271acc718a..da7ea64b7c 100644
--- a/web_src/js/features/common-issue-list.test.js
+++ b/web_src/js/features/common-issue-list.test.js
@@ -1,4 +1,3 @@
-import {test, expect} from 'vitest';
 import {parseIssueListQuickGotoLink} from './common-issue-list.js';
 
 test('parseIssueListQuickGotoLink', () => {
diff --git a/web_src/js/features/repo-code.test.js b/web_src/js/features/repo-code.test.js
index 3bd1973c1f..0e0062a787 100644
--- a/web_src/js/features/repo-code.test.js
+++ b/web_src/js/features/repo-code.test.js
@@ -1,4 +1,3 @@
-import {test, expect} from 'vitest';
 import {singleAnchorRegex, rangeAnchorRegex} from './repo-code.js';
 
 test('singleAnchorRegex', () => {
diff --git a/web_src/js/features/repo-findfile.test.js b/web_src/js/features/repo-findfile.test.js
index a90b0bf0a2..2d96ed4463 100644
--- a/web_src/js/features/repo-findfile.test.js
+++ b/web_src/js/features/repo-findfile.test.js
@@ -1,4 +1,3 @@
-import {describe, expect, test} from 'vitest';
 import {strSubMatch, calcMatchedWeight, filterRepoFilesWeighted} from './repo-findfile.js';
 
 describe('Repo Find Files', () => {
diff --git a/web_src/js/modules/fetch.test.js b/web_src/js/modules/fetch.test.js
index ec0377b4d9..e4bec3ced9 100644
--- a/web_src/js/modules/fetch.test.js
+++ b/web_src/js/modules/fetch.test.js
@@ -1,4 +1,3 @@
-import {test, expect} from 'vitest';
 import {GET, POST, PATCH, PUT, DELETE} from './fetch.js';
 
 // tests here are only to satisfy the linter for unused functions
diff --git a/web_src/js/modules/toast.test.js b/web_src/js/modules/toast.test.js
index b5066df0b2..357f18dbcd 100644
--- a/web_src/js/modules/toast.test.js
+++ b/web_src/js/modules/toast.test.js
@@ -1,4 +1,3 @@
-import {test, expect} from 'vitest';
 import {showInfoToast, showErrorToast, showWarningToast} from './toast.js';
 
 test('showInfoToast', async () => {
diff --git a/web_src/js/render/ansi.test.js b/web_src/js/render/ansi.test.js
index b4793251df..5afff71c29 100644
--- a/web_src/js/render/ansi.test.js
+++ b/web_src/js/render/ansi.test.js
@@ -1,4 +1,3 @@
-import {expect, test} from 'vitest';
 import {renderAnsi} from './ansi.js';
 
 test('renderAnsi', () => {
diff --git a/web_src/js/svg.test.js b/web_src/js/svg.test.js
index 5db2f65ac8..06b320c860 100644
--- a/web_src/js/svg.test.js
+++ b/web_src/js/svg.test.js
@@ -1,4 +1,3 @@
-import {expect, test} from 'vitest';
 import {svg, SvgIcon, svgParseOuterInner} from './svg.js';
 import {createApp, h} from 'vue';
 
diff --git a/web_src/js/utils.test.js b/web_src/js/utils.test.js
index db9b1a14a3..2754e41c43 100644
--- a/web_src/js/utils.test.js
+++ b/web_src/js/utils.test.js
@@ -1,4 +1,3 @@
-import {expect, test} from 'vitest';
 import {
   basename, extname, isObject, stripTags, parseIssueHref,
   parseUrl, translateMonth, translateDay, blobToDataURI,
diff --git a/web_src/js/utils/color.test.js b/web_src/js/utils/color.test.js
index 7d45d191a0..e129109ef0 100644
--- a/web_src/js/utils/color.test.js
+++ b/web_src/js/utils/color.test.js
@@ -1,4 +1,3 @@
-import {test, expect} from 'vitest';
 import {useLightTextOnBackground} from './color.js';
 
 test('useLightTextOnBackground', () => {
diff --git a/web_src/js/utils/match.test.js b/web_src/js/utils/match.test.js
index 5dfbd932f4..1e30b451d4 100644
--- a/web_src/js/utils/match.test.js
+++ b/web_src/js/utils/match.test.js
@@ -1,4 +1,3 @@
-import {test, expect} from 'vitest';
 import {matchEmoji, matchMention} from './match.js';
 
 test('matchEmoji', () => {
diff --git a/web_src/js/utils/url.test.js b/web_src/js/utils/url.test.js
index ef2ffaa5f9..3dbedec94f 100644
--- a/web_src/js/utils/url.test.js
+++ b/web_src/js/utils/url.test.js
@@ -1,4 +1,3 @@
-import {expect, test} from 'vitest';
 import {pathEscapeSegments} from './url.js';
 
 test('pathEscapeSegments', () => {