diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6a9d6d97..5266a319 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -70,7 +70,7 @@ importers:
         specifier: ^4.5.0
         version: 4.5.0(vite@5.0.2)(vue@3.3.8)
       vite:
-        specifier: ^5.0.1
+        specifier: ^5.0.2
         version: 5.0.2(@types/node@18.18.10)
 
   template/config/cypress:
@@ -128,15 +128,16 @@ importers:
       ts-node:
         specifier: ^10.9.1
         version: 10.9.1(@types/node@18.18.10)(typescript@5.2.2)
-      wait-on:
-        specifier: ^7.2.0
-        version: 7.2.0(debug@4.3.4)
 
   template/config/nightwatch-ct:
     dependencies:
       vue:
         specifier: ^3.3.8
         version: 3.3.8(typescript@5.2.2)
+    devDependencies:
+      '@vue/test-utils':
+        specifier: ^2.4.2
+        version: 2.4.2(vue@3.3.8)
 
   template/config/pinia:
     dependencies:
diff --git a/scripts/test.mjs b/scripts/test.mjs
index cab7b948..fa1a43dc 100644
--- a/scripts/test.mjs
+++ b/scripts/test.mjs
@@ -1,9 +1,6 @@
 #!/usr/bin/env zx
 import 'zx/globals'
 
-// Vitest would otherwise enable watch mode by default.
-process.env.CI = '1'
-
 const playgroundDir = path.resolve(__dirname, '../playground/')
 let projects = fs
   .readdirSync(playgroundDir, { withFileTypes: true })
@@ -21,7 +18,13 @@ for (const projectName of projects) {
   cd(path.resolve(playgroundDir, projectName))
   const packageJSON = require(path.resolve(playgroundDir, projectName, 'package.json'))
 
-  console.log(`Building ${projectName}`)
+  console.log(`
+  
+#####
+Building ${projectName}
+#####
+  
+  `)
   await $`pnpm build`
 
   if ('@playwright/test' in packageJSON.devDependencies) {
@@ -35,6 +38,16 @@ for (const projectName of projects) {
 
   if ('test:unit' in packageJSON.scripts) {
     console.log(`Running unit tests in ${projectName}`)
-    await $`pnpm test:unit`
+    if (projectName.includes('vitest') || projectName.includes('with-tests')) {
+      // Vitest would otherwise enable watch mode by default.
+      await $`CI=1 pnpm test:unit`
+    } else {
+      await $`pnpm test:unit`
+    }
+  }
+
+  if ('type-check' in packageJSON.scripts) {
+    console.log(`Running type-check in ${projectName}`)
+    await $`pnpm type-check`
   }
 }
diff --git a/template/base/package.json b/template/base/package.json
index 5798b2de..fa842a77 100644
--- a/template/base/package.json
+++ b/template/base/package.json
@@ -10,6 +10,6 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^4.5.0",
-    "vite": "^5.0.1"
+    "vite": "^5.0.2"
   }
 }
diff --git a/template/config/nightwatch-ct/package.json b/template/config/nightwatch-ct/package.json
index 9299618b..8982106f 100644
--- a/template/config/nightwatch-ct/package.json
+++ b/template/config/nightwatch-ct/package.json
@@ -1,8 +1,11 @@
 {
   "scripts": {
-    "test:unit": "nightwatch src/components/**/__tests__/*"
+    "test:unit": "nightwatch src/**/__tests__/*"
   },
   "dependencies": {
     "vue": "^3.3.8"
+  },
+  "devDependencies": {
+    "@vue/test-utils": "^2.4.2"
   }
 }
