diff --git a/pygittools/tui/app.py b/pygittools/tui/app.py
index 075285e..ba941de 100644
--- a/pygittools/tui/app.py
+++ b/pygittools/tui/app.py
@@ -4,7 +4,7 @@ from __future__ import annotations
 
 from pathlib import Path
 
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	KEY_RESIZE,
 	cbreak,
 	clear,
diff --git a/pygittools/tui/changes_list.py b/pygittools/tui/changes_list.py
index 5113ebe..c0d7882 100644
--- a/pygittools/tui/changes_list.py
+++ b/pygittools/tui/changes_list.py
@@ -8,7 +8,7 @@ from pathlib import Path
 from typing import Literal
 
 from pygit2 import Repository
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	A_BOLD,
 	KEY_BACKSPACE,
 	KEY_DOWN,
diff --git a/pygittools/tui/changes_list_test.py b/pygittools/tui/changes_list_test.py
index b9e1eec..2037ee8 100644
--- a/pygittools/tui/changes_list_test.py
+++ b/pygittools/tui/changes_list_test.py
@@ -4,7 +4,7 @@ from pathlib import Path
 
 import pytest
 from pygit2 import Repository
-from unicurses import KEY_BACKSPACE, KEY_DOWN, KEY_ENTER, KEY_RESIZE, KEY_UP
+from pygittools.tui.ucurses import KEY_BACKSPACE, KEY_DOWN, KEY_ENTER, KEY_RESIZE, KEY_UP
 
 from pygittools.tui.changes_list import ChangesList, SectionId
 from pygittools.tui.types import PageContext
diff --git a/pygittools/tui/coverage_gaps_test.py b/pygittools/tui/coverage_gaps_test.py
index 41605d0..85d0a19 100644
--- a/pygittools/tui/coverage_gaps_test.py
+++ b/pygittools/tui/coverage_gaps_test.py
@@ -5,7 +5,7 @@ from unittest.mock import MagicMock, patch
 
 import pytest
 from pygit2 import Repository, init_repository
-from unicurses import KEY_BACKSPACE, KEY_ENTER, KEY_RESIZE, KEY_RIGHT, KEY_UP
+from pygittools.tui.ucurses import KEY_BACKSPACE, KEY_ENTER, KEY_RESIZE, KEY_RIGHT, KEY_UP
 
 from pygittools.tui.app import _apply_result, run_tui
 from pygittools.tui.changes_list import ChangesList, SectionId
diff --git a/pygittools/tui/draw.py b/pygittools/tui/draw.py
index ed86589..5eefe2b 100644
--- a/pygittools/tui/draw.py
+++ b/pygittools/tui/draw.py
@@ -2,7 +2,7 @@
 
 from __future__ import annotations
 
-from unicurses import clrtoeol, move, mvaddstr  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import clrtoeol, move, mvaddstr  # type: ignore[import-untyped]
 
 
 def clear_row(row: int) -> None:
diff --git a/pygittools/tui/git_colors.py b/pygittools/tui/git_colors.py
index 1da1534..5e48d77 100644
--- a/pygittools/tui/git_colors.py
+++ b/pygittools/tui/git_colors.py
@@ -9,7 +9,7 @@ from importlib.resources import files
 from typing import TYPE_CHECKING
 
 from pygit2 import Config
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	A_BOLD,
 	A_DIM,
 	A_REVERSE,
diff --git a/pygittools/tui/input_context.py b/pygittools/tui/input_context.py
index 375a40f..e47efb3 100644
--- a/pygittools/tui/input_context.py
+++ b/pygittools/tui/input_context.py
@@ -5,7 +5,7 @@ from __future__ import annotations
 from dataclasses import dataclass
 from typing import Literal, Protocol
 
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	KEY_DOWN,
 	KEY_ENTER,
 	KEY_LEFT,
diff --git a/pygittools/tui/input_context_test.py b/pygittools/tui/input_context_test.py
index 9142c57..aaeaf22 100644
--- a/pygittools/tui/input_context_test.py
+++ b/pygittools/tui/input_context_test.py
@@ -4,7 +4,7 @@ from dataclasses import dataclass
 from typing import Literal
 
 import pytest
-from unicurses import KEY_DOWN, KEY_ENTER, KEY_LEFT, KEY_RIGHT, KEY_UP
+from pygittools.tui.ucurses import KEY_DOWN, KEY_ENTER, KEY_LEFT, KEY_RIGHT, KEY_UP
 
 from pygittools.tui.changes_list import ChangesList
 from pygittools.tui.input_context import InputContext, input_context, nav_context
diff --git a/pygittools/tui/log_list.py b/pygittools/tui/log_list.py
index f7ef5f5..75635a1 100644
--- a/pygittools/tui/log_list.py
+++ b/pygittools/tui/log_list.py
@@ -6,7 +6,7 @@ from dataclasses import dataclass
 from datetime import UTC, datetime
 
 from pygit2 import GIT_SORT_TIME, Commit, GitError, Repository
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	KEY_DOWN,
 	KEY_RESIZE,
 	KEY_UP,
