diff --git a/.gitignore b/.gitignore
index df11f9a..4edfb0a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -167,7 +167,7 @@ test-out-2/mic.wav
test-out-2/recording.wav
test-out-2/system.wav
build_assets/native-capture-helper
-build_assets/ClosedRoomNativeCapture.app/Contents/MacOS/ClosedRoomNativeCapture
+build_assets/ClosedRoomNativeCapture.app/
update-uv-dependences-llm-local-server
docs/assets/Screenshot 2026-06-26 alle 16.23.57.heic
docs/assets/Screenshot 2026-06-26 alle 16.24.33.heic
diff --git a/build_assets/ClosedRoomNativeCapture.app/Contents/Info.plist b/build_assets/ClosedRoomNativeCapture.app/Contents/Info.plist
deleted file mode 100644
index 1b34b21..0000000
--- a/build_assets/ClosedRoomNativeCapture.app/Contents/Info.plist
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- CFBundleIdentifier
- com.closedroom.nativecapture
- CFBundleName
- ClosedRoom Native Capture
- CFBundleDisplayName
- ClosedRoom Native Capture
- CFBundleExecutable
- ClosedRoomNativeCapture
- CFBundlePackageType
- APPL
- CFBundleVersion
- 1.0.0
- CFBundleShortVersionString
- 1.0.0
- LSUIElement
-
- NSMicrophoneUsageDescription
- ClosedRoom uses the microphone to record your voice for local transcription.
- NSScreenCaptureUsageDescription
- ClosedRoom records screen and system audio to capture computer audio.
- NSAudioCaptureUsageDescription
- ClosedRoom records computer audio to transcribe meetings and local audio sources.
-
-
diff --git a/test/test_build_generated_assets_contract.py b/test/test_build_generated_assets_contract.py
new file mode 100644
index 0000000..6ce1fc9
--- /dev/null
+++ b/test/test_build_generated_assets_contract.py
@@ -0,0 +1,57 @@
+from __future__ import annotations
+
+import subprocess
+from pathlib import Path
+import unittest
+
+
+ROOT = Path(__file__).parents[1]
+HELPER_APP = "build_assets/ClosedRoomNativeCapture.app"
+
+
+class GeneratedBuildAssetsContractTests(unittest.TestCase):
+ def test_native_helper_app_is_generated_and_ignored(self) -> None:
+ tracked = subprocess.run(
+ ["git", "ls-files", "--error-unmatch", f"{HELPER_APP}/Contents/Info.plist"],
+ cwd=ROOT,
+ capture_output=True,
+ text=True,
+ check=False,
+ )
+ ignored = subprocess.run(
+ ["git", "check-ignore", "-q", f"{HELPER_APP}/Contents/Info.plist"],
+ cwd=ROOT,
+ check=False,
+ )
+
+ self.assertNotEqual(
+ tracked.returncode,
+ 0,
+ "generated native helper Info.plist must not be tracked",
+ )
+ self.assertEqual(
+ ignored.returncode,
+ 0,
+ "generated native helper app must remain ignored",
+ )
+
+ def test_build_regenerates_and_embeds_native_helper_app(self) -> None:
+ build_script = (ROOT / "build.sh").read_text(encoding="utf-8")
+
+ self.assertIn(
+ 'NATIVE_HELPER_APP="$BUILD_ASSETS/ClosedRoomNativeCapture.app"',
+ build_script,
+ )
+ self.assertIn('rm -rf "$NATIVE_HELPER_APP"', build_script)
+ self.assertIn(
+ 'cat > "$NATIVE_HELPER_APP/Contents/Info.plist" <