diff --git a/.gitignore b/.gitignore
index ef52805c..d244fbc8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ README_files/
README.html
.DS_Store
test-results/
+shiny_bookmarks/
python-package/examples/titanic.db
.quarto
*.db
diff --git a/pkg-py/CHANGELOG.md b/pkg-py/CHANGELOG.md
index 46b024a7..7c730473 100644
--- a/pkg-py/CHANGELOG.md
+++ b/pkg-py/CHANGELOG.md
@@ -45,6 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* The system prompt is now lighter: full schema is no longer embedded upfront. Instead the LLM fetches per-table schema on demand via the new `querychat_get_schema` tool — and only when it needs to. When a `DataDict` is provided, the tool skips columns that already have descriptions, so the LLM only pays for what isn't already documented. (#195)
* The query tool result card now starts collapsed by default. Users can still expand it to see the SQL query and results. Set `QUERYCHAT_TOOL_DETAILS=expanded` to restore the previous behavior. (#239)
+* Fixed `data_description` and `extra_instructions` being HTML-escaped in the system prompt. Special characters like `<`, `>`, and `&` in developer-provided descriptions and instructions are now passed to the LLM verbatim. (#258)
## [0.6.1] - 2026-05-26
diff --git a/pkg-py/src/querychat/prompts/prompt.md b/pkg-py/src/querychat/prompts/prompt.md
index 08b0c93f..e9c42af8 100644
--- a/pkg-py/src/querychat/prompts/prompt.md
+++ b/pkg-py/src/querychat/prompts/prompt.md
@@ -14,7 +14,7 @@ You have access to a {{db_type}} SQL database with the following tables:
{{/has_data_dicts}}
{{#data_description}}
-{{data_description}}
+{{{data_description}}}
{{/data_description}}
@@ -303,5 +303,5 @@ You might want to explore the advanced features
{{#extra_instructions}}
## Additional Instructions
-{{extra_instructions}}
+{{{extra_instructions}}}
{{/extra_instructions}}
diff --git a/pkg-r/NEWS.md b/pkg-r/NEWS.md
index 754ded8c..7775a851 100644
--- a/pkg-r/NEWS.md
+++ b/pkg-r/NEWS.md
@@ -37,6 +37,8 @@
* The system prompt is now lighter: full schema is no longer embedded upfront. Instead the LLM fetches per-table schema on demand via the new `querychat_get_schema` tool — and only when it needs to. When a `data_dict` is provided, the tool skips columns that already have descriptions, so the LLM only pays for what isn't already documented. (#195)
+* Fixed `data_description` and `extra_instructions` being HTML-escaped in the system prompt. Special characters like `<`, `>`, and `&` in developer-provided descriptions and instructions are now passed to the LLM verbatim. (#258)
+
# querychat 0.3.0
## New features
diff --git a/pkg-r/inst/prompts/prompt.md b/pkg-r/inst/prompts/prompt.md
index adbbe3c4..87b6d686 100644
--- a/pkg-r/inst/prompts/prompt.md
+++ b/pkg-r/inst/prompts/prompt.md
@@ -14,7 +14,7 @@ You have access to a {{db_type}} SQL database with the following tables:
{{/has_data_dicts}}
{{#data_description}}
-{{data_description}}
+{{{data_description}}}
{{/data_description}}
@@ -303,5 +303,5 @@ You might want to explore the advanced features
{{#extra_instructions}}
## Additional Instructions
-{{extra_instructions}}
+{{{extra_instructions}}}
{{/extra_instructions}}