diff --git a/Changes b/Changes
index d16a087..f682bf0 100644
--- a/Changes
+++ b/Changes
@@ -1,4 +1,4 @@
-0.64.7 2026-05-06
+0.64.7 2026-05-07
     - [bugfix] Keep highlights that extend beyond a cut match
       (diewald; fixes #177; diewald; AI-assisted Claude Opus 4.6)
     - [bugfix] Correctly handle foundry and layer in attribute groups
@@ -20,6 +20,8 @@
       (diewald; AI-assisted Claude Opus 4.6)
     - [enhancement] Improve low-level protection against data breaches
       (diewald)
+    - [feature] Uncomment krill.context.max.char property
+      (diewald; tests AI-assisted Claude Opus 4.6)
 
 0.64.6 2026-03-09
     - [performance] Add leaf cache. (diewald)
diff --git a/src/main/java/de/ids_mannheim/korap/util/KrillProperties.java b/src/main/java/de/ids_mannheim/korap/util/KrillProperties.java
index 6a2485e..d88e26b 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KrillProperties.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KrillProperties.java
@@ -105,6 +105,7 @@
 
         // EM: not implemented yet
         // String maxCharContextSize = prop.getProperty("krill.context.max.char");
+        String maxCharContextSize = prop.getProperty("krill.context.max.char");
         String defaultSearchContextLength = prop.getProperty("krill.search.context.default");
         String maxTextSizeValue = prop.getProperty("krill.index.textSize.max");
 
@@ -117,10 +118,10 @@
                 KrillProperties.maxTokenContextSize = Integer
                         .parseInt(maxTokenContextSize);
             }
-//            if (maxCharContextSize != null) {
-//                KrillProperties.maxCharContextSize = Integer
-//                        .parseInt(maxCharContextSize);
-//            }
+            if (maxCharContextSize != null) {
+                KrillProperties.maxCharContextSize = Integer
+                        .parseInt(maxCharContextSize);
+            }
             if (defaultSearchContextLength != null) {
                 KrillProperties.defaultSearchContextLength = Integer
                         .parseInt(defaultSearchContextLength);
diff --git a/src/main/resources/krill.properties.info b/src/main/resources/krill.properties.info
index 081d04b..bbe38d5 100644
--- a/src/main/resources/krill.properties.info
+++ b/src/main/resources/krill.properties.info
@@ -20,7 +20,7 @@
 #
 # krill.match.max.token = 5
 #
-##  Maximum number (i.e. length) of tokens to be retrievable.
+##  Maximum number (i.e. length) of tokens to be retrievable in a match.
 ##  Matches longer than that will be cut.
 ##  Defaults to 50
 
@@ -69,5 +69,11 @@
 ## Note: Only token-based contexts are affected; character-based contexts
 ## are currently not adjusted by this feature.
 
-
-
+# krill.context.max.char =
+#
+## Maximum number of characters to be retrieved (left and right) of a match
+## when the client requests character-based context.
+## Character-based contexts are independent of token-based contexts:
+## the client chooses one or the other per request. When character context
+## is used, token-based maxShrink adjustment does NOT apply.
+## Defaults to 500
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMaxContext.java b/src/test/java/de/ids_mannheim/korap/index/TestMaxContext.java
index 3c29a95..f9a4330 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMaxContext.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMaxContext.java
@@ -7,8 +7,8 @@
 import java.io.IOException;
 import java.util.Properties;
 
-import org.junit.BeforeClass;
 import org.junit.After;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -551,6 +551,42 @@
     };
 
     @Test
+    public void testMaxCharContextSizeProperty () {
+        Properties props = new Properties();
+        props.setProperty("krill.context.max.char", "100");
+        KrillProperties.updateConfigurations(props);
+        assertEquals(100, KrillProperties.maxCharContextSize);
+    };
+
+    @Test
+    public void testMaxCharContextClampsBracketsSnippet ()
+            throws JsonMappingException, JsonProcessingException {
+        KrillProperties.maxCharContextSize = 50;
+
+        JsonNode jsonNode = mapper.readTree(jsonQuery);
+        ArrayNode leftNode = (ArrayNode) jsonNode.at("/meta/context/left");
+        ArrayNode rightNode = (ArrayNode) jsonNode.at("/meta/context/right");
+        leftNode.set(0, "char");
+        rightNode.set(0, "char");
+        leftNode.set(1, "200");
+        rightNode.set(1, "200");
+
+        Krill ks = new Krill(jsonNode);
+        Result kr = ks.apply(ki);
+
+        SearchContext context = kr.getContext();
+        assertEquals(50, context.left.getLength());
+        assertEquals(50, context.right.getLength());
+
+        Match km = kr.getMatch(0);
+        assertEquals(50, km.getContext().left.getLength());
+        assertEquals(50, km.getContext().right.getLength());
+
+        String rightContext = km.getSnippetBrackets().split("]]")[1];
+        assertEquals(50, rightContext.length() - 4);
+    };
+
+    @Test
     public void testKwicMaxTokenBasic () {
         // kwic.max.token = matchMax + 2*contextMax - totalShrink
         // Setting kwicMaxToken=60 with matchMax=50 and contextMax=25:
@@ -662,4 +698,105 @@
         assertEquals(3, KrillProperties.leftContextMaxShrink);
         assertEquals(7, KrillProperties.rightContextMaxShrink);
     };
