commit 04afb15cde9d571d6da4544d6e6485cc739c486e
Author: tri <tri@thac.loan>
Date:   Sat Oct 4 13:48:51 2025 +0700

    highlight diffs

diff --git a/README.md b/README.md
index e21e0a8..fceaed0 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,7 @@ Outdated pages, if not overwritten, are left as-is. Since git itself is an appen
 
 - [ ] Add CLI arg to choose which repo to regen
 - [x] Browse tree at HEAD
-- [ ] Browse commits from main history. May wait for [libghostty-vt][2], or just pipe to [aha][3]. We'll see.
+- [x] Browse commits from main history
 
 ## Contribute
 
diff --git a/src/assets/style.css b/src/assets/style.css
index 0920a99..7cb1499 100644
--- a/src/assets/style.css
+++ b/src/assets/style.css
@@ -13,6 +13,12 @@
   --pre-bg: whitesmoke;
   --pre-border-color: gainsboro;
 
+  --diff-hunk-header-bg: blanchedalmond;
+  --diff-added-fg: darkgreen;
+  --diff-added-bg: transparent;
+  --diff-removed-fg: brown;
+  --diff-removed-bg: transparent;
+
   --serif-fonts: Charter, "Bitstream Charter", "Sitka Text", Cambria, serif;
   --sans-serif-fonts: system-ui, sans-serif;
   --monospace-fonts:
@@ -220,6 +226,21 @@ div.readme-content {
   overflow-x: auto;
   border: 1px solid var(--fg);
   padding: 1rem;
+
+  .bold {
+    font-weight: bold;
+  }
+  .hunk-header {
+    background-color: var(--diff-hunk-header-bg);
+  }
+  .added {
+    color: var(--diff-added-fg);
+    background-color: var(--diff-added-bg);
+  }
+  .removed {
+    color: var(--diff-removed-fg);
+    background-color: var(--diff-removed-bg);
+  }
 }
 
 @media screen and (max-width: 600px) {
@@ -232,9 +253,15 @@ div.readme-content {
 
 @media (prefers-color-scheme: dark) {
   :root {
-    --bg: #222;
+    --bg: #111;
     --fg: #ddd;
 
+    --diff-hunk-header-bg: #444;
+    --diff-added-fg: lightgreen;
+    --diff-added-bg: transparent;
+    --diff-removed-fg: lightcoral;
+    --diff-removed-bg: transparent;
+
     --table-border-color: #444;
     --table-row-hover-bg: #444;
     --table-border-color: #ddd;
diff --git a/src/main.zig b/src/main.zig
index 6e8eb32..c67d5ac 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -573,7 +573,39 @@ pub fn writeCommitPage(
     );
 
     const commit_text = try git.show(arena, args.in_repo_dir, commit.hash);
-    try html.escape(writer, commit_text);
+    const escaped_text = try html.escapeAlloc(arena, commit_text);
+    var lines = mem.splitScalar(u8, escaped_text, '\n');
+    while (lines.next()) |line| {
+        if (mem.startsWith(u8, line, "diff") or
+            mem.startsWith(u8, line, "index") or
+            mem.startsWith(u8, line, "+++") or
+            mem.startsWith(u8, line, "---"))
+        {
+            try writer.writeAll("<span class='bold'>");
+            try writer.writeAll(line);
+            try writer.writeAll("</span>\n");
+        } else if (mem.startsWith(u8, line, "@@")) {
+            const hunk_header_end = mem.indexOf(u8, line[2..], "@@").? + 4;
+            const hunk_header = line[0..hunk_header_end];
+            const rest = line[hunk_header_end..];
+            try writer.writeAll("<span class='hunk-header'>");
+            try writer.writeAll(hunk_header);
+            try writer.writeAll("</span>");
+            try writer.writeAll(rest);
+            try writer.writeAll("\n");
+        } else if (mem.startsWith(u8, line, "+")) {
+            try writer.writeAll("<span class='added'>");
+            try writer.writeAll(line);
+            try writer.writeAll("</span>\n");
+        } else if (mem.startsWith(u8, line, "-")) {
+            try writer.writeAll("<span class='removed'>");
+            try writer.writeAll(line);
+            try writer.writeAll("</span>\n");
+        } else {
+            try writer.writeAll(line);
+            try writer.writeAll("\n");
+        }
+    }
 
     try writer.writeAll(
         \\</pre>