diff --git a/.github/workflows/build-and-release.yaml b/.github/workflows/build-and-release.yaml
index 0123cca..9c27545 100644
--- a/.github/workflows/build-and-release.yaml
+++ b/.github/workflows/build-and-release.yaml
@@ -39,7 +39,7 @@ jobs:
         run: |
           touch gokuw
           echo '#!/bin/sh' >> gokuw
-          echo 'watchexec -r -w `[[ -z $GOKU_EDN_CONFIG_FILE ]] && echo ~/.config/karabiner.edn || echo $GOKU_EDN_CONFIG_FILE` goku' >> gokuw
+          echo 'watchexec -r -e edn -w `[[ -z $GOKU_EDN_CONFIG_FILE ]] && echo ~/.config/karabiner.edn || echo $GOKU_EDN_CONFIG_FILE` goku' >> gokuw
           chmod +x gokuw
       - name: Pack
         run: zip -r goku.zip goku.zip goku gokuw # https://github.com/actions/virtual-environments/issues/2619#issuecomment-778827140
diff --git a/CHANGELOG.org b/CHANGELOG.org
index f05b1d6..215aaeb 100644
--- a/CHANGELOG.org
+++ b/CHANGELOG.org
@@ -3,7 +3,14 @@ All notable changes to this project will be documented in this file. This change
 
 ** Unreleased
 
-[Unreleased Commits]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.5.3...HEAD
+[Unreleased Commits]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.5.4...HEAD
+** 0.5.4 - 2022-07-12
+*** Changed 
+- use ~/bin/zsh~ instead of ~/bin/sh~ in launch agent https://github.com/yqrashawn/homebrew-goku/blob/9a4f6cd23f51535e046a33fe260876630fc20292/Formula/goku.rb#L28
+- fix joker PATH
+- run through clj-kondo
+
+[commits in 0.5.4]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.5.3...v0.5.4
 
 ** 0.5.3 - 2022-05-16
 
@@ -61,8 +68,8 @@ All notable changes to this project will be documented in this file. This change
 - support simultaneous pointing_button
 #+NAME: sim key in from
 #+BEGIN_SRC clojure
-  {:des "sim pkey in from"
-   :rules [[[{:pkey :button5} {:pkey :button2}] {:pkey :button1}]]}
+{:des "sim pkey in from"
+ :rules [[[{:pkey :button5} {:pkey :button2}] {:pkey :button1}]]}
 #+END_SRC
 
 [commits in 0.3.10]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.3.9...v0.3.10
@@ -108,18 +115,18 @@ All notable changes to this project will be documented in this file. This change
 - ~:applications~ now supports ~file_paths~
 [[https://karabiner-elements.pqrs.org/docs/json/complex-modifications-manipulator-definition/conditions/frontmost-application/][karabiner-elements documentation about file_paths]]
 #+BEGIN_SRC clojure
-  {...
-   :applications
-   {:Chromes ["^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" :paths "^/Applications/Google Chrome\\.app"]
-    ;; same as
-    :Chromes [:identifiers "^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" :paths "^/Applications/Google Chrome\\.app"]
-
-    ;; can specify multiple :paths or :identifiers (can omit keyword :identifiers)
-    :Chromes [:identifiers "^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$"
-              :paths "^/Applications/Google Chrome\\.app" "^/Applications/Google Chrome Canary\\.app"]
-
-    ;; paths only (can't omit keyword :paths)
-    :Chromes [:paths "^/Applications/.*Chrom.*"]}}
+{...
+ :applications
+ {:Chromes ["^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" :paths "^/Applications/Google Chrome\\.app"]
+  ;; same as
+  :Chromes [:identifiers "^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$" :paths "^/Applications/Google Chrome\\.app"]
+
+  ;; can specify multiple :paths or :identifiers (can omit keyword :identifiers)
+  :Chromes [:identifiers "^org\\.chromium\\.Chromium$" "^com\\.google\\.Chrome\\.canary$"
+            :paths "^/Applications/Google Chrome\\.app" "^/Applications/Google Chrome Canary\\.app"]
+
+  ;; paths only (can't omit keyword :paths)
+  :Chromes [:paths "^/Applications/.*Chrom.*"]}}
 #+END_SRC
 
 [commits in 0.3.4]: https://github.com/yqrashawn/GokuRakuJoudo/compare/v0.3.3...0.3.4
@@ -292,9 +299,9 @@ both stderr and stdout.
 
 ;; now we can do it with predefined layer
 {:layers {:wlayer {:key :w}}
-  :main [{:des "w layer"
-          :rules [[:e "open -a Emacs.app" :wlayer]
-                  [:s "open -a Safari.app" :wlayer]]}]}
+ :main [{:des "w layer"
+         :rules [[:e "open -a Emacs.app" :wlayer]
+                 [:s "open -a Safari.app" :wlayer]]}]}
 #+end_src
 
 - group rules by conditions
diff --git a/src/karabiner_configurator/conditions.clj b/src/karabiner_configurator/conditions.clj
index b83722d..6910bf1 100644
--- a/src/karabiner_configurator/conditions.clj
+++ b/src/karabiner_configurator/conditions.clj
@@ -1,15 +1,15 @@
 (ns karabiner-configurator.conditions
   (:require
-   [karabiner-configurator.misc :refer :all]
-   [karabiner-configurator.data :refer :all]))
+   [karabiner-configurator.data :refer [conf-data simlayers? input-sources? devices?]]
+   [karabiner-configurator.misc :refer [massert]]))
 
-(def used-simlayers-config nil)
+(def used-simlayers-config (atom nil))
 
 (defn update-used-simlayers-config [config]
-  (def used-simlayers-config config))
+  (reset! used-simlayers-config config))
 
 (defn cleanup-used-simlayers-config []
-  (def used-simlayers-config nil))
+  (reset! used-simlayers-config nil))
 
 (defn is-simple-set-variable? [vec]
   (and (= 2 (count vec)) (string? (first vec)) (number? (second vec))))
