diff --git a/.config/jj/config.toml b/.config/jj/config.toml
new file mode 100644
index 00000000..6ecdb8a6
--- /dev/null
+++ b/.config/jj/config.toml
@@ -0,0 +1,34 @@
+[user]
+name = "Alpha Chen"
+email = "alpha@kejadlen.dev"
+
+[ui]
+diff-editor = ",jj-dirdiff"
+
+[diff.color-words]
+max-inline-alternation = 0
+
+[colors]
+"diff modified" = "blue"
+"diff token" = { underline = false }
+
+[signing]
+backend = "ssh"
+key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINCttH8nEfk1uZ2291P4mbCoNcHxnr9iNBlbZckykeZ8"
+backends.ssh.program = "/Applications/1Password.app/Contents/MacOS/op-ssh-sign"
+
+[git]
+sign-on-push = true
+
+[templates]
+draft_commit_description = '''
+concat(
+ description,
+ surround(
+ "\nJJ: This commit contains the following changes:\n", "",
+ indent("JJ: ", diff.stat(72)),
+ ),
+ "\nJJ: ignore-rest\n",
+ diff.git(),
+)
+'''
diff --git a/.gitignore b/.gitignore
index 06592eb1..a9c24aa7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,7 @@ private
!.config/ghostty
!.config/irb
.config/irb/irb_history
+!.config/jj
!.config/kitty
!.config/nvim
!.config/neovide
diff --git a/.gitmodules b/.gitmodules
index a9ba1265..320b91ad 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -154,3 +154,7 @@
path = .local/share/nvim/site/pack/alpha/start/mini-align
url = https://github.com/echasnovski/mini.align.git
branch = main
+[submodule "dirdiff"]
+ path = .local/share/nvim/site/pack/alpha/start/dirdiff
+ url = https://github.com/will133/vim-dirdiff.git
+ branch = master
diff --git a/.local/share/nvim/site/pack/alpha/start/dirdiff b/.local/share/nvim/site/pack/alpha/start/dirdiff
new file mode 160000
index 00000000..84bc8999
--- /dev/null
+++ b/.local/share/nvim/site/pack/alpha/start/dirdiff
@@ -0,0 +1 @@
+Subproject commit 84bc8999fde4b3c2d8b228b560278ab30c7ea4c9
diff --git a/bin/,jj-dirdiff b/bin/,jj-dirdiff
new file mode 100755
index 00000000..6f1f75ba
--- /dev/null
+++ b/bin/,jj-dirdiff
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# https://github.com/jj-vcs/jj/wiki/Vim#dirdiff-plugin
+
+# Shell-escape each path:
+DIR1=$(printf '%q' "$1"); shift
+DIR2=$(printf '%q' "$1"); shift
+nvim "$@" -c "DirDiff $DIR1 $DIR2"