diff --git a/template/config/nightwatch/nightwatch.conf.js b/template/config/nightwatch/nightwatch.conf.js
index 8ff17000..05889c61 100644
--- a/template/config/nightwatch/nightwatch.conf.js
+++ b/template/config/nightwatch/nightwatch.conf.js
@@ -30,10 +30,11 @@ module.exports = {
   plugins: ['@nightwatch/vue'],
 
   // See https://nightwatchjs.org/guide/concepts/test-globals.html#external-test-globals
-  globals_path: 'nightwatch/globals.js',
+  globals_path: '',
 
   vite_dev_server: {
-    start_vite: false
+    start_vite: true,
+    port: process.env.CI ? 4173 : 5173
   },
 
   webdriver: {},
diff --git a/template/config/nightwatch/nightwatch/globals.js b/template/config/nightwatch/nightwatch/globals.js
deleted file mode 100644
index 9387d355..00000000
--- a/template/config/nightwatch/nightwatch/globals.js
+++ /dev/null
@@ -1,23 +0,0 @@
-const waitOn = require('wait-on')
-const { setup, teardown } = require('@nightwatch/vue')
-
-const serverPort = process.env.CI ? '4173' : '5173'
-
-module.exports = {
-  before(done) {
-    setup()
-    waitOn({
-      resources: [`http-get://localhost:${serverPort}`],
-      verbose: true,
-      headers: {
-        accept: 'text/html'
-      }
-    }).then(() => {
-      done()
-    })
-  },
-
-  after() {
-    teardown()
-  }
-}
diff --git a/template/config/nightwatch/package.json b/template/config/nightwatch/package.json
index a77d512d..4f281a77 100644
--- a/template/config/nightwatch/package.json
+++ b/template/config/nightwatch/package.json
@@ -1,6 +1,6 @@
 {
   "scripts": {
-    "test:e2e": "nightwatch tests/e2e"
+    "test:e2e": "nightwatch tests/e2e/*"
   },
   "devDependencies": {
     "nightwatch": "^3.3.2",
@@ -9,7 +9,6 @@
     "@types/nightwatch": "^2.3.28",
     "geckodriver": "^4.2.1",
     "chromedriver": "^119.0.0",
-    "ts-node": "^10.9.1",
-    "wait-on": "^7.2.0"
+    "ts-node": "^10.9.1"
   }
 }
diff --git a/template/config/nightwatch/tests/e2e/example.js b/template/config/nightwatch/tests/e2e/example.js
index cf2e3c86..43be3fce 100644
--- a/template/config/nightwatch/tests/e2e/example.js
+++ b/template/config/nightwatch/tests/e2e/example.js
@@ -4,10 +4,7 @@ describe('My First Test', function () {
   })
 
   it('visits the app root url', function () {
-    browser.assert
-      .textContains('.green', 'You did it!')
-      .assert.elementHasCount('.wrapper nav a', 2)
-      .strictClick('.wrapper nav a:last-child')
+    browser.assert.textContains('.green', 'You did it!')
   })
 
   after((browser) => browser.end())
diff --git a/template/tsconfig/nightwatch/nightwatch/tsconfig.json b/template/tsconfig/nightwatch/nightwatch/tsconfig.json
index 652d9bd6..b4b031b9 100644
--- a/template/tsconfig/nightwatch/nightwatch/tsconfig.json
+++ b/template/tsconfig/nightwatch/nightwatch/tsconfig.json
@@ -3,6 +3,7 @@
   "compilerOptions": {
     "target": "ESNext",
     "module": "commonjs",
+    "moduleResolution": "node",
     "composite": true,
     "rootDir": "../",
     "lib": ["ESNext", "dom"],
@@ -10,7 +11,7 @@
   },
   "include": ["../node_modules/@nightwatch/**/*", "../src/components/**/*", "../tests/e2e/**/*"],
   "ts-node": {
-    "files": true
+    "transpileOnly": true
   },
   "files": ["nightwatch.d.ts"]
 }
diff --git a/utils/filterList.ts b/utils/filterList.ts
index dd9f9c46..37780156 100644
--- a/utils/filterList.ts
+++ b/utils/filterList.ts
@@ -1,5 +1 @@
-export const FILES_TO_FILTER = [
-  'nightwatch.e2e.conf.js',
-  'nightwatch.component.conf.js',
-  'globals.js'
-]
+export const FILES_TO_FILTER = ['nightwatch.e2e.conf.js', 'nightwatch.component.conf.js']