 
 (defn read-config* [config-path]
   (try
-    (-> (util/slurp config-path)
-        (#(reader/read-string {:readers {'shadow/env getenv}} %)))
+    (let [reader-opts
+          {:readers {'shadow/env getenv}}
+
+          config-txt
+          (util/slurp config-path)
+
+          rdr
+          (rt/source-logging-push-back-reader config-txt)]
+
+      (edn/read reader-opts rdr))
+
     (catch :default ex
-      ;; FIXME: missing tools.reader location information
-      ;; FIXME: show error location with excerpt like other warnings
-      (throw (ex-info (format "failed reading config file: %s" config-path) {:config-path config-path} ex)))))
+      (throw (ex-info
+               (format "Failed to read config file: %s\n%s" config-path (.-message ex))
+               {:config-path config-path} ex)))))
 
 (defn read-user-config []
   (let [config-path (path/resolve (os/homedir) ".shadow-cljs" "config.edn")]

    ["net" :as node-net]
    ["which" :as which]
    [cljs.core.async :as async :refer (go go-loop alt!)]
    #_[cljs.tools.reader :as reader]
    [cljs.reader :as reader]
    [clojure.string :as str]
    [goog.object :as gobj]

  (let [{:keys [tag] :as data}
        (ex-data ex)]

    (js/console.warn "===== ERROR =================")
    (js/console.warn (.-message ex))
    (js/console.warn "=============================")
    ))

(defn get-shared-home []
