diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 9e09fb63e..06bf4c2ed 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -24,7 +24,7 @@ repos:
       - id: debug-statements
       - id: no-commit-to-branch
       - id: check-merge-conflict
-      - id: check-toml
+      - id: check-toml # TOML linter (syntax checker)
       - id: check-yaml
         args: [ '--unsafe' ] # for mkdocs.yml
       - id: detect-private-key
@@ -55,17 +55,22 @@ repos:
         stages:
           - post-commit
 
+  - repo: https://github.com/ComPWA/taplo-pre-commit
+    rev: v0.9.3
+    hooks:
+      - id: taplo-format
+
   - repo: local
     hooks:
       - id: format
-        name: Format
+        name: Format Python code via Poetry
         language: system
         pass_filenames: false
         entry: poetry format
         types: [ python ]
 
       - id: linter and test
-        name: Linters
+        name: Linters via Poetry
         language: system
         pass_filenames: false
         entry: poetry lint
diff --git a/.taplo.toml b/.taplo.toml
new file mode 100644
index 000000000..36a3453ac
--- /dev/null
+++ b/.taplo.toml
@@ -0,0 +1,4 @@
+include = ["pyproject.toml", ".taplo.toml"]
+
+[formatting]
+indent_string = "    "