@@ -19,23 +19,23 @@
     []
     (vec
      (for [condi condis
-           :let [validate-condi
+           :let [_validate-condi
                  (massert (or (and (vector? condi) (is-simple-set-variable? condi)) (keyword? condi))
                           (str "invalid condition " condi ", must be a keyword or simple condition definition"))
-                 condi!? (if (keyword? condi) (= \! (first (vec (name condi)))))
+                 condi!? (when (keyword? condi) (= \! (first (vec (name condi)))))
                  condi (if condi!? (keyword (subs (name condi) 1))
                            condi)
                  result nil
                  condi-type (if condi!?
                               "frontmost_application_unless"
                               "frontmost_application_if")
-                 result (if (and (keyword? condi) (nn? (condi (:applications conf-data))))
-                          (let [this-condi (condi (:applications conf-data))
-                                this-condi (if (= (first this-condi) :identifiers) this-condi (into [:identifiers] (condi (:applications conf-data))))
+                 result (if (and (keyword? condi) (some? (condi (:applications @conf-data))))
+                          (let [this-condi (condi (:applications @conf-data))
+                                this-condi (if (= (first this-condi) :identifiers) this-condi (into [:identifiers] (condi (:applications @conf-data))))
                                 [identifiers paths] [(into [] (rest (take-while (complement #{:paths}) this-condi))) (into [] (rest (drop-while (complement #{:paths}) this-condi)))]
                                 [identifiers paths] [(or identifiers []) (or paths [])]
-                                identifiers? (not (empty? identifiers))
-                                paths? (not (empty? paths))
+                                identifiers? (seq identifiers)
+                                paths? (seq paths)
                                 rst {:type condi-type}
                                 rst (if identifiers? (assoc rst :bundle_identifiers identifiers) rst)
                                 rst (if paths? (assoc rst :file_paths paths) rst)]
@@ -46,7 +46,7 @@
                               "device_if")
                  result (if (and (keyword? condi) (devices? condi))
                           {:identifiers
-                           (vec (condi (:devices conf-data)))
+                           (vec (condi (:devices @conf-data)))
                            :type condi-type}
                           result)
                  condi-type (if condi!?
@@ -54,7 +54,7 @@
                               "input_source_if")
                  result (if (and (keyword? condi) (input-sources? condi))
                           {:input_sources
-                           [(condi (:input-sources conf-data))]
+                           [(condi (:input-sources @conf-data))]
                            :type condi-type}
                           result)
                  condi-type (if condi!?
@@ -62,12 +62,11 @@
                               "variable_if")
                  result (if (and (keyword? condi) (simlayers? condi))
                           (do
-                            (if (and from to (not condi!?))
-                              (do
-                                (update-used-simlayers-config (condi (:simlayers conf-data)))
-                                (update-used-simlayers-config (assoc-in used-simlayers-config [:from :sim]
-                                                                        (vec (conj (:sim (:from used-simlayers-config))
-                                                                                   (keyword (:key_code from))))))))
+                            (when (and from to (not condi!?))
+                              (update-used-simlayers-config (condi (:simlayers @conf-data)))
+                              (update-used-simlayers-config (assoc-in @used-simlayers-config [:from :sim]
+                                                                      (vec (conj (:sim (:from @used-simlayers-config))
+                                                                                 (keyword (:key_code from)))))))
 
                             ;; so that we can filter simlayer conditions in the
                             ;; none sim one and concat it into the sim one
@@ -76,8 +75,8 @@
                                         :type condi-type}
                               {:simlayer condi}))
                           result)
-                 result (if (and (keyword? condi) (nn? (or (condi (:layers conf-data))
-                                                           (condi layers))))
+                 result (if (and (keyword? condi) (some? (or (condi (:layers @conf-data))
+                                                             (condi layers))))
                           (with-meta {:name (name condi)
                                       :value 1
                                       :type condi-type}
@@ -96,6 +95,6 @@
                            :value 1
                            :type condi-type}
                           result)
-                 validate-result (massert (nn? result)
-                                          (str "invalid condition keyword " condi ", can't find in any predefined conditions"))]]
+                 _validate-result (massert (some? result)
+                                           (str "invalid condition keyword " condi ", can't find in any predefined conditions"))]]
        result))))
diff --git a/src/karabiner_configurator/core.clj b/src/karabiner_configurator/core.clj
index d3f49c3..7728152 100644
--- a/src/karabiner_configurator/core.clj
+++ b/src/karabiner_configurator/core.clj
@@ -1,51 +1,45 @@
 (ns karabiner-configurator.core
   (:require
    [cheshire.core :as json]
-   [clojure.string :as string]
    [clojure.java.shell :as shell]
-   [karabiner-configurator.modifiers :as modifiers]
-   [karabiner-configurator.misc :refer :all]
-   [karabiner-configurator.data :refer :all]
-   [karabiner-configurator.layers :as layers]
+   [clojure.string :as string]
+   [clojure.tools.cli :as cli]
+   [environ.core :refer [env]]
+   [karabiner-configurator.data :as d]
    [karabiner-configurator.froms :as froms]
-   [karabiner-configurator.tos :as tos]
-   [karabiner-configurator.rules :as rules]
+   [karabiner-configurator.layers :as layers]
+   [karabiner-configurator.misc :refer [load-edn load-json massert]]
+   [karabiner-configurator.modifiers :as modifiers]
    [karabiner-configurator.profiles :as profiles]
-   [clojure.edn :as edn]
-   [me.raynes.fs :as fs]
-   [clojure.tools.cli :as cli]
-   [environ.core :refer [env]])
+   [karabiner-configurator.rules :as rules]
+   [karabiner-configurator.tos :as tos]
+   [me.raynes.fs :as fs])
   (:gen-class))
 
 ;; helper function
 (defn update-static-conf
   "Helper function to update conf-data from reading rules"
   [key conf]
-  (if (nn? conf)
-    (assoc-conf-data key conf)))
+  (when (some? conf)
+    (d/assoc-conf-data key conf)))
 
 (defn check-edn-syntax
   "Call joker to check syntax of karabiner.edn"
   [path]
-  (let [;; intel mac
-        joker-bin1 "/usr/local/opt/joker/bin/joker"
-        ;; arm mac
-        joker-bin2 "/opt/homebrew/opt/joker/bin/joker"
-        ;; nix
-        joker-bin3 (str (System/getenv "HOME") "/.nix-profile/bin/joker")
-        ;; fallback to which joker
-        joker-bin (cond (fs/exists? joker-bin1) joker-bin1
-                        (fs/exists? joker-bin2) joker-bin2
-                        (fs/exists? joker-bin3) joker-bin3
-                        :else (-> (shell/sh "which" "joker")
-                                  :out
-                                  (string/trim-newline)
-                                  (str "/bin/joker")))]
-    (shell/sh joker-bin "--lint" path)))
+  (let [sys-env (into {} (System/getenv))]
+    (shell/sh "joker" "--lint" path
+              :env (merge
+                    sys-env
+                    {"PATH"
+                     (str "/etc/profiles/per-user/" (System/getenv "USER") "/bin:" ;; nix profile
+                          "/run/current-system/sw/bin:" ;; nix darwin multiuser
+                          "/opt/homebrew/bin:"          ;; arm homebrew
+                          "/usr/local/bin:"             ;; homebrew
+                          (get sys-env "PATH"))}))))
 
 (defn exit [status & [msg]]
-  (if msg (println msg))
-  (if (not (env :is-dev)) (System/exit status)))
+  (when msg (println msg))
+  (when-not (env :is-dev) (System/exit status)))
 
 ;; paths
 (defn json-config-file-path
@@ -73,17 +67,18 @@
 (defn parse-edn
   "Init conf data and return new rules based on karabiner.edn (main section in edn file)"
   [conf]
-  (init-conf-data)
-  (let [{:keys [applications devices keyboard-type input-sources tos froms modifiers layers simlayers raws main simlayer-threshold templates profiles]} conf]
+  (d/init-conf-data)
+  (let [{:keys [applications devices keyboard-type input-sources tos froms modifiers layers simlayers ;; raws
+                main simlayer-threshold templates profiles]} conf]
     (if (nil? profiles)
-      (profiles/parse-profiles (:profiles conf-data))
+      (profiles/parse-profiles (:profiles d/conf-data))
       (profiles/parse-profiles profiles))
     (update-static-conf :applications applications)
     (update-static-conf :devices devices)
     (update-static-conf :keyboard-type keyboard-type)
     (update-static-conf :input-sources input-sources)
     (update-static-conf :templates templates)
-    (if (number? simlayer-threshold)
+    (when (number? simlayer-threshold)
       (update-static-conf :simlayer-threshold simlayer-threshold))
     (modifiers/parse-modifiers modifiers)
     (layers/parse-layers layers)
@@ -103,10 +98,10 @@
                                 (:profiles karabiner-config)]
                             {(keyword (:name json-profile))
                              json-profile}))]
-    (doseq [[profile-k profile-v] customized-profiles]
+    (doseq [[profile-k _] customized-profiles]
       (let [profile-name-str (name profile-k)]
         (massert
-         (nn? (profile-k user-profiles))
+         (some? (profile-k user-profiles))
          (format
           "Can't find profile named \"%s\" in karabiner.json, please create a profile named \"%s\" using the Karabiner-Elements.app."
           profile-name-str
@@ -143,17 +138,17 @@
   "Root function to parse karabiner.edn and update karabiner.json."
   [path & [dry-run dry-run-all]]
   (let [edn-syntax-err (:err (check-edn-syntax path))]
-    (if (> (count edn-syntax-err) 0)
-      (do (println "Syntax error in config:")
-          (println edn-syntax-err)
-          (exit 1))))
+    (when (> (count edn-syntax-err) 0)
+      (println "Syntax error in config:")
+      (println edn-syntax-err)
+      (exit 1)))
   (update-to-karabiner-json (parse-edn (load-edn path)) dry-run dry-run-all))
 
 (defn open-log-file []
   (shell/sh "open" (log-file)))
 ;; cli stuff
 
-(defn help-message [options-summary]
+(defn help-message [_]
   (->> ["GokuRakuJoudo -- karabiner configurator"
         ""
         "goku will read config file and update `Goku` profile in karabiner.json"
@@ -233,8 +228,9 @@
 ;; main
 (defn -main
   [& args]
-  (let [{:keys [action options exit-message ok? config dry-run dry-run-all]} (validate-args args)]
-    (if exit-message
+  (let [{:keys [action ;; options
+                exit-message ok? config dry-run dry-run-all]} (validate-args args)]
+    (when exit-message
       (case action
         "run" (do (parse (or config (edn-config-file-path)) dry-run dry-run-all)
                   (exit (if ok? 0 1) exit-message))
diff --git a/src/karabiner_configurator/data.clj b/src/karabiner_configurator/data.clj
index 7550ac9..66b9665 100644
--- a/src/karabiner_configurator/data.clj
+++ b/src/karabiner_configurator/data.clj
@@ -1,56 +1,57 @@
 (ns karabiner-configurator.data
   (:require
-   [karabiner-configurator.keys-info :refer :all]
-   [karabiner-configurator.misc :refer :all]))
+   [karabiner-configurator.keys-info :refer [keys-info]]
+   [karabiner-configurator.misc :refer [contains?? massert]]))
 
-(declare rule-id)
+(def rule-id (atom nil))
 
 (defn init-rule-id []
-  (def rule-id -1))
+  (reset! rule-id -1))
 
-(defn next-rule-id
-  "return the next rule id
+;; (defn next-rule-id
+;;   "return the next rule id
 
-   store each rule in a vector and use the index as their id
-   the data structure will also store conditions used in the rule
-   so that we know what condition used in each profile"
-  []
-  (def rule-id (inc rule-id))
-  rule-id)
+;;    store each rule in a vector and use the index as their id
+;;    the data structure will also store conditions used in the rule
+;;    so that we know what condition used in each profile"
+;;   []
+;;   (swap! rule-id inc)
+;;   @rule-id)
 
-(declare conf-data)
+(def conf-data (atom {}))
+(def user-default-profile-name (atom :Default))
 
 (defn init-conf-data
   []
   (init-rule-id)
-  (def user-default-profile-name :Default)
-  (def conf-data {:profiles {:Default {:sim 50 ;; basic.simultaneous_threshold_milliseconds
-                                       :delay 500 ;; basic.to_delayed_action_delay_milliseconds
-                                       :alone 1000 ;; basic.to_if_alone_timeout_milliseconds
-                                       :held 500 ;; basic.to_if_held_down_threshold_milliseconds
-                                       :default true}}
-                  :applications {}
-                  :devices {}
-                  :input-sources {}
-                  :modifiers {}
-                  :froms {}
-                  :tos {}
-                  :layers {}
-                  :simlayers {}
-                  :simlayer-threshold 250}))
-
-(defn applications? [k] (nn? (k (:applications conf-data))))
-(defn devices? [k] (nn? (k (:devices conf-data))))
-(defn input-sources? [k] (nn? (k (:input-sources conf-data))))
-(defn modifiers? [k] (nn? (k (:modifiers conf-data))))
-(defn froms? [k] (nn? (k (:froms conf-data))))
-(defn layers? [k] (nn? (k (:layers conf-data))))
-(defn simlayers? [k] (nn? (k (:simlayers conf-data))))
+  (reset! user-default-profile-name :Default)
+  (reset! conf-data {:profiles {:Default {:sim 50 ;; basic.simultaneous_threshold_milliseconds
+                                          :delay 500 ;; basic.to_delayed_action_delay_milliseconds
+                                          :alone 1000 ;; basic.to_if_alone_timeout_milliseconds
+                                          :held 500 ;; basic.to_if_held_down_threshold_milliseconds
+                                          :default true}}
+                     :applications {}
+                     :devices {}
+                     :input-sources {}
+                     :modifiers {}
+                     :froms {}
+                     :tos {}
+                     :layers {}
+                     :simlayers {}
+                     :simlayer-threshold 250}))
+
+;; (defn applications? [k] (some? (k (:applications @conf-data))))
+(defn devices? [k] (some? (k (:devices @conf-data))))
+(defn input-sources? [k] (some? (k (:input-sources @conf-data))))
+;; (defn modifiers? [k] (some? (k (:modifiers @conf-data))))
+;; (defn froms? [k] (some? (k (:froms @conf-data))))
+;; (defn layers? [k] (some? (k (:layers @conf-data))))
+(defn simlayers? [k] (some? (k (:simlayers @conf-data))))
 (defn templates? [k-or-vec]
   (cond (keyword? k-or-vec)
-        (contains? (:templates conf-data) k-or-vec)
+        (contains? (:templates @conf-data) k-or-vec)
         (vector? k-or-vec)
-        (contains? (:templates conf-data) (first k-or-vec))))
+        (contains? (:templates @conf-data) (first k-or-vec))))
 (defn noti? [vec]
   (and (vector? vec)
        (let [[k id text] vec]
@@ -66,25 +67,19 @@
            (= :mouse_motion_to_scroll (:type rule)))))
 
 (defn profile? [k]
-  (and (keyword? k) (k (:profiles conf-data))))
-
-(def default-profile {:Default {:sim 50 ;; basic.simultaneous_threshold_milliseconds
-                                :delay 500 ;; basic.to_delayed_action_delay_milliseconds
-                                :alone 1000 ;; basic.to_if_alone_timeout_milliseconds
-                                :held 500 ;; basic.to_if_held_down_threshold_milliseconds
-                                :default true}})
+  (and (keyword? k) (k (:profiles @conf-data))))
 
-(def user-default-profile-name :Default)
+;; (def default-profile {:Default {:sim 50 ;; basic.simultaneous_threshold_milliseconds
+;;                                 :delay 500 ;; basic.to_delayed_action_delay_milliseconds
+;;                                 :alone 1000 ;; basic.to_if_alone_timeout_milliseconds
+;;                                 :held 500 ;; basic.to_if_held_down_threshold_milliseconds
+;;                                 :default true}})
 
 (defn update-user-default-profile-name [profile-name]
   (massert
    (keyword? profile-name)
    (str "invalid profile name " profile-name ", profile name must be a keyword"))
-  (def user-default-profile-name profile-name))
-
-(defn special-modi-k?
-  [k]
-  (and (keyword? k) (or (= \! (first (name k))) (= \# (first (name k))))))
+  (reset! user-default-profile-name profile-name))
 
 (defn pkey?
   [pkeymap]
@@ -102,8 +97,8 @@
 
 (defn k?
   [k]
-  (if (keyword? k)
-    (nn? (k keys-info))))
+  (when (keyword? k)
+    (some? (k keys-info))))
 
 (defn modifier-k?
   [k]
@@ -138,43 +133,42 @@
 
 (defn mouse-keyword?
   [k]
-  (nn? (k mkey-keyword)))
+  (some? (k mkey-keyword)))
 
 (defn mouse-key-name
   [k]
   (massert (mouse-keyword? k) (str "invalid mouse key keyword " k))
   (:name (k mkey-keyword)))
 
-(defn special-modi-k?
-  [k]
-  (if (keyword? k)
+(defn special-modi-k? [k]
+  (when (keyword? k)
     (contains?? [\! \#] (first (name k)))))
 
-(defn find-condition-keyword
-  [kw]
-  (cond (contains? (:applications conf-data))
-        {:name :application
-         :value (kw (:applications conf-data))}
-        (contains? (:devices conf-data))
-        {:name :devices
-         :value (kw (:devices conf-data))}
-        (contains? (:input-sources conf-data))
-        {:name :input-sources
-         :value (kw (:input-sources conf-data))}
-        (contains? (:simlayers conf-data))
-        {:name :simlayers
-         :value (kw (:simlayers conf-data))}))
+;; (defn find-condition-keyword
+;;   [kw]
+;;   (cond (contains? @conf-data :applications)
+;;         {:name :application
+;;          :value (kw (:applications @conf-data))}
+;;         (contains? @conf-data :devices)
+;;         {:name :devices
+;;          :value (kw (:devices @conf-data))}
+;;         (contains? @conf-data :input-sources)
+;;         {:name :input-sources
+;;          :value (kw (:input-sources @conf-data))}
+;;         (contains? @conf-data :simlayers)
+;;         {:name :simlayers
+;;          :value (kw (:simlayers @conf-data))}))
 
 (defn update-conf-data
   [data]
-  (def conf-data data))
+  (reset! conf-data data))
 
 (defn assoc-conf-data
   [key data]
-  (def conf-data (assoc conf-data key data)))
+  (swap! conf-data assoc key data))
 
 (defn assoc-in-conf-data
   [keys-vector data]
-  (def conf-data (assoc-in conf-data keys-vector data)))
+  (swap! conf-data assoc-in keys-vector data))
 
-(def output "output data that will convert into json string" [])
+;; (def output "output data that will convert into json string" [])
diff --git a/src/karabiner_configurator/froms.clj b/src/karabiner_configurator/froms.clj
index 8887362..f3b4a55 100644
--- a/src/karabiner_configurator/froms.clj
+++ b/src/karabiner_configurator/froms.clj
@@ -1,10 +1,9 @@
 (ns karabiner-configurator.froms
   (:require
-   [karabiner-configurator.misc :refer :all]
-   [karabiner-configurator.data :refer :all]
-   [karabiner-configurator.keys :refer :all]
-   [karabiner-configurator.tos :as tos]
-   [karabiner-configurator.modifiers :as kmodifier]))
+   [karabiner-configurator.data :refer [conf-data from-k? k? pkey? update-conf-data]]
+   [karabiner-configurator.keys :refer [parse-key]]
+   [karabiner-configurator.misc :refer [contains?? massert]]
+   [karabiner-configurator.tos :as tos]))
 
 ;; this file parse from event definition
 ;; spec: https://karabiner-elements.pqrs.org/docs/json/complex-modifications-manipulator-definition/from/
@@ -100,8 +99,8 @@
         vec))
 
 (defn parse-simo
-  [sim simo simo-op-value simo-op-keyword result]
-  (if (and (nn? sim) (nn? simo-op-value))
+  [sim _simo simo-op-value simo-op-keyword result]
+  (if (and (some? sim) (some? simo-op-value))
     (do (massert (or (contains?? [true false] simo-op-value)
                      (and (keyword? simo-op-value)
                           (contains?? (:values (simo-op-keyword simo-keywords)) simo-op-value)))
@@ -109,7 +108,7 @@
         (if (keyword? simo-op-value) ;; there're true false
           (assoc-in result [:simultaneous_options (:name (simo-op-keyword simo-keywords))] (name simo-op-value))
           (assoc-in result [:simultaneous_options (:name (simo-op-keyword simo-keywords))] simo-op-value)))
-    (if (nn? sim)
+    (if (some? sim)
       (assoc-in
        result
        [:simultaneous_options (:name (simo-op-keyword simo-keywords))]
@@ -120,7 +119,7 @@
   [fname finfo prevresult]
   (let [result                                   prevresult
         {:keys [sim simo]}                       finfo
-        result                                   (if (nn? sim) (assoc result :simultaneous (parse-keycode-or-pkey-vec fname sim)) result)
+        result                                   (if (some? sim) (assoc result :simultaneous (parse-keycode-or-pkey-vec fname sim)) result)
         {:keys [interrupt dorder uorder upwhen]} simo
         result                                   (parse-simo sim simo interrupt :interrupt result)
         result                                   (parse-simo sim simo dorder :dorder result)
@@ -143,7 +142,7 @@
     result))
 
 (defn generate [froms]
-  (assoc conf-data :froms
+  (assoc @conf-data :froms
          (into
           {}
           ;; fname is the name of the from
@@ -155,5 +154,5 @@
                (parse-from fname finfo))}))))
 
 (defn parse-froms [froms]
-  (if (nn? froms)
+  (when (some? froms)
     (update-conf-data (generate froms))))
diff --git a/src/karabiner_configurator/keys.clj b/src/karabiner_configurator/keys.clj
index 39ec11f..451c00c 100644
--- a/src/karabiner_configurator/keys.clj
+++ b/src/karabiner_configurator/keys.clj
@@ -1,9 +1,9 @@
 (ns karabiner-configurator.keys
   (:require
-   [karabiner-configurator.misc :refer :all]
-   [karabiner-configurator.data :refer :all]
-   [karabiner-configurator.modifiers :as kmodifier]
-   [clojure.string :refer [includes? join]]))
+   [clojure.string :refer [includes? join]]
+   [karabiner-configurator.data :as d]
+   [karabiner-configurator.misc :refer [contains?? massert]]
+   [karabiner-configurator.modifiers :as kmodifier]))
 
 (def any-key-keywords {:consumer_key_code {}
                        :pointing_button {}
@@ -11,21 +11,21 @@
 
 (defn parse-keycode [keycode & [from-to]]
   (if from-to
-    (massert (to-k? keycode) (str "invalid key code " keycode " can't be used in from"))
-    (massert (from-k? keycode) (str "invalid key code " keycode " can't be used in from")))
+    (massert (d/to-k? keycode) (str "invalid key code " keycode " can't be used in from"))
+    (massert (d/from-k? keycode) (str "invalid key code " keycode " can't be used in from")))
   keycode)
 
 (defn parse-ckey [ckey]
-  (massert (consumer-k? ckey) (str "invalid consumer key code " ckey))
+  (massert (d/consumer-k? ckey) (str "invalid consumer key code " ckey))
   ckey)
 
 (defn parse-pkey [pkey]
-  (massert (pointing-k? pkey) (str "invalid pointing key code " pkey))
+  (massert (d/pointing-k? pkey) (str "invalid pointing key code " pkey))
   pkey)
 
 (defn update-mouse-map
   [[k v]]
-  [(mouse-key-name k) v])
+  [(d/mouse-key-name k) v])
 
 (defn parse-mkey
   [mkey]
@@ -36,26 +36,26 @@
 (def special-modi-optional-re #"(^#[#CSTOQWERFP]+)")
 (def special-modi-optional-both-re #"(#[#CSTOQWERFP]+)")
 
-(defn special-modi-realkey [smodi]
-  (let [keystr (name smodi)
-        both (re-find special-modi-re keystr)
-        mandatory (if both
-                    (re-find special-modi-mandatory-re (first both))
-                    (re-find special-modi-mandatory-re keystr))
-        optional (if both
-                   (re-find special-modi-optional-both-re (first both))
-                   (re-find special-modi-optional-re keystr))
-        validate (massert (or both mandatory optional)
-                          (str "invalid special modifier keyword " smodi))
-        mandatory (if mandatory (first mandatory) nil)
-        optional (if optional (first optional) nil)
-        realkey (cond both
-                      (keyword (subs keystr (count (first both))))
-                      (and mandatory (not both))
-                      (keyword (subs keystr (count mandatory)))
-                      (and optional (not both))
-                      (keyword (subs keystr (count optional))))]
-    realkey))
+;; (defn special-modi-realkey [smodi]
+;;   (let [keystr (name smodi)
+;;         both (re-find special-modi-re keystr)
+;;         mandatory (if both
+;;                     (re-find special-modi-mandatory-re (first both))
+;;                     (re-find special-modi-mandatory-re keystr))
+;;         optional (if both
+;;                    (re-find special-modi-optional-both-re (first both))
+;;                    (re-find special-modi-optional-re keystr))
+;;         validate (massert (or both mandatory optional)
+;;                           (str "invalid special modifier keyword " smodi))
+;;         mandatory (if mandatory (first mandatory) nil)
+;;         optional (if optional (first optional) nil)
+;;         realkey (cond both
+;;                       (keyword (subs keystr (count (first both))))
+;;                       (and mandatory (not both))
+;;                       (keyword (subs keystr (count mandatory)))
+;;                       (and optional (not both))
+;;                       (keyword (subs keystr (count optional))))]
+;;     realkey))
 
 (defn special-modi-vector-to-modifiers
   [vec]
@@ -123,8 +123,8 @@
         optional (if both
                    (re-find special-modi-optional-both-re (first both))
                    (re-find special-modi-optional-re keystr))
-        validate (massert (or both mandatory optional)
-                          (str "invalid special modifier keyword " smodi))
+        _validate (massert (or both mandatory optional)
+                           (str "invalid special modifier keyword " smodi))
         mandatory (if mandatory (first mandatory) nil)
         optional (if optional (first optional) nil)
         realkey (cond both
@@ -133,8 +133,8 @@
                       (keyword (subs keystr (count mandatory)))
                       (and optional (not both))
                       (keyword (subs keystr (count optional))))
-        validate-realkey (massert (k? realkey)
-                                  (str "invalid special key keyword " smodi ", no key " realkey))
+        _validate-realkey (massert (d/k? realkey)
+                                   (str "invalid special key keyword " smodi ", no key " realkey))
         result (assoc result :key_code (name realkey))
         mandatory (if mandatory (into [] (subs mandatory 1)) nil)
         optional (if optional (into [] (subs optional 1)) nil)
@@ -148,28 +148,28 @@
   [kname kinfo & [mandatory-only from-to]]
   (let [{:keys [key ckey pkey any modi mkey]} kinfo
         result {}
-        special-modi? (special-modi-k? key)
-        _both-special-modi-and-modi? (massert (not (and special-modi? (nn? modi))) (str "can't use special modi and modi togeher, check " kname))
-        predefined-modi? (and (keyword? modi) (contains?? (:modifiers conf-data) modi))
+        special-modi? (d/special-modi-k? key)
+        _both-special-modi-and-modi? (massert (not (and special-modi? (some? modi))) (str "can't use special modi and modi togeher, check " kname))
+        predefined-modi? (and (keyword? modi) (contains?? (:modifiers @d/conf-data) modi))
         _valid-modifier-definition? (massert (or (nil? modi) (map? modi)
-                                                 (vector? modi) (modifier-k? modi)
+                                                 (vector? modi) (d/modifier-k? modi)
                                                  predefined-modi?)
                                              (str "invalid modifier definition " modi " in " kname))
-        _valid-any-keyword? (if any (massert (any any-key-keywords) (str "invalid :any keyword " (name any) " in " kname)))
+        _valid-any-keyword? (when any (massert (any any-key-keywords) (str "invalid :any keyword " (name any) " in " kname)))
         mandatory-only? (true? mandatory-only)
         result (if special-modi? (parse-special-modi key result mandatory-only) result)
-        result (if (and (not special-modi?) (nn? modi))
+        result (if (and (not special-modi?) (some? modi))
                  (if (not predefined-modi?)
                    (if mandatory-only?
                      (assoc result :modifiers (:mandatory (kmodifier/parse-single-modifier-definition modi kname)))
                      (assoc result :modifiers (kmodifier/parse-single-modifier-definition modi kname)))
                    (if mandatory-only?
-                     (assoc result :modifiers (:mandatory (modi (:modifiers conf-data))))
-                     (assoc result :modifiers (modi (:modifiers conf-data)))))
+                     (assoc result :modifiers (:mandatory (modi (:modifiers @d/conf-data))))
+                     (assoc result :modifiers (modi (:modifiers @d/conf-data)))))
                  result)
-        result (if (and (not (:key_code result)) (nn? key)) (assoc result :key_code (name (parse-keycode key from-to))) result)
-        result (if (nn? ckey) (assoc result :consumer_key_code (name (parse-ckey ckey))) result)
-        result (if (nn? pkey) (assoc result :pointing_button (name (parse-pkey pkey))) result)
-        result (if (and (nn? any) (any any-key-keywords)) (assoc result :any (name any)) result)
-        result (if (nn? mkey) (assoc result :mouse_key (parse-mkey mkey)) result)]
+        result (if (and (not (:key_code result)) (some? key)) (assoc result :key_code (name (parse-keycode key from-to))) result)
+        result (if (some? ckey) (assoc result :consumer_key_code (name (parse-ckey ckey))) result)
+        result (if (some? pkey) (assoc result :pointing_button (name (parse-pkey pkey))) result)
+        result (if (and (some? any) (any any-key-keywords)) (assoc result :any (name any)) result)
+        result (if (some? mkey) (assoc result :mouse_key (parse-mkey mkey)) result)]
     result))
diff --git a/src/karabiner_configurator/layers.clj b/src/karabiner_configurator/layers.clj
index 874a22a..7fedb20 100644
--- a/src/karabiner_configurator/layers.clj
+++ b/src/karabiner_configurator/layers.clj
@@ -1,19 +1,19 @@
 (ns karabiner-configurator.layers
   (:require
-   [karabiner-configurator.conditions :refer :all]
+   [karabiner-configurator.conditions :refer [is-simple-set-variable? parse-conditions]]
+   [karabiner-configurator.data :as d]
    [karabiner-configurator.froms :as froms]
-   [karabiner-configurator.tos :as tos]
-   [karabiner-configurator.data :refer :all]
-   [karabiner-configurator.misc :refer :all]))
+   [karabiner-configurator.misc :refer [dissoc-in massert]]
+   [karabiner-configurator.tos :as tos]))
 
 (defn generate-simlayers
   [simlayers]
   (doseq [[k v] simlayers]
-    (let [validate-simlayer
+    (let [_validate-simlayer
           (massert (and
-                    (nn? v)
-                    (nn? (:key v))
-                    (k? (:key v)))
+                    (some? v)
+                    (some? (:key v))
+                    (d/k? (:key v)))
                    (str "invalid simlayer definition " k))
           modi           (:modi v)
           modi-mandatory (:mandatory modi)
@@ -21,20 +21,20 @@
           _              (when modi (massert (or modi-mandatory modi-optional) "expect :mandatory or :optional to be defined"))
           modi-mandatory (cond (nil? modi-mandatory) nil (vector? modi-mandatory) modi-mandatory :else [modi-mandatory])
           modi-optional  (cond (nil? modi-optional) nil (vector? modi-optional) modi-optional :else [modi-optional])
-          _              (when modi (massert (or (and modi-mandatory (every? modifier-k? modi-mandatory))
-                                                 (and modi-optional (every? modifier-k? modi-optional)))
+          _              (when modi (massert (or (and modi-mandatory (every? d/modifier-k? modi-mandatory))
+                                                 (and modi-optional (every? d/modifier-k? modi-optional)))
                                              "expect modifier keys in :mandatory or :optional"))
           condi          (:condi v)
           condi          (if (or (keyword? condi) (map? condi)) [condi] condi)
-          validate-condition
+          _validate-condition
           (massert (or (nil? condi)
-                       (and (nn? condi) (vector? condi)))
+                       (and (some? condi) (vector? condi)))
                    (str "invalid condition definition in simlayer " k ", condition must be a vector or map or keyword"))
           afterup        (:afterup v)
           key            (:key v)
-          result         (:simlayers conf-data)
+          result         (:simlayers @d/conf-data)
           result         (assoc result k {:type       "basic"
-                                          :parameters {:basic.simultaneous_threshold_milliseconds (:simlayer-threshold conf-data)}
+                                          :parameters {:basic.simultaneous_threshold_milliseconds (:simlayer-threshold @d/conf-data)}
                                           :to         [{:set [(name k) 1]}]
                                           :from       {:sim  [key]
                                                        :simo {:interrupt true
@@ -45,32 +45,32 @@
           result         (if afterup
                            (assoc-in result [k :from :simo :afterup] (into [] (flatten [(get-in result [k :from :simo :afterup]) afterup])))
                            result)
-          result         (if (nn? condi)
+          result         (if (some? condi)
                            (if (is-simple-set-variable? condi)
                              (assoc-in result [k :conditions] (parse-conditions [condi]))
                              (assoc-in result [k :conditions] (parse-conditions condi)))
                            result)]
-      (update-conf-data (assoc conf-data :simlayers result)))))
+      (d/update-conf-data (assoc @d/conf-data :simlayers result)))))
 
 (defn generate-layers
   [layers]
   (doseq [[k v] layers]
-    (let [validate-layer
+    (let [_validate-layer
           (massert (and
-                    (nn? v)
-                    (nn? (:key v))
-                    (k? (:key v)))
+                    (some? v)
+                    (some? (:key v))
+                    (d/k? (:key v)))
                    (str "invalid layer definition " k))
           condi (:condi v)
           condi (if (or (keyword? condi) (map? condi)) [condi] condi)
-          validate-condition
+          _validate-condition
           (massert (or (nil? condi)
-                       (and (nn? condi) (vector? condi)))
+                       (and (some? condi) (vector? condi)))
                    (str "invalid condition definition in layer " k ", condition must be a vector or map or keyword"))
           afterup (:afterup v)
           alone (:alone v)
           key (:key v)
-          result (:layers conf-data)
+          result (:layers @d/conf-data)
           result (assoc result k {:type "basic"
                                   :to [{:set [(name k) 1]}]
                                   :alone [{:key key}]
@@ -91,17 +91,17 @@
           result (assoc-in result [k :from] (froms/parse-from (str "auto insert definition of layer" (name k)) (:from (k result))))
           result (dissoc-in result [k :afterup])
           result (dissoc-in result [k :alone])
-          result (if (nn? condi)
+          result (if (some? condi)
                    (if (is-simple-set-variable? condi)
                      (assoc-in result [k :conditions] (parse-conditions [condi] nil nil layers))
                      (assoc-in result [k :conditions] (parse-conditions condi nil nil layers)))
                    result)]
-      (update-conf-data (assoc conf-data :layers result)))))
+      (d/update-conf-data (assoc @d/conf-data :layers result)))))
 
 (defn parse-simlayers [simlayers]
-  (if (nn? simlayers)
+  (if (some? simlayers)
     (generate-simlayers simlayers)))
 
 (defn parse-layers [layers]
-  (if (nn? layers)
+  (if (some? layers)
     (generate-layers layers)))
diff --git a/src/karabiner_configurator/misc.clj b/src/karabiner_configurator/misc.clj
index 68c7257..a057d5c 100644
--- a/src/karabiner_configurator/misc.clj
+++ b/src/karabiner_configurator/misc.clj
@@ -1,7 +1,7 @@
 (ns karabiner-configurator.misc
-  (:require [clojure.java.io :as io]
-            [cheshire.core :as json]
+  (:require [cheshire.core :as json]
             [clojure.edn :as edn]
+            [clojure.java.io :as io]
             [environ.core :refer [env]]))
 
 (defn massert
@@ -12,14 +12,12 @@
       (assert exp error-str)
       (try
         (assert exp error-str)
-        (catch AssertionError e
+        (catch AssertionError _
           (binding [*out* *err*]
             (println error-str)
             (println "Failed!"))
           (System/exit 1))))))
 
-(def nn? "not nil" (complement nil?))
-
 (defn which?
   "Checks if any of elements is included in coll and says which one
   was found as first. Coll can be map, list, vector and set"
@@ -30,7 +28,7 @@
                              ncoll))) nil rest)))
 (defn contains??
   [coll rest]
-  (nn? (which? coll rest)))
+  (some? (which? coll rest)))
 
 (defn load-edn
   "Load edn from an io/reader source (filename or io/resource)."
@@ -66,19 +64,19 @@
       (catch RuntimeException e
         (printf "Error parsing edn file '%s': %s\n" source (.getMessage e)))))
 
-(defmacro when-let*
-  "Multiple binding version of when-let"
-  [bindings & body]
-  (if (seq bindings)
-    `(when-let [~(first bindings) ~(second bindings)]
-       (when-let* ~(vec (drop 2 bindings)) ~@body))
-    `(do ~@body)))
+;; (defmacro when-let*
+;;   "Multiple binding version of when-let"
+;;   [bindings & body]
+;;   (if (seq bindings)
+;;     `(when-let [~(first bindings) ~(second bindings)]
+;;        (when-let* ~(vec (drop 2 bindings)) ~@body))
+;;     `(do ~@body)))
 
 (defn dissoc-in
   "Dissociates an entry from a nested associative structure returning a new
   nested structure. keys is a sequence of keys. Any empty maps that result
   will not be present in the new structure."
-  [m [k & ks :as keys]]
+  [m [k & ks]]
   (if ks
     (if-let [nextmap (get m k)]
       (let [newmap (dissoc-in nextmap ks)]
@@ -86,4 +84,4 @@
           (assoc m k newmap)
           (dissoc m k)))
       m)
-    (dissoc m k)))
\ No newline at end of file
+    (dissoc m k)))
diff --git a/src/karabiner_configurator/modifiers.clj b/src/karabiner_configurator/modifiers.clj
index ab8542b..d7631e2 100644
--- a/src/karabiner_configurator/modifiers.clj
+++ b/src/karabiner_configurator/modifiers.clj
@@ -1,6 +1,6 @@
 (ns karabiner-configurator.modifiers
-  (:require [karabiner-configurator.misc :refer :all]
-            [karabiner-configurator.data :refer :all]))
+  (:require [karabiner-configurator.data :as d]
+            [karabiner-configurator.misc :refer [massert]]))
 
 ;; this file parses modifier definitions
 ;; spec https://pqrs.org/osx/karabiner/json.html#from-event-definition-modifiers
@@ -12,12 +12,12 @@
 (defn parse-modifier-arr-or-keyword
   [modi modifier-name]
   (cond (keyword? modi)
-        (do (massert (modifier-k? modi) (str "invalid modifier " modi " in " modifier-name))
+        (do (massert (d/modifier-k? modi) (str "invalid modifier " modi " in " modifier-name))
             [(name modi)])
         (vector? modi)
         (mapv
          (fn [vec]
-           (massert (modifier-k? vec) (str "invalid modifier " vec " in " modifier-name))
+           (massert (d/modifier-k? vec) (str "invalid modifier " vec " in " modifier-name))
            (name vec)) modi)))
 
 (defn parse-vector-modifiers
@@ -25,7 +25,7 @@
   {:mandatory
    (mapv
     (fn [modifier-key]
-      (massert (modifier-k? modifier-key)
+      (massert (d/modifier-k? modifier-key)
                (str "invliad modifer key: " modifier-key " in " modifier-name))
       (name modifier-key))
     modifier-info)})
@@ -34,12 +34,12 @@
   [modifier-name modifier-info]
   (let [{:keys [mandatory optional]} modifier-info
         result {}
-        result (if (nn? mandatory)
+        result (if (some? mandatory)
                  (assoc result
                         :mandatory
                         (parse-modifier-arr-or-keyword mandatory modifier-name))
                  result)
-        result (if (nn? optional)
+        result (if (some? optional)
                  (assoc result
                         :optional
                         (parse-modifier-arr-or-keyword optional modifier-name)) result)]
@@ -47,7 +47,7 @@
 
 (defn parse-keyword-modifiers
   [modifier-name modifier-info]
-  (massert (modifier-k? modifier-info) (str "invalid modifier " modifier-info " in " modifier-name))
+  (massert (d/modifier-k? modifier-info) (str "invalid modifier " modifier-info " in " modifier-name))
   {:mandatory [(name modifier-info)]})
 
 (defn parse-single-modifier-definition
@@ -55,7 +55,7 @@
   used both in here and parsing froms, tos as well"
   [modifier-info & modifier-name]
   (let [modifier-name (first modifier-name)
-        mname (if (nn? modifier-name)
+        mname (if (some? modifier-name)
                 modifier-name
                 :anonymous-modifier)]
     (cond (vector? modifier-info)
@@ -67,7 +67,7 @@
 
 (defn generate
   [modifiers]
-  (assoc conf-data :modifiers
+  (assoc @d/conf-data :modifiers
          (into
           {}
           (for [[modifier-name modifier-info] modifiers]
@@ -77,5 +77,5 @@
 (defn parse-modifiers
   "parse modifires to string"
   [modifiers]
-  (if (nn? modifiers)
-    (update-conf-data (generate modifiers))))
+  (when (some? modifiers)
+    (d/update-conf-data (generate modifiers))))
diff --git a/src/karabiner_configurator/profiles.clj b/src/karabiner_configurator/profiles.clj
index 78113fe..6b517c3 100644
--- a/src/karabiner_configurator/profiles.clj
+++ b/src/karabiner_configurator/profiles.clj
@@ -1,7 +1,7 @@
 (ns karabiner-configurator.profiles
   (:require
-   [karabiner-configurator.misc :refer :all]
-   [karabiner-configurator.data :refer :all]))
+   [karabiner-configurator.data :as d]
+   [karabiner-configurator.misc :refer [massert]]))
 
 (defn parse-profiles
   "Parse profiles and save it in conf data for later use."
@@ -9,16 +9,18 @@
   (massert (map? profiles) "Invalid profiles. Must be a map")
   (massert (= (count (filter #(:default (second %)) profiles)) 1)
            "There should be one and only one default profile")
-  (let [user-default-profile (update-user-default-profile-name
-                              (first (first (filter #(:default (second %)) profiles))))]
+  (let [_user-default-profile (d/update-user-default-profile-name
+                               (first (first (filter #(:default (second %)) profiles))))]
     (doseq [profile profiles
-            :let [[name {:keys [held sim delay alone default]}] profile]]
-      (assoc-in-conf-data [:profiles name] {:complex_modifications
-                                            {:parameters
-                                             {:basic.simultaneous_threshold_milliseconds sim
-                                              :basic.to_delayed_action_delay_milliseconds delay
-                                              :basic.to_if_alone_timeout_milliseconds alone
-                                              :basic.to_if_held_down_threshold_milliseconds held}}}))))
+            :let [[name {:keys [held sim delay alone]}] profile]]
+      (d/assoc-in-conf-data
+       [:profiles name]
+       {:complex_modifications
+        {:parameters
+         {:basic.simultaneous_threshold_milliseconds sim
+          :basic.to_delayed_action_delay_milliseconds delay
+          :basic.to_if_alone_timeout_milliseconds alone
+          :basic.to_if_held_down_threshold_milliseconds held}}}))))
 (defn parse-rules
   "Parse generated rules into profiles"
   [rules]
@@ -27,6 +29,6 @@
    (for [[profile-name profile-complex-modification] rules]
      {profile-name
       (assoc-in (profile-name
-                 (:profiles conf-data))
+                 (:profiles @d/conf-data))
                 [:complex_modifications :rules]
-                profile-complex-modification)})))
\ No newline at end of file
+                profile-complex-modification)})))
diff --git a/src/karabiner_configurator/rules.clj b/src/karabiner_configurator/rules.clj
index 831eaa4..0f645a5 100644
--- a/src/karabiner_configurator/rules.clj
+++ b/src/karabiner_configurator/rules.clj
@@ -1,12 +1,10 @@
 (ns karabiner-configurator.rules
   (:require
    [karabiner-configurator.conditions :as conditions]
-   [karabiner-configurator.keys :as keys]
+   [karabiner-configurator.data :as d :refer [pkey? k? special-modi-k? conf-data pointing-k? consumer-k? noti? templates? devices? assoc-conf-data update-conf-data profile? raw-rule?]]
    [karabiner-configurator.froms :as froms]
-   [karabiner-configurator.tos :as tos]
-   [karabiner-configurator.conditions :as condis]
-   [karabiner-configurator.data :refer :all]
-   [karabiner-configurator.misc :refer :all]))
+   [karabiner-configurator.misc :refer [massert contains??]]
+   [karabiner-configurator.tos :as tos]))
 
 ;; <from> section
 ;; :a      | normal key or predefined froms
@@ -18,27 +16,27 @@
   "generate normal from key config"
   [des from]
   (let [result nil
-        validate-from (massert (or (and (vector? from) (>= (count from) 2) (not-any? #(not (or (pkey? %) (k? %))) from))
-                                   (and (keyword? from) (or (k? from) (special-modi-k? from) (contains? (:froms conf-data) from)))
-                                   (map? from))
-                               (str "invalid <from> in main section's " des))
+        _validate-from (massert (or (and (vector? from) (>= (count from) 2) (not-any? #(not (or (pkey? %) (k? %))) from))
+                                    (and (keyword? from) (or (k? from) (special-modi-k? from) (contains? (:froms @conf-data) from)))
+                                    (map? from))
+                                (str "invalid <from> in main section's " des))
         result (if (vector? from)
                  {:from (froms/parse-from des {:sim from})}
                  result)
         result (if (and (nil? result) (keyword? from) (or (k? from) (special-modi-k? from)))
                  {:from (froms/parse-from des {:key from})}
                  result)
-        result (if (and (nil? result) (contains? (:froms conf-data) from))
-                 {:from (from (:froms conf-data))}
+        result (if (and (nil? result) (contains? (:froms @conf-data) from))
+                 {:from (from (:froms @conf-data))}
                  result)
         result (if (and (map? from) (nil? result))
                  {:from (froms/parse-from des from)}
                  result)]
-    (massert (nn? result) (str "something wrong while parsing main rule " des))
+    (massert (some? result) (str "something wrong while parsing main rule " des))
     result))
 
 (defn parse-simple-set-variable
-  [des vec & [from-condition?]]
+  [des vec & [_from-condition?]]
   (first (tos/parse-to des [{:set vec}])))
 
 (defn rule-parse-keyword [des to]
@@ -48,8 +46,8 @@
         (first (tos/parse-to des [{:ckey to}]))
         (or (special-modi-k? to) (k? to))
         (first (tos/parse-to des [{:key to}]))
-        (contains? (:tos conf-data) to)
-        (to (:tos conf-data))
+        (contains? (:tos @conf-data) to)
+        (to (:tos @conf-data))
         :else
         (massert false (str
                         "code shouldn't be here, something wrong while parsing <to> in main section's "
@@ -61,7 +59,7 @@
     (first (tos/parse-to des [{:noti {:id id :text text}}]))))
 
 (defn to-key-vector
-  [des to prevresult]
+  [des to _prevresult]
   (cond (conditions/is-simple-set-variable? to)
         [(parse-simple-set-variable des to)]
         (noti? to)
@@ -71,7 +69,7 @@
          (flatten
           (for [v to] ;; this for only return flatten vector
             (do
-              (massert (or (contains? (:tos conf-data) v)
+              (massert (or (contains? (:tos @conf-data) v)
                            (k? v)
                            (noti? v)
                            (special-modi-k? v)
@@ -122,19 +120,19 @@
   (let [result nil
         _validate-to (massert (or (and (keyword? to) (or (k? to)
                                                          (special-modi-k? to)
-                                                         (contains? (:input-sources conf-data) to)
-                                                         (contains? (:tos conf-data) to)))
+                                                         (contains? (:input-sources @conf-data) to)
+                                                         (contains? (:tos @conf-data) to)))
                                   (string? to)
                                   (vector? to)
                                   (map? to))
                               (str "invalid <to> in main section's " des))
-        result (if (contains? (:input-sources conf-data) to)
+        result (if (contains? (:input-sources @conf-data) to)
                  (vec (tos/parse-to des [{:input to}]))
                  result)
-        result (if (and (keyword? to) (not (contains? (:input-sources conf-data) to)))
+        result (if (and (keyword? to) (not (contains? (:input-sources @conf-data) to)))
                  (rule-parse-keyword des to)
                  result)
-        result (if (nn? result)
+        result (if (some? result)
                  (cond (vector? result)
                        result
                        :else
@@ -142,7 +140,7 @@
                  result)
         to (if (vector? to) (process-to-shell-template-vector to) to)
         result (cond (and (vector? to) (templates? to))
-                     ;; (tos/parse-to des [{:shell (apply format (flatten [((first to) (:templates conf-data)) [rest to]]))}])
+                     ;; (tos/parse-to des [{:shell (apply format (flatten [((first to) (:templates @conf-data)) [rest to]]))}])
                      (tos/parse-to des [{:shell to}])
                      (vector? to)
                      (to-key-vector des to result)
@@ -155,22 +153,22 @@
 
 (defn merge-multiple-device-conditions
   [device-vec]
-  (assoc-conf-data :devices (dissoc (:devices conf-data) :temp-device))
+  (assoc-conf-data :devices (dissoc (:devices @conf-data) :temp-device))
   (let [devices-list
         (for [item device-vec
               :when (and (keyword? item) (devices? item))
-              :let [this-device-vec (item (:devices conf-data))
+              :let [this-device-vec (item (:devices @conf-data))
                     temp-device-vec (if (devices? :temp-device)
-                                      (vec (concat (:temp-device (:devices conf-data)) this-device-vec))
+                                      (vec (concat (:temp-device (:devices @conf-data)) this-device-vec))
                                       this-device-vec)
-                    update-temp-device-into-conf-data (update-conf-data (assoc-in conf-data [:devices :temp-device] temp-device-vec))]]
+                    _update-temp-device-into-conf-data (update-conf-data (assoc-in @conf-data [:devices :temp-device] temp-device-vec))]]
           item)
         use-temp-device? (pos? (count devices-list))
         new-conditions (if use-temp-device? (conj (vec (reduce #(remove #{%2} %1) device-vec devices-list)) :temp-device)
                            device-vec)]
     new-conditions))
 
-(def profile-layer-condis {})
+(def profile-layer-condis (atom {}))
 
 ;; <conditions>
 ;; :chrome
@@ -179,7 +177,7 @@
 ;; ["vi-mode" 0]
 ;; [:vi-mode ["w mode" 1] :!chrome]
 (defn conditions-key
-  [des conditions prev-result profiles]
+  [_des conditions prev-result profiles]
   (let [conditions (merge-multiple-device-conditions conditions)
         result-condi
         (if (conditions/is-simple-set-variable? conditions)
@@ -189,9 +187,9 @@
     (when (pos? (count layer-condis))
       (doseq [profile profiles]
         (doseq [layer-condi layer-condis]
-          (when (not (contains?? (profile profile-layer-condis) (keyword (:name layer-condi))))
-            (def profile-layer-condis
-              (assoc profile-layer-condis profile (conj (or (profile profile-layer-condis) []) (keyword (:name layer-condi)))))))))
+          (when (not (contains?? (profile @profile-layer-condis) (keyword (:name layer-condi))))
+            (reset! profile-layer-condis
+                    (assoc @profile-layer-condis profile (conj (or (profile @profile-layer-condis) []) (keyword (:name layer-condi)))))))))
     result-condi))
 
 ;; <other options> section
@@ -240,8 +238,8 @@
                    (assoc result :conditions (:conditions (conditions-key des (vec (flatten [conditions])) result profiles))))
                  result)
         result (assoc result :type "basic")
-        result (if conditions/used-simlayers-config
-                 (let [insert-simlayer conditions/used-simlayers-config
+        result (if @conditions/used-simlayers-config
+                 (let [insert-simlayer @conditions/used-simlayers-config
                        insert-simlayer (assoc insert-simlayer :from
                                               (froms/parse-from des (:from insert-simlayer)))
                        insert-simlayer (assoc insert-simlayer :to
@@ -279,100 +277,98 @@
                  (with-meta result {:profiles profiles}))]
     result))
 
-(def current-in-rules-conditions nil)
+(def current-in-rules-conditions (atom nil))
 (defn define-current-in-rule-conditions
   "record current in rule conditions and used in following rules"
   [condis]
   (if (nil? condis)
-    (def current-in-rules-conditions nil)
+    (reset! current-in-rules-conditions nil)
     (if (not (vector? condis))
-      (def current-in-rules-conditions [condis])
-      (def current-in-rules-conditions (pop (vec (reverse condis)))))))
+      (reset! current-in-rules-conditions [condis])
+      (reset! current-in-rules-conditions (pop (vec (reverse condis)))))))
 (defn add-current-in-rule-conditions
   "add current in rule conditions into following rules"
   [rule]
   (let [[from to conditions other-options] rule
         ;; check condition format
         vector-conditions? (vector? conditions)
-        simple-set-variable? (and vector-conditions? (condis/is-simple-set-variable? conditions))
+        simple-set-variable? (and vector-conditions? (conditions/is-simple-set-variable? conditions))
         keyword-conditions? (keyword? conditions)
 
         ;; add current in rule conditions
         conditions
         (cond (or simple-set-variable? keyword-conditions?)
-              (conj current-in-rules-conditions conditions)
+              (conj @current-in-rules-conditions conditions)
               vector-conditions?
-              (vec (concat current-in-rules-conditions conditions))
+              (vec (concat @current-in-rules-conditions conditions))
               :else
-              current-in-rules-conditions)]
+              @current-in-rules-conditions)]
     ;; return results
-    (cond (nn? other-options) [from to conditions other-options]
-          (nn? conditions) [from to conditions]
+    (cond (some? other-options) [from to conditions other-options]
+          (some? conditions) [from to conditions]
           :else [from to])))
 
-(def current-in-rules-profiles nil)
+(def current-in-rules-profiles (atom nil))
 (defn define-current-in-rule-profiles
   "record current in rule profiles and used in following rules"
   [profiles]
   (if (nil? profiles)
-    (def current-in-rules-profiles nil)
+    (reset! current-in-rules-profiles nil)
     (if (not (vector? profiles))
-      (def current-in-rules-profiles [profiles])
+      (reset! current-in-rules-profiles [profiles])
       (let [profiles (pop (vec (reverse profiles)))
-            assert-profiles (massert (= (count (filter profile? profiles)) (count profiles)) (str "invalid profile in " profiles))]
-        (def current-in-rules-profiles profiles)))))
+            _assert-profiles (massert (= (count (filter profile? profiles)) (count profiles)) (str "invalid profile in " profiles))]
+        (reset! current-in-rules-profiles profiles)))))
 
 (defn add-current-in-rule-profiles
   "add current in rule profiles into following rules"
   [rule]
   (let [[from to conditions other-options] rule]
-    [from to conditions other-options current-in-rules-profiles]))
+    [from to conditions other-options @current-in-rules-profiles]))
 
-(def all-the-rules
-  "all rules defined in edn config file, use index of vector as rule id
+#_(def all-the-rules
+    "all rules defined in edn config file, use index of vector as rule id
 
   [{:condis [:Emacs :Browsers :q-mode]}]"
-  [])
+    [])
 
-(defn store-and-add-id-to-rule
-  "store rule into vector of maps and add id to rule for later use"
-  [rule]
-  (let [[from to condition other-options] rule]))
+#_(defn store-and-add-id-to-rule
+    "store rule into vector of maps and add id to rule for later use"
+    [rule]
+    (let [[from to condition other-options] rule]))
 
 (def multi-profile-rules
   "{:profile-1
     {:description \"some manipulators\"
      :manipulators [rule1 rule2]}}"
-  {})
+  (atom {}))
 
 (defn add-rule-into-multi-profile-rules
   "update mtuli-profile-rules depends on rules' profiles"
   [des parsed-rules]
   (doseq [parsed-rule parsed-rules]
     (doseq [profile (-> parsed-rule meta :profiles)]
-      (if (nil? (profile multi-profile-rules))
-        ;; (def multi-profile-rules (assoc multi-profile-rules profile [{:description des :manipulators []}]))
-        (def multi-profile-rules (assoc multi-profile-rules profile [{:description des :manipulators []}])))
-      (let [target-des (vec (keep-indexed #(if (= des (:description %2)) [%1 %2]) (profile multi-profile-rules)))
-            target-des (filter nn? target-des)
-            ;; target-des (filter #(= des (:description %)) (profile multi-profile-rules))
+      (when (nil? (profile @multi-profile-rules))
+        ;; (reset! multi-profile-rules (assoc @multi-profile-rules profile [{:description des :manipulators []}]))
+        (reset! multi-profile-rules (assoc @multi-profile-rules profile [{:description des :manipulators []}])))
+      (let [target-des (vec (keep-indexed #(when (= des (:description %2)) [%1 %2]) (profile @multi-profile-rules)))
+            target-des (filter some? target-des)
+            ;; target-des (filter #(= des (:description %)) (profile @multi-profile-rules))
             target-des (and (pos? (count target-des)) (first target-des))]
         (if target-des
-          ;; TODO: change it to the clojure way (don't use mutable data)
-          (def multi-profile-rules
-            (assoc-in multi-profile-rules
-                      [profile (first target-des)]
-                      {:description  des
-                       :manipulators (conj
-                                      (:manipulators (second target-des))
-                                      parsed-rule)}))
-          ;; TODO: change it to the clojure way (don't use mutable data)
-          (def multi-profile-rules
-            (assoc multi-profile-rules
-                   profile
-                   (conj (profile multi-profile-rules)
-                         {:description  des
-                          :manipulators [parsed-rule]}))))))))
+          (reset! multi-profile-rules
+                  (assoc-in @multi-profile-rules
+                            [profile (first target-des)]
+                            {:description  des
+                             :manipulators (conj
+                                            (:manipulators (second target-des))
+                                            parsed-rule)}))
+          (reset! multi-profile-rules
+                  (assoc @multi-profile-rules
+                         profile
+                         (conj (profile @multi-profile-rules)
+                               {:description  des
+                                :manipulators [parsed-rule]}))))))))
 (defn generate-one-rules
   "generate on rules (one object with des and manipulators in karabiner.json)"
   [des rules]
@@ -391,7 +387,7 @@
                   ;; TODO: change it to the clojure way (don't use mutable data)
                   (do (define-current-in-rule-conditions rule) nil)
                   (if (and
-                       (nn? current-in-rules-conditions)
+                       (some? @current-in-rules-conditions)
                        (not (profile? rule))
                        (and (vector? rule) (not (or (= (first rule) :profiles)
                                                     (= (first rule) :profile)))))
@@ -401,36 +397,36 @@
            result-rules
            (vec
             (for [rule result-rules
-                  :when (nn? rule)]
+                  :when (some? rule)]
               ;; a rule is a keyword of profile name or a vector [:profile :profile-name]
               (if (or (and (keyword? rule) (profile? rule)) (and (vector? rule) (or (= (first rule) :profiles)
                                                                                     (= (first rule) :profile))))
                 (do (define-current-in-rule-profiles rule) nil)
-                (if (nn? current-in-rules-profiles)
+                (if (some? @current-in-rules-profiles)
                   (add-current-in-rule-profiles rule)
                   rule))))
            _cleanup-cirp (define-current-in-rule-profiles nil)]
 
        ;; parse rule
        (for [rule result-rules
-             :when (nn? rule)]
+             :when (some? rule)]
          (let [[from to condition other-options profiles] rule
-               profiles (if (nn? profiles) profiles [user-default-profile-name])
+               profiles (if (some? profiles) profiles [@d/user-default-profile-name])
                ;; a rule must have a from event defination and to event defination
                ;; from event defination is defined in <from> section
                ;; to event defination can be defined in <to> section or <other-options> section (as :alone :delayed :afterup)
                _validate-rule (massert
-                               (and (nn? from)
+                               (and (some? from)
                                     (or
-                                     (nn? (:type from))
-                                     (nn? other-options)
-                                     (nn? to)))
+                                     (some? (:type from))
+                                     (some? other-options)
+                                     (some? to)))
                                (str "invalid rule: " des ", <from> or <to>/<other-options> is nil" from "\n" to "\n" other-options))]
            (cond
-             (nn? (:type from)) (parse-raw-rule from profiles)
+             (some? (:type from)) (parse-raw-rule from profiles)
              (and (nil? other-options) (nil? condition)) (parse-rule des from to nil nil profiles)
-             (and (nil? other-options) (nn? condition)) (parse-rule des from to condition nil profiles)
-             (nn? other-options) (parse-rule des from to condition other-options profiles)))))))))
+             (and (nil? other-options) (some? condition)) (parse-rule des from to condition nil profiles)
+             (some? other-options) (parse-rule des from to condition other-options profiles)))))))))
 
 (defn generate
   "parse mains and generate all rules for converting to json"
@@ -438,34 +434,34 @@
   (let [;; user-result (do
         ;;               (doseq [{:keys [des rules]} mains]
         ;;                 (generate-one-rules des rules))
-        ;;               multi-profile-rules)
+        ;;               @multi-profile-rules)
         _update-multi-profile-rules
         (doseq [{:keys [des rules]} mains]
-          (massert (nn? des) "missing description key :des in one rule, please check your config file")
+          (massert (some? des) "missing description key :des in one rule, please check your config file")
           (generate-one-rules des rules))
         _update-profile-layer-condis
-        (doseq [[profile condis] profile-layer-condis]
+        (doseq [[profile condis] @profile-layer-condis]
           ;; TODO: change it to the clojure way (don't use mutable data)
-          (def profile-layer-condis (assoc profile-layer-condis profile (vec (for [condi condis]  (condi (:layers conf-data)))))))
+          (reset! profile-layer-condis (assoc @profile-layer-condis profile (vec (for [condi condis]  (condi (:layers @conf-data)))))))
 
-        _add-layer-result (doseq [[profile condis] profile-layer-condis]
-                            (when (profile multi-profile-rules)
+        _add-layer-result (doseq [[profile condis] @profile-layer-condis]
+                            (when (profile @multi-profile-rules)
                               ;; TODO: change it to the clojure way (don't use mutable data)
-                              (def multi-profile-rules
-                                (assoc multi-profile-rules
-                                       profile
-                                       (vec (cons
-                                             {:description  "Auto generated layer conditions"
-                                              :manipulators (into
-                                                             condis
-                                                             (:manipulators (profile multi-profile-rules)))}
-                                             (profile multi-profile-rules)))))))]
-    multi-profile-rules))
+                              (reset! multi-profile-rules
+                                      (assoc @multi-profile-rules
+                                             profile
+                                             (vec (cons
+                                                   {:description  "Auto generated layer conditions"
+                                                    :manipulators (into
+                                                                   condis
+                                                                   (:manipulators (profile @multi-profile-rules)))}
+                                                   (profile @multi-profile-rules)))))))]
+    @multi-profile-rules))
 
 (defn parse-mains
   "parse main section to final edn format, ready to convert to json"
   [mains]
   ;; TODO: change it to the clojure way (don't use mutable data)
-  (def multi-profile-rules {})
-  (def profile-layer-condis {})
+  (reset! multi-profile-rules {})
+  (reset! profile-layer-condis {})
   (generate mains))
diff --git a/src/karabiner_configurator/tos.clj b/src/karabiner_configurator/tos.clj
index 32b9455..d5162de 100644
--- a/src/karabiner_configurator/tos.clj
+++ b/src/karabiner_configurator/tos.clj
@@ -1,8 +1,7 @@
 (ns karabiner-configurator.tos
-  (:require [karabiner-configurator.misc :refer :all]
-            [karabiner-configurator.data :refer :all]
-            [karabiner-configurator.keys :refer :all]
-            [karabiner-configurator.modifiers :as kmodifier]))
+  (:require [karabiner-configurator.data :refer [conf-data update-conf-data]]
+            [karabiner-configurator.keys :refer [parse-key]]
+            [karabiner-configurator.misc :refer [massert]]))
 
 ;; parse tos definition
 ;; spec https://karabiner-elements.pqrs.org/docs/json/complex-modifications-manipulator-definition/to/
@@ -66,21 +65,21 @@
   (mapv
    (fn [{:keys [set input shell lazy repeat halt hold_down_ms select_input_source noti] :as tinfo}]
      (let [result         (parse-key tname tinfo true true)
-           validate-shell (massert (or (and (vector? shell) (contains? (:templates conf-data) (first shell))) (string? shell) (nil? shell))
-                                   (str "invalid `shell` in to definition " tname " " shell ", should be string or keyword"))
-           validate-input (massert (or (nil? input) (and (keyword? input) (contains? (:input-sources conf-data) input)))
-                                   (str "invalid `input` in to definition " tname " " input ", should be a keyword"))
-           validate-set   (massert (or (vector? set) (nil? set))
-                                   (str "invalid `set` in to definition " tname " " set ", should be a vector"))
-           validate-noti  (massert (or (nil? noti) (and (map? noti)
-                                                        (or (keyword? (get noti :id))
-                                                            (string? (get noti :id)))
-                                                        (or (nil? (get noti :text))
-                                                            (keyword? (get noti :text))
-                                                            (string? (get noti :text)))))
-                                   (str "invalid `noti`, must be a map with at least :id, :id must be string or keyword"))
+           _validate-shell (massert (or (and (vector? shell) (contains? (:templates @conf-data) (first shell))) (string? shell) (nil? shell))
+                                    (str "invalid `shell` in to definition " tname " " shell ", should be string or keyword"))
+           _validate-input (massert (or (nil? input) (and (keyword? input) (contains? (:input-sources @conf-data) input)))
+                                    (str "invalid `input` in to definition " tname " " input ", should be a keyword"))
+           _validate-set   (massert (or (vector? set) (nil? set))
+                                    (str "invalid `set` in to definition " tname " " set ", should be a vector"))
+           _validate-noti  (massert (or (nil? noti) (and (map? noti)
+                                                         (or (keyword? (get noti :id))
+                                                             (string? (get noti :id)))
+                                                         (or (nil? (get noti :text))
+                                                             (keyword? (get noti :text))
+                                                             (string? (get noti :text)))))
+                                    (str "invalid `noti`, must be a map with at least :id, :id must be string or keyword"))
            result         (if (keyword? input)
-                            (assoc result :select_input_source (input (:input-sources conf-data)))
+                            (assoc result :select_input_source (input (:input-sources @conf-data)))
                             result)
            result         (if (string? shell)
                             (assoc result :shell_command shell)
@@ -91,7 +90,7 @@
                                                    format
                                                    (flatten
                                                     [((first shell)
-                                                      (:templates conf-data))
+                                                      (:templates @conf-data))
                                                      (rest shell)
                                              ;; optional arguments
                                                      "" "" "" "" "" ""])))
@@ -120,7 +119,7 @@
    tinfos))
 
 (defn generate [tos]
-  (assoc conf-data :tos
+  (assoc @conf-data :tos
          (into
           {}
           (for [[tname tinfo] tos]
@@ -133,5 +132,5 @@
                  (parse-to tname tinfo)))}))))
 
 (defn parse-tos [tos]
-  (if (nn? tos)
+  (when (some? tos)
     (update-conf-data (generate tos))))
diff --git a/test/karabiner_configurator/core_test.clj b/test/karabiner_configurator/core_test.clj
index 3692c74..8358971 100644
--- a/test/karabiner_configurator/core_test.clj
+++ b/test/karabiner_configurator/core_test.clj
@@ -1,8 +1,8 @@
 (ns karabiner-configurator.core-test
   (:require [clojure.test :as t]
             [karabiner-configurator.core :as sut]
-            [karabiner-configurator.data :refer :all]
-            [karabiner-configurator.misc :refer :all]))
+            [karabiner-configurator.data :refer [init-conf-data]]
+            [karabiner-configurator.misc :refer [load-edn load-result-edn]]))
 
 (def vi-mode-example (load-edn "resources/configurations/edn/vi_mode.edn"))
 (def launch-mode-example (load-edn "resources/configurations/edn/launch_mode.edn"))
@@ -16,4 +16,4 @@
     (t/is (= (sut/parse-edn vi-mode-example) vi-mode-result)))
   (init-conf-data)
   (t/testing "generate launch-mode config"
-    (t/is (= (sut/parse-edn launch-mode-example) launch-mode-result))))
\ No newline at end of file
+    (t/is (= (sut/parse-edn launch-mode-example) launch-mode-result))))
diff --git a/test/karabiner_configurator/froms_test.clj b/test/karabiner_configurator/froms_test.clj
index e135c1f..f79254e 100644
--- a/test/karabiner_configurator/froms_test.clj
+++ b/test/karabiner_configurator/froms_test.clj
@@ -1,7 +1,7 @@
 (ns karabiner-configurator.froms-test
   (:require
    [clojure.test :as t]
-   [karabiner-configurator.data :refer :all]
+   [karabiner-configurator.data :refer [conf-data init-conf-data update-conf-data]]
    [karabiner-configurator.froms :as sut]))
 
 (def example-froms
@@ -78,7 +78,7 @@
 
 (t/deftest convert-froms
   (init-conf-data)
-  (update-conf-data (assoc conf-data :modifiers {:1 {:mandatory ["left_command", "right_shift"]
-                                                     :optional ["any"]}}))
+  (update-conf-data (assoc @conf-data :modifiers {:1 {:mandatory ["left_command", "right_shift"]
+                                                      :optional ["any"]}}))
   (t/testing
-      (t/is (= (:froms (sut/generate example-froms)) (:froms result)))))
+   (t/is (= (:froms (sut/generate example-froms)) (:froms result)))))
diff --git a/test/karabiner_configurator/layers_test.clj b/test/karabiner_configurator/layers_test.clj
index d4e109f..418e75d 100644
--- a/test/karabiner_configurator/layers_test.clj
+++ b/test/karabiner_configurator/layers_test.clj
@@ -1,7 +1,7 @@
 (ns karabiner-configurator.layers-test
-  (:require [karabiner-configurator.layers :as sut]
-            [karabiner-configurator.data :refer :all]
-            [clojure.test :as t]))
+  (:require [clojure.test :as t]
+            [karabiner-configurator.data :refer [conf-data init-conf-data update-conf-data]]
+            [karabiner-configurator.layers :as sut]))
 
 (def layers-example {:tab-mode {:key :tab :afterup [{:set ["chunkwm-move-mode" 0]}
                                                     {:set ["chunkwm-scale-mode" 0]}]}
@@ -144,25 +144,25 @@
 
 (t/deftest convert-simlayers
   (init-conf-data)
-  (update-conf-data (assoc conf-data :devices {:hhkb-bt [{:vendor_id 1278 :product_id 51966}]
-                                               :hhkb [{:vendor_id 2131 :product_id 256}]}))
-  (update-conf-data (assoc conf-data :applications {:chrome ["^com\\.google\\.Chrome$"]
-                                                    :chrom-canary ["^com\\.google\\.Chrome\\.canary$"]
-                                                    :chromes ["^com\\.google\\.Chrome$" "^com\\.google\\.Chrome\\.canary$"]}))
+  (update-conf-data (assoc @conf-data :devices {:hhkb-bt [{:vendor_id 1278 :product_id 51966}]
+                                                :hhkb [{:vendor_id 2131 :product_id 256}]}))
+  (update-conf-data (assoc @conf-data :applications {:chrome ["^com\\.google\\.Chrome$"]
+                                                     :chrom-canary ["^com\\.google\\.Chrome\\.canary$"]
+                                                     :chromes ["^com\\.google\\.Chrome$" "^com\\.google\\.Chrome\\.canary$"]}))
   ;; (t/testing
   ;;   (t/is (= (sut/generate-layers layers-example) layer-result))
   ;;   (t/is (= (sut/generate-simlayers simlayers-example) simlayer-result)))
   (t/testing "testing simlayers"
     (sut/generate-simlayers simlayers-example)
-    (t/is (= conf-data simlayer-result))))
+    (t/is (= @conf-data simlayer-result))))
 
 (t/deftest convert-layers
   (init-conf-data)
-  (update-conf-data (assoc conf-data :devices {:hhkb-bt [{:vendor_id 1278 :product_id 51966}]
-                                               :hhkb [{:vendor_id 2131 :product_id 256}]}))
-  (update-conf-data (assoc conf-data :applications {:chrome ["^com\\.google\\.Chrome$"]
-                                                    :chrom-canary ["^com\\.google\\.Chrome\\.canary$"]
-                                                    :chromes ["^com\\.google\\.Chrome$" "^com\\.google\\.Chrome\\.canary$"]}))
+  (update-conf-data (assoc @conf-data :devices {:hhkb-bt [{:vendor_id 1278 :product_id 51966}]
+                                                :hhkb [{:vendor_id 2131 :product_id 256}]}))
+  (update-conf-data (assoc @conf-data :applications {:chrome ["^com\\.google\\.Chrome$"]
+                                                     :chrom-canary ["^com\\.google\\.Chrome\\.canary$"]
+                                                     :chromes ["^com\\.google\\.Chrome$" "^com\\.google\\.Chrome\\.canary$"]}))
   (t/testing "testing layers"
     (sut/generate-layers layers-example)
-    (t/is (= conf-data layer-result))))
\ No newline at end of file
+    (t/is (= @conf-data layer-result))))
diff --git a/test/karabiner_configurator/modifiers_test.clj b/test/karabiner_configurator/modifiers_test.clj
index 9438968..1b6f652 100644
--- a/test/karabiner_configurator/modifiers_test.clj
+++ b/test/karabiner_configurator/modifiers_test.clj
@@ -1,7 +1,7 @@
 (ns karabiner-configurator.modifiers-test
-  (:require [karabiner-configurator.modifiers :as sut]
-            [karabiner-configurator.data :refer :all]
-            [clojure.test :refer :all]))
+  (:require [clojure.test :refer [deftest is testing]]
+            [karabiner-configurator.data :refer [init-conf-data]]
+            [karabiner-configurator.modifiers :as sut]))
 
 (def example-modifers {:modifiers {:111 [:left_command :left_control]
                                    :222 {:mandatory [:left_command :left_shift]}
@@ -26,4 +26,4 @@
 (deftest convert-modifiers
   (init-conf-data)
   (testing "FIXME, convert-modifiers fail."
-    (is (= (sut/generate (:modifiers example-modifers)) result))))
\ No newline at end of file
+    (is (= (sut/generate (:modifiers example-modifers)) result))))
diff --git a/test/karabiner_configurator/rules_test.clj b/test/karabiner_configurator/rules_test.clj
index 68a69ec..1a7bb7c 100644
--- a/test/karabiner_configurator/rules_test.clj
+++ b/test/karabiner_configurator/rules_test.clj
@@ -1,7 +1,7 @@
 (ns karabiner-configurator.rules-test
-  (:require [karabiner-configurator.rules :as sut]
-            [karabiner-configurator.data :refer :all]
-            [clojure.test :as t]))
+  (:require [clojure.test :as t]
+            [karabiner-configurator.data :refer [init-conf-data update-conf-data]]
+            [karabiner-configurator.rules :as sut]))
 
 (def example-mains [{:des "a to 1"                                            :rules [[:condi :chunkwm-move-mode]
                                                                                       [:profiles :Default :test-profile-2]
diff --git a/test/karabiner_configurator/tos_test.clj b/test/karabiner_configurator/tos_test.clj
index 0fdd734..18a2e90 100644
--- a/test/karabiner_configurator/tos_test.clj
+++ b/test/karabiner_configurator/tos_test.clj
@@ -1,11 +1,10 @@
 (ns karabiner-configurator.tos-test
-  (:require [karabiner-configurator.tos :as sut]
-            [karabiner-configurator.data :refer :all]
-            [clojure.test :as t]))
+  (:require [clojure.test :as t]
+            [karabiner-configurator.data :refer [init-conf-data assoc-conf-data]]
+            [karabiner-configurator.tos :as sut]))
 
 (def tos-example
-  {
-   :1 {:key :d}
+  {:1 {:key :d}
    :2 {:key :d :modi :1}
    :3 {:key :d :modi :left_command}
    :4 {:key :d :modi [:left_command :right_shift]}
@@ -81,7 +80,7 @@
                         :key_code "d"}]
                    :6 [{:modifiers ["left_command" "right_shift"]
                         :key_code "d"}]
-                   :19 [{ :select_input_source { :input_source_id "^com\\.apple\\.keylayout\\.ABC$" } }]}
+                   :19 [{:select_input_source {:input_source_id "^com\\.apple\\.keylayout\\.ABC$"}}]}
              :input-sources {:squirrel {:input_mode_id "com.googlecode.rimeime.inputmethod.Squirrel"
                                         :input_source_id "com.googlecode.rimeime.inputmethod.Squirrel.Rime"
                                         :language "zh-Hans"}
@@ -99,15 +98,15 @@
 
 (t/deftest convert-tos
   (init-conf-data)
-  (update-conf-data (assoc conf-data :templates {:launch "osascript -e 'tell application \"Alfred 3\" to run trigger \"launch%s\" in workflow \"yqrashawn.workflow.launcher\" with argument \"\"'"}))
-  (update-conf-data (assoc conf-data :modifiers {:1 {:mandatory ["left_command", "right_shift"]}}))
-  (update-conf-data (assoc conf-data :input-sources {:squirrel {:input_mode_id "com.googlecode.rimeime.inputmethod.Squirrel"
-                                                                :input_source_id "com.googlecode.rimeime.inputmethod.Squirrel.Rime"
-                                                                :language "zh-Hans"}
-                                                     :us {:input_mode_id ""
-                                                          :input_source_id "com.apple.keylayout.US"
-                                                          :language "en"}}))
+  (assoc-conf-data :templates {:launch "osascript -e 'tell application \"Alfred 3\" to run trigger \"launch%s\" in workflow \"yqrashawn.workflow.launcher\" with argument \"\"'"})
+  (assoc-conf-data :modifiers {:1 {:mandatory ["left_command", "right_shift"]}})
+  (assoc-conf-data :input-sources {:squirrel {:input_mode_id "com.googlecode.rimeime.inputmethod.Squirrel"
+                                              :input_source_id "com.googlecode.rimeime.inputmethod.Squirrel.Rime"
+                                              :language "zh-Hans"}
+                                   :us {:input_mode_id ""
+                                        :input_source_id "com.apple.keylayout.US"
+                                        :language "en"}})
   (t/testing
-      (t/is (= (:tos (sut/generate tos-example)) (:tos result)))))
+   (t/is (= (:tos (sut/generate tos-example)) (:tos result)))))
 
 ;; (sut/generate tos-example)