diff --git a/distgit/hook_samples/README.md b/distgit/hook_samples/README.md
new file mode 100644
index 0000000..c8f3d9f
--- /dev/null
+++ b/distgit/hook_samples/README.md
@@ -0,0 +1,5 @@
+# Sample Hooks
+
+Place these as desired in .git/hooks/ WITHOUT the suffix.
+
+You will just need UV with distgit in your virtual environment.
diff --git a/distgit/hook_samples/commit-msg.pattern b/distgit/hook_samples/commit-msg.pattern
new file mode 100644
index 0000000..642afbb
--- /dev/null
+++ b/distgit/hook_samples/commit-msg.pattern
@@ -0,0 +1,21 @@
+#!/usr/bin/env -S uv run python
+
+from __future__ import annotations
+import sys
+import pygit2
+from distgit.hooks import HookResult
+from distgit.hooks_patterns import CommitMsgPattern
+
+PATTERN = r"^(\S+): (.+)"
+
+
+def main() -> int:
+    repo = pygit2.Repository(".")
+    result = CommitMsgPattern(repo, PATTERN).run(sys.argv[1])
+    if result.value == HookResult.FAILURE:
+        print("Commit message does not match pattern:", PATTERN, file=sys.stderr)
+    return int(result.value)
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())
diff --git a/distgit/hook_samples/pre-commit.ruff b/distgit/hook_samples/pre-commit.ruff
new file mode 100644
index 0000000..4739e3c
--- /dev/null
+++ b/distgit/hook_samples/pre-commit.ruff
@@ -0,0 +1,15 @@
+#!/usr/bin/env -S uv run python
+
+from __future__ import annotations
+import pygit2
+from distgit.hooks_ruff import PreCommitRuff
+
+
+def main() -> int:
+    repo = pygit2.Repository(".")
+    result = PreCommitRuff(repo).run()
+    return int(result.value)
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())
