diff --git a/gdk.example.yml b/gdk.example.yml
index b86e0ec1c884f4374fa5c506c6b99e29e6968626..a23b39b727ee0280e907477a0f9cfe2789802f90 100644
--- a/gdk.example.yml
+++ b/gdk.example.yml
@@ -446,6 +446,7 @@ vault:
   port: 8200
 vite:
   enabled: false
+  hot_module_reloading: true
   port: 3038
 webpack:
   allowed_hosts: []
diff --git a/lib/gdk/config.rb b/lib/gdk/config.rb
index 1462e8489dd78ebfb6cd047cf9f97617cbad8521..ab653fcb1438929f09e5a57f12b53b596455737c 100644
--- a/lib/gdk/config.rb
+++ b/lib/gdk/config.rb
@@ -165,6 +165,7 @@ class Config < ConfigSettings
     settings :vite do
       bool(:enabled) { false }
       port(:port, 'vite')
+      bool(:hot_module_reloading) { true }
 
       bool(:__safe_enabled) do
         if config.vite?
diff --git a/spec/lib/gdk/config_spec.rb b/spec/lib/gdk/config_spec.rb
index f88166c4ac88a8cda0a7a1ff41c55b129a253534..ebbbc27c8b219f06adb9203d7410a6f4cf4ce3dd 100644
--- a/spec/lib/gdk/config_spec.rb
+++ b/spec/lib/gdk/config_spec.rb
@@ -1966,6 +1966,12 @@
       end
     end
 
+    describe '#hot_module_reloading' do
+      it 'is enabled by default' do
+        expect(config.vite.hot_module_reloading?).to be true
+      end
+    end
+
     describe '#__safe_enabled?' do
       it 'is false by default' do
         expect(config.vite.__safe_enabled?).to be false
diff --git a/spec/support/templates/gitlab/config/vite.gdk.json.erb_spec.rb b/spec/support/templates/gitlab/config/vite.gdk.json.erb_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7acf16c380f3c93f86d4802b2ddebcf978853c35
--- /dev/null
+++ b/spec/support/templates/gitlab/config/vite.gdk.json.erb_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+RSpec.describe 'support/templates/gitlab/config/vite.gdk.json.erb' do
+  let(:vite_settings) { {} }
+  let(:nginx_settings) { {} }
+  let(:yaml) do
+    {
+      'hostname' => 'gdk.test',
+      'vite' => vite_settings,
+      'nginx' => nginx_settings,
+      'webpack' => {
+        'enabled' => false
+      }
+    }
+  end
+
+  let(:source) { |example| example.example_group.top_level_description }
+
+  before do
+    config = GDK::Config.new(yaml: yaml)
+    allow(GDK).to receive(:config).and_return(config)
+  end
+
+  subject(:output) do
+    renderer = GDK::Templates::ErbRenderer.new(source)
+    JSON.parse(renderer.render_to_string)
+  end
+
+  context 'with defaults' do
+    let(:vite_settings) { {} }
+
+    it do
+      expect(output).to eq({
+        'enabled' => false,
+        'host' => '127.0.0.1',
+        'port' => 3038,
+        'hmr' => {
+          'clientPort' => 3038,
+          'hostname' => 'gdk.test'
+        }
+      })
+    end
+  end
+
+  context 'with hot module reloading disabled' do
+    let(:vite_settings) {  { 'enabled' => true, 'port' => 3011, 'hot_module_reloading' => false } }
+
+    it 'sets hmr to nil' do
+      expect(output).to eq({
+        'enabled' => true,
+        'host' => '127.0.0.1',
+        'port' => 3011,
+        'hmr' => nil
+      })
+    end
+  end
+
+  context 'when vite is enabled' do
+    let(:vite_settings) { { 'enabled' => true, 'port' => 3011 } }
+
+    it do
+      expect(output).to eq({
+        'enabled' => true,
+        'host' => '127.0.0.1',
+        'port' => 3011,
+        'hmr' => {
+          'clientPort' => 3011,
+          'hostname' => 'gdk.test'
+        }
+      })
+    end
+
+    context 'and nginx is enabled' do
+      let(:nginx_settings) { { 'enabled' => true } }
+
+      it 'sets the nginx port in hash' do
+        expect(output).to eq({
+          'enabled' => true,
+          'host' => '127.0.0.1',
+          'port' => 3011,
+          'hmr' => {
+            'clientPort' => 3000,
+            'hostname' => 'gdk.test'
+          }
+        })
+      end
+    end
+  end
+end
diff --git a/support/templates/gitlab/config/vite.gdk.json.erb b/support/templates/gitlab/config/vite.gdk.json.erb
index 8900b2f188abf0b7c4722e80e6cf26692ce37726..593bc179f612864a7f74acaf0e3785ad95a22b95 100644
--- a/support/templates/gitlab/config/vite.gdk.json.erb
+++ b/support/templates/gitlab/config/vite.gdk.json.erb
@@ -1 +1,19 @@
-<%= JSON.pretty_generate({ enabled: config.vite.__safe_enabled?, port: config.vite.port }) %>
+<% hmr =
+  (
+    if config.vite.hot_module_reloading?
+      {
+        clientPort: (config.nginx? ? config.port : config.vite.port),
+        hostname: config.hostname,
+      }
+    else
+      nil
+    end
+  ) -%>
+<%= JSON.pretty_generate(
+  {
+    enabled: config.vite.__safe_enabled?,
+    host: config.listen_address,
+    port: config.vite.port,
+    hmr: hmr,
+  },
+) %>
diff --git a/support/templates/nginx/conf/nginx.conf.erb b/support/templates/nginx/conf/nginx.conf.erb
index 5b34997fdc67ccd0556a78415b02adf2a0a78d3c..e5a35217fe5e999c22d094dfd1e62ea744dd6b2a 100644
--- a/support/templates/nginx/conf/nginx.conf.erb
+++ b/support/templates/nginx/conf/nginx.conf.erb
@@ -90,12 +90,16 @@ http {
       proxy_request_buffering off;
     }
 
-<%- if config.webpack.live_reload? -%>
-
+<%- if config.webpack? && config.webpack.live_reload? -%>
     location /_hmr/ {
       proxy_pass http://<%= config.webpack.host %>:<%= config.webpack.port %>/ws;
     }
+<%- end -%>
 
+<%- if config.vite? && config.vite.hot_module_reloading? -%>
+    location /vite-dev/ {
+      proxy_pass http://<%= config.listen_address %>:<%= config.vite.port %>/vite-dev/;
+    }
 <%- end -%>
 
     location / {