diff --git a/.gitignore b/.gitignore
index ce49a2878..9fe7f37ca 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,3 +56,5 @@ performance/
*.pem
.env.backup
deploy/.env
+
+!requirements.txt
diff --git a/README.md b/README.md
index 3ae318870..5a6db1421 100644
--- a/README.md
+++ b/README.md
@@ -20,8 +20,8 @@ OpenAdapt v1.0+ uses a **modular meta-package architecture**. The main `openadap
| Package | Description | Repository |
|---------|-------------|------------|
-| `openadapt` | Meta-package with unified CLI | This repo |
-| `openadapt-capture` | Event recording and storage | [openadapt-capture](https://github.com/OpenAdaptAI/openadapt-capture) |
+|+ `openadapt` | Meta-package with unified CLI | This repo |
+|+ `openadapt-capture` | Event recording and storage | [openadapt-capture](https://github.com/OpenAdaptAI/openadapt-capture) |
| `openadapt-ml` | ML engine, training, inference | [openadapt-ml](https://github.com/OpenAdaptAI/openadapt-ml) |
| `openadapt-evals` | Benchmark evaluation | [openadapt-evals](https://github.com/OpenAdaptAI/openadapt-evals) |
| `openadapt-viewer` | HTML visualization | [openadapt-viewer](https://github.com/OpenAdaptAI/openadapt-viewer) |
diff --git a/my-task/video.mp4 b/my-task/video.mp4
new file mode 100644
index 000000000..2782b5c7d
Binary files /dev/null and b/my-task/video.mp4 differ
diff --git a/my-task/viewer.html b/my-task/viewer.html
new file mode 100644
index 000000000..d13a59e58
--- /dev/null
+++ b/my-task/viewer.html
@@ -0,0 +1,1287 @@
+
+
+
+
+
+ Capture Viewer - ae37999b
+
+
+
+
+
+
+
+
+
+
![Frame]()
+
+
0:00.00
+
+
+
+
+
+
+
+
+
+
+ 0:00.00 / 0:22.43
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Keyboard: Space (play/pause) | ← → (prev/next) | Home/End (first/last) | O (toggle overlay)
+
+
+
+
+
+
+
+
diff --git a/openadapt/cli.py b/openadapt/cli.py
index 8c34afe25..86e73e944 100644
--- a/openadapt/cli.py
+++ b/openadapt/cli.py
@@ -78,7 +78,6 @@ def capture_start(name: str, video: bool, audio: bool):
capture_video=video,
capture_audio=audio,
) as recorder:
- recorder.wait_for_ready()
click.echo("Recording...")
try:
while recorder.is_recording:
@@ -115,7 +114,7 @@ def capture_list(path: str):
captures_found = 0
for capture_dir in sorted(Path(path).iterdir()):
- if capture_dir.is_dir() and (capture_dir / "recording.db").exists():
+ if capture_dir.is_dir() and (capture_dir / "capture.db").exists():
try:
cap = Capture.load(str(capture_dir))
desc = cap.task_description or ""
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 000000000..939c121e4
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,36 @@
+annotated-types==0.7.0
+anyio==4.12.1
+av==16.1.0
+certifi==2026.2.25
+cffi==2.0.0
+click==8.3.1
+distro==1.9.0
+evdev==1.9.3
+fire==0.7.1
+h11==0.16.0
+httpcore==1.0.9
+httpx==0.28.1
+idna==3.11
+jiter==0.13.0
+mss==10.1.0
+numpy==2.4.2
+openadapt==1.0.6
+openadapt-capture==0.3.0
+openai==2.24.0
+pillow==12.1.1
+pycparser==3.0
+pydantic==2.12.5
+pydantic-settings==2.13.1
+pydantic_core==2.41.5
+pynput==1.8.1
+python-dotenv==1.2.1
+python-xlib==0.33
+six==1.17.0
+sniffio==1.3.1
+sounddevice==0.5.5
+soundfile==0.13.1
+termcolor==3.3.0
+tqdm==4.67.3
+typing-inspection==0.4.2
+typing_extensions==4.15.0
+websockets==16.0