-};
+
+    @Test
+    public void testMaxCharContextClampsHTMLSnippet ()
+            throws JsonMappingException, JsonProcessingException {
+        KrillProperties.maxCharContextSize = 50;
+
+        JsonNode jsonNode = mapper.readTree(jsonQuery);
+        ArrayNode leftNode = (ArrayNode) jsonNode.at("/meta/context/left");
+        ArrayNode rightNode = (ArrayNode) jsonNode.at("/meta/context/right");
+        leftNode.set(0, "char");
+        rightNode.set(0, "char");
+        leftNode.set(1, "200");
+        rightNode.set(1, "200");
+
+        Krill ks = new Krill(jsonNode);
+        Result kr = ks.apply(ki);
+        Match km = kr.getMatch(0);
+
+        String html = km.getSnippetHTML();
+        assertTrue(html.contains("<span class=\"context-left\">"));
+        assertTrue(html.contains("<span class=\"match\">"));
+        assertTrue(html.contains("<span class=\"context-right\">"));
+    };
+
+    @Test
+    public void testCharContextBelowMaxIsNotClamped ()
+            throws JsonMappingException, JsonProcessingException {
+        assertEquals(500, KrillProperties.maxCharContextSize);
+
+        JsonNode jsonNode = mapper.readTree(jsonQuery);
+        ArrayNode leftNode = (ArrayNode) jsonNode.at("/meta/context/left");
+        ArrayNode rightNode = (ArrayNode) jsonNode.at("/meta/context/right");
+        leftNode.set(0, "char");
+        rightNode.set(0, "char");
+        leftNode.set(1, "30");
+        rightNode.set(1, "30");
+
+        Krill ks = new Krill(jsonNode);
+        Result kr = ks.apply(ki);
+
+        SearchContext context = kr.getContext();
+        assertEquals(30, context.left.getLength());
+        assertEquals(30, context.right.getLength());
+
+        Match km = kr.getMatch(0);
+        assertEquals(30, km.getContext().left.getLength());
+        assertEquals(30, km.getContext().right.getLength());
+
+        String rightContext = km.getSnippetBrackets().split("]]")[1];
+        assertEquals(30, rightContext.length() - 4);
+    };
+
+    @Test
+    public void testMaxCharContextViaPropertiesAffectsSearch ()
+            throws JsonMappingException, JsonProcessingException {
+        Properties props = new Properties();
+        props.setProperty("krill.context.max.char", "80");
+        KrillProperties.updateConfigurations(props);
+        assertEquals(80, KrillProperties.maxCharContextSize);
+
+        JsonNode jsonNode = mapper.readTree(jsonQuery);
+        ArrayNode leftNode = (ArrayNode) jsonNode.at("/meta/context/left");
+        ArrayNode rightNode = (ArrayNode) jsonNode.at("/meta/context/right");
+        leftNode.set(0, "char");
+        rightNode.set(0, "char");
+        leftNode.set(1, "200");
+        rightNode.set(1, "200");
+
+        Krill ks = new Krill(jsonNode);
+        Result kr = ks.apply(ki);
+
+        SearchContext context = kr.getContext();
+        assertEquals(80, context.left.getLength());
+        assertEquals(80, context.right.getLength());
+
+        Match km = kr.getMatch(0);
+        assertEquals(80, km.getContext().left.getLength());
+        assertEquals(80, km.getContext().right.getLength());
+
+        String rightContext = km.getSnippetBrackets().split("]]")[1];
+        assertEquals(80, rightContext.length() - 4);
+    };
+
+    @Test
+    public void testMaxCharContextDoesNotAffectTokenContext ()
+            throws JsonMappingException, JsonProcessingException {
+        KrillProperties.maxCharContextSize = 10;
+
+        Krill ks = new Krill(jsonQuery);
+        Result kr = ks.apply(ki);
+
+        SearchContext context = kr.getContext();
+        assertEquals(5, context.left.getLength());
+        assertEquals(5, context.right.getLength());
+        assertTrue(context.left.isToken());
+        assertTrue(context.right.isToken());
+
+        Match km = kr.getMatch(0);
+        assertEquals(5, km.getContext().left.getLength());
+        assertEquals(5, km.getContext().right.getLength());
+    };
+}
