diff --git a/shadow-cljs.edn b/shadow-cljs.edn
index fffe8512e68d3d56b1bed3d283bad49929af2ff6..03be358861f11c29a14bd1cb2d310994cf387b26 100644
--- a/shadow-cljs.edn
+++ b/shadow-cljs.edn
@@ -11,7 +11,9 @@
  {:app
   {:target     :npm-module
    :output-dir "frontend/src/cljs_release/"
-   :dev        {:output-dir "frontend/src/cljs/"}
+   :dev        {:output-dir "frontend/src/cljs/"
+                :compiler-options {:reader-features #{:cljs-dev}}}
+   :compiler-options {:reader-features #{:cljs-release}}
    :entries    [metabase.domain-entities.queries.util
                 metabase.mbql.js
                 metabase.types
diff --git a/src/metabase/util/devtools.cljc b/src/metabase/util/devtools.cljc
new file mode 100644
index 0000000000000000000000000000000000000000..3c0d8e45adc3693552912afd47281c24a39732dc
--- /dev/null
+++ b/src/metabase/util/devtools.cljc
@@ -0,0 +1,15 @@
+(ns metabase.util.devtools
+  "Preload magic to load cljs-devtools. Only imported by dev.js in dev mode; no-op in production."
+  ;; This special context is defined only for dev-mode shadow-cljs builds; see shadow-cljs.edn
+  ;; In release builds, and JVM Clojure, this file is an empty namespace.
+  #?(:cljs-dev (:require
+                 [devtools.core :as devtools])))
+
+#?(:cljs-dev
+   (do
+     ;; The advanced mode check is busted, it always assumes Webpack is advanced.
+     ;; The reader conditionals empty this file in release builds, plus it's only required
+     ;; from frontend/src/metabase/dev.js, which is replaced with dev-noop.js in release mode.
+     (devtools/set-pref! :disable-advanced-mode-check true)
+     (devtools/install!)
+     (js/console.log "CLJS Devtools loaded")))
diff --git a/src/metabase/util/devtools.cljs b/src/metabase/util/devtools.cljs
deleted file mode 100644
index cde2dd01b0d65b65efa64273617f87824eaf0886..0000000000000000000000000000000000000000
--- a/src/metabase/util/devtools.cljs
+++ /dev/null
@@ -1,11 +0,0 @@
-(ns metabase.util.devtools
-  "Preload magic to load cljs-devtools. Only imported by dev.js in dev mode; no-op in production."
-  (:require
-   [devtools.core :as devtools]))
-
-;; The advanced mode check is busted, it always assumes Webpack is advanced.
-;; This entire file is skipped for release builds; it's only required from frontend/src/metabase/dev.js
-(devtools/set-pref! :disable-advanced-mode-check true)
-(devtools/install!)
-
-(js/console.log "CLJS Devtools loaded")