diff --git a/CHANGELOG.md b/CHANGELOG.md
index bf1afea..bd82ff1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
# Changelog
-## [2.0.4] - 2026-XX-XX (WIP)
+## [2.0.4] - 2026-02-11
> **First stable release with Audio/STT support.** This release consolidates beta.9 and beta.10 improvements into a production-ready package.
@@ -18,8 +18,12 @@
- `test_whisper_tokenizer.py`: 47 tests for tiktoken workaround (get_encoding, get_tokenizer, Tokenizer class)
- `TestEmbeddingGate`: 3 tests for embedding model runtime blocking
+- **Test Infrastructure:** Test suite now runs consistently with `unset HF_HOME` (uses fallback models)
+
### Fixed (since beta.10)
+- **`serve --model` Pre-Validation:** Model ambiguity and not-found errors now detected before server starts. Previously showed stacktrace; now shows clean error message with suggestions.
+
- **Run Preflight Consistency:** `run.py` now passes `probe` and `framework` to `audio_runtime_compatibility()`. STT model_type and tekken.json gates now work in CLI (previously only in list/health).
- **STT model_type Gate:** Extended to accept `vibevoice` and `audio` model types (was only `whisper`/`voxtral`). VibeVoice-ASR and future STT models no longer blocked incorrectly.
diff --git a/README.md b/README.md
index e1638b4..93db695 100644
--- a/README.md
+++ b/README.md
@@ -4,9 +4,9 @@
-**Current Version: 2.0.4-beta.10** (Stable: 2.0.3)
+**Current Version: 2.0.4** (Stable)
-[](https://github.com/mzau/mlx-knife/releases)
+[](https://github.com/mzau/mlx-knife/releases)
[](https://www.apache.org/licenses/LICENSE-2.0)
[](https://www.python.org/downloads/)
[](https://support.apple.com/en-us/HT211814)
@@ -17,10 +17,8 @@
## Features
-> **⚠️ Beta.9 Audio Bug:** If you installed `mlx-knife[audio]==2.0.4b9` from PyPI, audio transcription fails with "Processor not found". Upgrade to beta.10: `pip install mlx-knife[all]==2.0.4b10`
-
-### What's New in 2.0.4 (Coming Soon - Currently Beta)
-- **Audio Transcription (STT)** - Whisper speech-to-text (`--audio` flag, `pip install mlx-knife[audio]`)
+### What's New in 2.0.4
+- **Audio Transcription (STT)** - Whisper speech-to-text (`--audio` flag)
- **Vision Models with EXIF Metadata** - Image analysis + automatic GPS/date/camera extraction visible to the model
- **Unix Pipe Integration** - Chain models without temp files (`vision → text` workflows)
- **Local Development Workflow** - Clone → Repair → Test models without HuggingFace round-trips
@@ -79,42 +77,33 @@ This license applies **only** to the `mlx-knife` code and **does not extend** to
### Python Compatibility
✅ **Python 3.10 - 3.12** - Full support (Text + Vision + Audio)
-❌ **Python 3.9** - Not supported (MLX 0.30+ requires 3.10+)
+❌ **Python 3.9** - Use version 2.0.3 (text + cache management only)
❌ **Python 3.13+** - Not supported (miniaudio lacks pre-built wheels)
-**Note:** Vision/Audio features require Python 3.10+. Recommended: **Python 3.10 or 3.11** for best compatibility.
+**Recommended:** Python 3.10 or 3.11 for best compatibility.
## Installation
-### 1. PyPI Stable (2.0.3 - Text models only)
+### 1. PyPI (Recommended)
```bash
pip install mlx-knife
-mlxk --version # → mlxk 2.0.3
-```
-
-**Requirements:** macOS Apple Silicon, Python 3.9-3.12
-
-### 2. PyPI Beta (2.0.4-beta.10 - Text + Vision + Audio)
-
-```bash
-pip install mlx-knife[all]==2.0.4b10
-mlxk --version # → mlxk 2.0.4b10
+mlxk --version # → mlxk 2.0.4
```
**Requirements:** macOS Apple Silicon, Python 3.10-3.12
-**Features:** Audio STT (Whisper), Vision with EXIF metadata, full tiktoken workaround
+**Includes:** Text, Vision, Audio (Whisper STT), EXIF metadata, Unix pipes
-### 3. Developer Installation
+### 2. Developer Installation
```bash
git clone https://github.com/mzau/mlx-knife.git
cd mlx-knife
-pip install -e ".[all,dev,test]"
+pip install -e ".[dev,test]"
-mlxk --version # → mlxk 2.0.4b10
+mlxk --version # → mlxk 2.0.4
pytest -v
```
@@ -285,8 +274,7 @@ Image analysis via the `--image` flag (CLI and server). Requires Python 3.10+.
#### Requirements
- **Python 3.10+** (mlx-vlm dependency)
-- **Installation:** `pip install mlx-knife[vision]`
-- **Backend:** mlx-vlm 0.3.10 (auto-installed from PyPI)
+- **Backend:** mlx-vlm 0.3.10 (included in base install)
#### Usage
@@ -424,7 +412,7 @@ curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/jso
**⚠️ Important:** Vision support relies on mlx-vlm (upstream), which has known stability issues. While `mlxk health` verifies file integrity, **runtime failures may occur** with certain model architectures due to upstream bugs.
-**✅ Tested & Working Models** (mlx-knife v2.0.4-beta.6):
+**✅ Tested & Working Models** (mlx-knife v2.0.4):
| Model | Size | Notes |
|-------|------|-------|
@@ -452,14 +440,13 @@ mlxk convert