diff --git a/.ocamlformat b/.ocamlformat
index fe6ed57..3532006 100644
--- a/.ocamlformat
+++ b/.ocamlformat
@@ -3,4 +3,4 @@ type-decl=sparse
 break-separators=before
 if-then-else=keyword-first
 dock-collection-brackets=false
-version=0.24.1
\ No newline at end of file
+version=0.26.1
\ No newline at end of file
diff --git a/dune b/dune
index 61ec19c..9446de9 100644
--- a/dune
+++ b/dune
@@ -2,22 +2,34 @@
  (targets merge-fmt-help.txt)
  (deps ./src/merge_fmt.exe)
  (mode promote)
- (action (with-stdout-to %{targets} (run ./src/merge_fmt.exe --help=plain))))
+ (action
+  (with-stdout-to
+   %{targets}
+   (run ./src/merge_fmt.exe --help=plain))))
 
 (rule
  (targets merge-fmt-mergetool-help.txt)
  (deps ./src/merge_fmt.exe)
  (mode promote)
- (action (with-stdout-to %{targets} (run ./src/merge_fmt.exe mergetool --help=plain))))
+ (action
+  (with-stdout-to
+   %{targets}
+   (run ./src/merge_fmt.exe mergetool --help=plain))))
 
 (rule
  (targets merge-fmt-setup-mergetool-help.txt)
  (deps ./src/merge_fmt.exe)
  (mode promote)
- (action (with-stdout-to %{targets} (run ./src/merge_fmt.exe setup-mergetool --help=plain))))
+ (action
+  (with-stdout-to
+   %{targets}
+   (run ./src/merge_fmt.exe setup-mergetool --help=plain))))
 
 (rule
  (targets merge-fmt-setup-merge-help.txt)
  (deps ./src/merge_fmt.exe)
  (mode promote)
- (action (with-stdout-to %{targets} (run ./src/merge_fmt.exe setup-merge --help=plain))))
+ (action
+  (with-stdout-to
+   %{targets}
+   (run ./src/merge_fmt.exe setup-merge --help=plain))))
diff --git a/dune-project b/dune-project
index 4b39e3f..2bc4ec2 100644
--- a/dune-project
+++ b/dune-project
@@ -1,3 +1,2 @@
-(lang dune 1.6)
-(using fmt 1.0)
+(lang dune 3.0)
 (name merge-fmt)
diff --git a/merge-fmt.opam b/merge-fmt.opam
index 6827173..579f6a1 100644
--- a/merge-fmt.opam
+++ b/merge-fmt.opam
@@ -11,7 +11,7 @@ build: [["dune" "build" "-p" name "-j" jobs]]
 
 depends: [
   "ocaml" {>= "4.06.1"}
-  "dune" {>= "1.6"}
+  "dune" {>= "3.0"}
   "cmdliner" {>= "1.1.0"}
   "base"
   "stdio"
diff --git a/src/common.ml b/src/common.ml
index 3ca6809..f88bbd9 100644
--- a/src/common.ml
+++ b/src/common.ml
@@ -18,8 +18,8 @@ let open_process_in_respect_exit ~echo fmt =
       let contents = In_channel.input_all ic in
       match Unix.close_process_in ic with
       | WEXITED 0 -> contents
-      | WEXITED n -> Caml.exit n
-      | WSIGNALED _ | WSTOPPED _ -> Caml.exit 1)
+      | WEXITED n -> Stdlib.exit n
+      | WSIGNALED _ | WSTOPPED _ -> Stdlib.exit 1)
     fmt
 
 let system ~echo fmt =
@@ -35,8 +35,8 @@ let system_respect_exit ~echo fmt =
       if echo then eprintf "+ %s\n%!" s;
       match Unix.system s with
       | WEXITED 0 -> ()
-      | WEXITED n -> Caml.exit n
-      | WSIGNALED _ | WSTOPPED _ -> Caml.exit 1)
+      | WEXITED n -> Stdlib.exit n
+      | WSIGNALED _ | WSTOPPED _ -> Stdlib.exit 1)
     fmt
 
 module Flags = struct
diff --git a/src/dune b/src/dune
index 1ae55ce..1cfd576 100644
--- a/src/dune
+++ b/src/dune
@@ -1,5 +1,4 @@
 (executables
-  (names merge_fmt)
-  (public_names merge-fmt)
-  (libraries base stdio unix cmdliner)
-)
\ No newline at end of file
+ (names merge_fmt)
+ (public_names merge-fmt)
+ (libraries base stdio unix cmdliner))
diff --git a/src/fmters.ml b/src/fmters.ml
index e190f4b..43616ab 100644
--- a/src/fmters.ml
+++ b/src/fmters.ml
@@ -36,7 +36,7 @@ let dune ~bin =
 
 let find ~config ~filename ~name =
   let filename = Option.value ~default:filename name in
