diff --git a/src/core/utils/getInternalConfig.ts b/src/core/utils/getInternalConfig.ts
index 034428d30..3ebcc3169 100644
--- a/src/core/utils/getInternalConfig.ts
+++ b/src/core/utils/getInternalConfig.ts
@@ -122,6 +122,7 @@ export async function getInternalConfig(
   );
   finalConfig.vite.plugins.push(plugins.devServerGlobals(finalConfig));
   finalConfig.vite.plugins.push(plugins.tsconfigPaths(finalConfig));
+  finalConfig.vite.plugins.push(plugins.hmrLogger(finalConfig));
 
   finalConfig.vite.define ??= {};
   getGlobals(finalConfig).forEach((global) => {
diff --git a/src/core/vite-plugins/hmrLogger.ts b/src/core/vite-plugins/hmrLogger.ts
new file mode 100644
index 000000000..f3e6e4f58
--- /dev/null
+++ b/src/core/vite-plugins/hmrLogger.ts
@@ -0,0 +1,25 @@
+import { Plugin } from 'vite';
+import { InternalConfig } from '../types';
+import { relative } from 'path';
+import pc from 'picocolors';
+
+/**
+ * Log when HMR changes are fired
+ */
+export function hmrLogger(config: InternalConfig): Plugin {
+  return {
+    name: 'wxt:hmr-logger',
+    apply: 'serve',
+    handleHotUpdate(ctx) {
+      if (
+        ctx.file.startsWith(config.srcDir) &&
+        !ctx.file.startsWith(config.wxtDir) &&
+        !ctx.file.endsWith('.html')
+      ) {
+        config.logger.info(
+          'Hot reload: ' + pc.dim(relative(process.cwd(), ctx.file)),
+        );
+      }
+    },
+  };
+}
diff --git a/src/core/vite-plugins/index.ts b/src/core/vite-plugins/index.ts
index 8264ce4b7..e8c01a673 100644
--- a/src/core/vite-plugins/index.ts
+++ b/src/core/vite-plugins/index.ts
@@ -5,3 +5,4 @@ export * from './multipageMove';
 export * from './unimport';
 export * from './virtualEntrypoint';
 export * from './tsconfigPaths';
+export * from './hmrLogger';
diff --git a/src/index.ts b/src/index.ts
index 5bf5cd081..33d44de32 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -64,7 +64,7 @@ export async function createServer(
       if (changes.type === 'no-change') return;
 
       // Log the entrypoints that were effected
-      consola.info(
+      internalConfig.logger.info(
         `Changed: ${Array.from(new Set(fileChanges.map((change) => change[1])))
           .map((file) => pc.dim(relative(internalConfig.root, file)))
           .join(', ')}`,