diff --git a/pygittools/tui/log_list_test.py b/pygittools/tui/log_list_test.py
index 125b6f0..5e94482 100644
--- a/pygittools/tui/log_list_test.py
+++ b/pygittools/tui/log_list_test.py
@@ -51,7 +51,7 @@ def test_commit_log_list_navigation(tmp_path: Path) -> None:
 	repo.create_commit("HEAD", SIG, SIG, "one", tree, [])
 	log = CommitLogList()
 	log.refresh(repo)
-	from unicurses import KEY_DOWN, KEY_RESIZE, KEY_UP
+	from pygittools.tui.ucurses import KEY_DOWN, KEY_RESIZE, KEY_UP
 
 	log.handle_nav_key(KEY_DOWN, repo)
 	log.handle_nav_key(KEY_UP, repo)
diff --git a/pygittools/tui/pages/branches.py b/pygittools/tui/pages/branches.py
index f253013..4b12ad7 100644
--- a/pygittools/tui/pages/branches.py
+++ b/pygittools/tui/pages/branches.py
@@ -2,7 +2,7 @@
 
 from __future__ import annotations
 
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	A_BOLD,
 	A_REVERSE,
 	KEY_BACKSPACE,
diff --git a/pygittools/tui/pages/help.py b/pygittools/tui/pages/help.py
index f446c24..4c712e4 100644
--- a/pygittools/tui/pages/help.py
+++ b/pygittools/tui/pages/help.py
@@ -4,7 +4,7 @@ from __future__ import annotations
 
 from importlib.resources import files
 
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	KEY_DOWN,
 	KEY_RESIZE,
 	KEY_UP,
diff --git a/pygittools/tui/pages/home.py b/pygittools/tui/pages/home.py
index 2eabe74..7b32b5b 100644
--- a/pygittools/tui/pages/home.py
+++ b/pygittools/tui/pages/home.py
@@ -4,7 +4,7 @@ from __future__ import annotations
 
 from typing import Literal
 
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	KEY_RESIZE,
 )
 
diff --git a/pygittools/tui/pages/no_repo.py b/pygittools/tui/pages/no_repo.py
index d0c0c8c..0a669ba 100644
--- a/pygittools/tui/pages/no_repo.py
+++ b/pygittools/tui/pages/no_repo.py
@@ -4,7 +4,7 @@ from __future__ import annotations
 
 from pathlib import Path
 
-from unicurses import A_BOLD, KEY_RESIZE  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import A_BOLD, KEY_RESIZE  # type: ignore[import-untyped]
 
 from pygittools.tui.draw import draw_line
 from pygittools.tui.pages.help import help_page
diff --git a/pygittools/tui/pages/projects.py b/pygittools/tui/pages/projects.py
index 43b5b2a..31fa480 100644
--- a/pygittools/tui/pages/projects.py
+++ b/pygittools/tui/pages/projects.py
@@ -2,7 +2,7 @@
 
 from __future__ import annotations
 
-from unicurses import (  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import (  # type: ignore[import-untyped]
 	A_BOLD,
 	A_REVERSE,
 	KEY_DOWN,
diff --git a/pygittools/tui/pages_test.py b/pygittools/tui/pages_test.py
index ec65ac9..3422604 100644
--- a/pygittools/tui/pages_test.py
+++ b/pygittools/tui/pages_test.py
@@ -6,7 +6,7 @@ from unittest.mock import MagicMock
 
 import pytest
 from pygit2 import Repository, Signature
-from unicurses import KEY_BACKSPACE, KEY_DOWN, KEY_ENTER, KEY_RESIZE, KEY_UP
+from pygittools.tui.ucurses import KEY_BACKSPACE, KEY_DOWN, KEY_ENTER, KEY_RESIZE, KEY_UP
 
 from pygittools.tui.pages.branches import BranchPickerPage, branch_picker_page
 from pygittools.tui.pages.help import HelpPage, help_page
diff --git a/pygittools/tui/status_bar.py b/pygittools/tui/status_bar.py
index a63eeb7..0d52769 100644
--- a/pygittools/tui/status_bar.py
+++ b/pygittools/tui/status_bar.py
@@ -2,7 +2,7 @@
 
 from __future__ import annotations
 
-from unicurses import mvaddstr  # type: ignore[import-untyped]
+from pygittools.tui.ucurses import mvaddstr  # type: ignore[import-untyped]
 
 _DEFAULT_HINT = "q quit"
 
diff --git a/pygittools/tui/ucurses.py b/pygittools/tui/ucurses.py
new file mode 100644
index 0000000..b1eb5a0
--- /dev/null
+++ b/pygittools/tui/ucurses.py
@@ -0,0 +1,26 @@
+"""unicurses re-exports with upstream docstring SyntaxWarnings silenced.
+
+uni-curses 3.1.2 uses ``prints\\sends`` in docstrings, which triggers
+SyntaxWarning on Python 3.12+ (invalid ``\\s`` escape).
+"""
+
+from __future__ import annotations
+
+import warnings
+from typing import Any
+
+with warnings.catch_warnings():
+	warnings.filterwarnings(
+		"ignore",
+		category=SyntaxWarning,
+		message=r".*invalid escape sequence.*\\s",
+	)
+	import unicurses as _unicurses
+
+
+def __getattr__(name: str) -> Any:
+	return getattr(_unicurses, name)
+
+
+def __dir__() -> list[str]:
+	return dir(_unicurses)