-  match (filename, Caml.Filename.extension filename, config) with
+  match (filename, Stdlib.Filename.extension filename, config) with
   | _, (".ml" | ".mli"), { ocamlformat_path; _ } ->
       Some (ocamlformat ~bin:ocamlformat_path ~name)
   | _, (".re" | ".rei"), { refmt_path; _ } -> Some (refmt ~bin:refmt_path)
diff --git a/src/merge_cmd.ml b/src/merge_cmd.ml
index a0fa68f..6cd5377 100644
--- a/src/merge_cmd.ml
+++ b/src/merge_cmd.ml
@@ -2,7 +2,12 @@ open Base
 open Stdio
 open Common
 
-let debug_oc = lazy (Out_channel.create ~append:true "/tmp/merge-fmt.log")
+let debug_oc =
+  lazy
+    (Out_channel.create ~append:true
+       (Stdlib.Filename.concat
+          (Stdlib.Filename.get_temp_dir_name ())
+          "merge-fmt.log"))
 
 let debug fmt =
   if true
@@ -12,7 +17,7 @@ let debug fmt =
 let merge config echo current base other output name =
   match (current, base, other) with
   | (None | Some ""), _, _ | _, (None | Some ""), _ | _, _, (None | Some "") ->
-      Caml.exit 1
+      Stdlib.exit 1
   | Some current, Some base, Some other -> (
       match Fmters.find ~config ~filename:current ~name with
       | None ->
@@ -30,7 +35,7 @@ let merge config echo current base other output name =
             |> Result.map_error ~f:(Fn.const "base")
           in
           match Result.combine_errors [ x; y; z ] with
-          | Error _ -> Caml.exit 1
+          | Error _ -> Stdlib.exit 1
           | Ok (_ : unit list) ->
               debug "process all three revision successfully\n%!";
               debug "running git merge-file\n%!";
@@ -41,7 +46,7 @@ let merge config echo current base other output name =
               (match output with
               | None -> Out_channel.output_string stdout result
               | Some o -> Out_channel.write_all o ~data:result);
-              Caml.exit 0))
+              Stdlib.exit 0))
 
 open Cmdliner
 
diff --git a/src/resolve_cmd.ml b/src/resolve_cmd.ml
index bd7f5e3..60a36a4 100644
--- a/src/resolve_cmd.ml
+++ b/src/resolve_cmd.ml
@@ -67,9 +67,9 @@ let show ~echo version versions =
 
 let create_tmp ~echo fn version versions =
   let content = show ~echo version versions in
-  let ext = Caml.Filename.extension fn in
+  let ext = Stdlib.Filename.extension fn in
   let base =
-    if String.equal ext "" then fn else Caml.Filename.chop_extension fn
+    if String.equal ext "" then fn else Stdlib.Filename.chop_extension fn
   in
   let fn' = sprintf "%s.%s%s" base (string_of_version version) ext in
   let oc = Out_channel.create fn' in
@@ -114,7 +114,7 @@ let resolve config echo () =
   if Map.is_empty all
   then (
     eprintf "Nothing to resolve\n%!";
-    Caml.exit 1);
+    Stdlib.exit 1);
   Map.iteri all ~f:(fun ~key:filename ~data:versions ->
       match versions with
       | Ok versions -> (
@@ -131,7 +131,7 @@ let resolve config echo () =
           | None -> eprintf "Ignore %s (no formatter register)\n%!" filename)
       | Error reason -> eprintf "Ignore %s (%s)\n%!" filename reason);
   let all = ls ~echo () in
-  if Map.is_empty all then Caml.exit 0 else Caml.exit 1
+  if Map.is_empty all then Stdlib.exit 0 else Stdlib.exit 1
 
 open Cmdliner
 
diff --git a/test/dune b/test/dune
index c0e4f3a..2fde0ee 100644
--- a/test/dune
+++ b/test/dune
@@ -1,17 +1,22 @@
 (library
-  (name merge_fmt_test)
-  (libraries base stdio unix core_unix core_unix.filename_unix)
-  (inline_tests)
-  (preprocessor_deps ../src/merge_fmt.exe)
-  (preprocess (pps ppx_expect)))
-
+ (name merge_fmt_test)
+ (libraries base stdio unix core_unix core_unix.filename_unix)
+ (inline_tests)
+ (preprocessor_deps ../src/merge_fmt.exe)
+ (preprocess
+  (pps ppx_expect)))
 
 ;; [rebase_a.ml] and [rebase_b.ml] should be the same expect that
 ;; [rebase_b.ml] does rebase in an intermediate revision.
+
 (rule
-  (targets rebase.diff.gen)
-  (action (with-stdout-to %{targets} (bash "diff %{dep:rebase_a.ml} %{dep:rebase_b.ml} || true"))))
+ (targets rebase.diff.gen)
+ (action
+  (with-stdout-to
+   %{targets}
+   (bash "diff %{dep:rebase_a.ml} %{dep:rebase_b.ml} || true"))))
 
-(alias
-  (name runtest)
-  (action (diff rebase.diff rebase.diff.gen)))
\ No newline at end of file
+(rule
+ (alias runtest)
+ (action
+  (diff rebase.diff rebase.diff.gen)))
