diff --git a/CHANGELOG.md b/CHANGELOG.md
index 50196fa..b6d68b9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,9 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased]
-### Fixed
-- TUI freezes during fast LLM streaming and parallel tool execution: biased event loop with input priority and agent event batching (#500)
-- Redundant syntax highlighting and markdown parsing on every TUI frame: per-message render cache with content-hash keying (#501)
+## [0.11.0] - 2026-02-19
### Added
- Vision (image input) support across Claude, OpenAI, and Ollama providers (#490)
@@ -49,6 +47,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- Shell-based installation script (`install/install.sh`) with SHA256 verification, platform detection, and `--version` flag
- Shellcheck lint job in CI pipeline
- Per-job permission scoping in release workflow (least privilege)
+- TUI word-jump and line-jump cursor navigation (#557)
+- TUI keybinding help popup on `?` in normal mode (#533)
+- TUI clickable hyperlinks via OSC 8 escape sequences (#530)
+- TUI edit-last-queued for recalling queued messages (#535)
+- VectorStore trait abstraction in zeph-memory (#554)
+- Operation-level cancellation for LLM requests and tool executions (#538)
+
+### Changed
+- Consolidate Docker files into `docker/` directory (#539)
+- Typed deserialization for tool call params (#540)
+- CI: replace oraclelinux base image with debian bookworm-slim (#532)
+
+### Fixed
+- Strip schema metadata and fix doom loop detection for native tool calls (#534)
+- TUI freezes during fast LLM streaming and parallel tool execution: biased event loop with input priority and agent event batching (#500)
+- Redundant syntax highlighting and markdown parsing on every TUI frame: per-message render cache with content-hash keying (#501)
## [0.10.0] - 2026-02-18
@@ -928,7 +942,8 @@ let agent = Agent::new(provider, channel, &skills_prompt, executor);
- Agent calls channel.send_typing() before each LLM request
- Agent::run() uses tokio::select! to race channel messages against shutdown signal
-[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.10.0...HEAD
+[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.11.0...HEAD
+[0.11.0]: https://github.com/bug-ops/zeph/compare/v0.10.0...v0.11.0
[0.10.0]: https://github.com/bug-ops/zeph/compare/v0.9.9...v0.10.0
[0.9.9]: https://github.com/bug-ops/zeph/compare/v0.9.8...v0.9.9
[0.9.8]: https://github.com/bug-ops/zeph/compare/v0.9.7...v0.9.8
diff --git a/Cargo.lock b/Cargo.lock
index 42322e3..f6b4ce2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -8780,7 +8780,7 @@ dependencies = [
[[package]]
name = "zeph"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"anyhow",
"clap",
@@ -8813,7 +8813,7 @@ dependencies = [
[[package]]
name = "zeph-a2a"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"axum 0.8.8",
"eventsource-stream",
@@ -8837,7 +8837,7 @@ dependencies = [
[[package]]
name = "zeph-channels"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"axum 0.8.8",
"criterion",
@@ -8850,6 +8850,7 @@ dependencies = [
"sha2",
"subtle",
"teloxide",
+ "tempfile",
"thiserror 2.0.18",
"tokio",
"tokio-tungstenite",
@@ -8859,7 +8860,7 @@ dependencies = [
[[package]]
name = "zeph-core"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"age",
"anyhow",
@@ -8889,7 +8890,7 @@ dependencies = [
[[package]]
name = "zeph-gateway"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"axum 0.8.8",
"blake3",
@@ -8906,7 +8907,7 @@ dependencies = [
[[package]]
name = "zeph-index"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"blake3",
"ignore",
@@ -8938,7 +8939,7 @@ dependencies = [
[[package]]
name = "zeph-llm"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"anyhow",
"base64 0.22.1",
@@ -8965,7 +8966,7 @@ dependencies = [
[[package]]
name = "zeph-mcp"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"blake3",
"qdrant-client",
@@ -8984,7 +8985,7 @@ dependencies = [
[[package]]
name = "zeph-memory"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"anyhow",
"criterion",
@@ -9007,7 +9008,7 @@ dependencies = [
[[package]]
name = "zeph-scheduler"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"chrono",
"cron",
@@ -9022,7 +9023,7 @@ dependencies = [
[[package]]
name = "zeph-skills"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"anyhow",
"blake3",
@@ -9046,7 +9047,7 @@ dependencies = [
[[package]]
name = "zeph-tools"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"dirs",
"filetime",
@@ -9070,7 +9071,7 @@ dependencies = [
[[package]]
name = "zeph-tui"
-version = "0.10.0"
+version = "0.11.0"
dependencies = [
"anyhow",
"crossterm",
diff --git a/Cargo.toml b/Cargo.toml
index 6b53030..2d90aa4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,7 +5,7 @@ resolver = "3"
[workspace.package]
edition = "2024"
rust-version = "1.88"
-version = "0.10.0"
+version = "0.11.0"
authors = ["bug-ops"]
license = "MIT"
repository = "https://github.com/bug-ops/zeph"
@@ -85,18 +85,18 @@ unicode-width = "0.2"
url = "2.5"
uuid = "1.21"
cron = "0.15"
-zeph-a2a = { path = "crates/zeph-a2a", version = "0.10.0" }
-zeph-channels = { path = "crates/zeph-channels", version = "0.10.0" }
-zeph-core = { path = "crates/zeph-core", version = "0.10.0" }
-zeph-index = { path = "crates/zeph-index", version = "0.10.0" }
-zeph-llm = { path = "crates/zeph-llm", version = "0.10.0" }
-zeph-mcp = { path = "crates/zeph-mcp", version = "0.10.0" }
-zeph-memory = { path = "crates/zeph-memory", version = "0.10.0" }
-zeph-skills = { path = "crates/zeph-skills", version = "0.10.0" }
-zeph-tools = { path = "crates/zeph-tools", version = "0.10.0" }
-zeph-gateway = { path = "crates/zeph-gateway", version = "0.10.0" }
-zeph-scheduler = { path = "crates/zeph-scheduler", version = "0.10.0" }
-zeph-tui = { path = "crates/zeph-tui", version = "0.10.0" }
+zeph-a2a = { path = "crates/zeph-a2a", version = "0.11.0" }
+zeph-channels = { path = "crates/zeph-channels", version = "0.11.0" }
+zeph-core = { path = "crates/zeph-core", version = "0.11.0" }
+zeph-index = { path = "crates/zeph-index", version = "0.11.0" }
+zeph-llm = { path = "crates/zeph-llm", version = "0.11.0" }
+zeph-mcp = { path = "crates/zeph-mcp", version = "0.11.0" }
+zeph-memory = { path = "crates/zeph-memory", version = "0.11.0" }
+zeph-skills = { path = "crates/zeph-skills", version = "0.11.0" }
+zeph-tools = { path = "crates/zeph-tools", version = "0.11.0" }
+zeph-gateway = { path = "crates/zeph-gateway", version = "0.11.0" }
+zeph-scheduler = { path = "crates/zeph-scheduler", version = "0.11.0" }
+zeph-tui = { path = "crates/zeph-tui", version = "0.11.0" }
[workspace.lints.clippy]
all = "warn"
diff --git a/README.md b/README.md
index ed24ce3..e62341e 100644
--- a/README.md
+++ b/README.md
@@ -25,16 +25,26 @@ Zeph takes the opposite approach: **automated context engineering**. Only releva
## Installation
-```bash
-# One-liner (Linux and macOS)
-curl -fsSL https://github.com/bug-ops/zeph/releases/latest/download/install.sh | sh
+> [!TIP]
+> ```bash
+> curl -fsSL https://github.com/bug-ops/zeph/releases/latest/download/install.sh | sh
+> ```
+
+
+Other installation methods
+```bash
# From source
cargo install --git https://github.com/bug-ops/zeph
+
+# Docker
+docker pull ghcr.io/bug-ops/zeph:latest
```
Pre-built binaries for Linux, macOS, and Windows: [GitHub Releases](https://github.com/bug-ops/zeph/releases/latest) · [Docker](https://bug-ops.github.io/zeph/guide/docker.html)
+
+
## Quick Start
```bash
diff --git a/crates/zeph-llm/README.md b/crates/zeph-llm/README.md
index c245ff9..8561fe8 100644
--- a/crates/zeph-llm/README.md
+++ b/crates/zeph-llm/README.md
@@ -19,6 +19,7 @@ Defines the `LlmProvider` trait and ships concrete backends for Ollama, Claude,
| `orchestrator` | Multi-model coordination and fallback |
| `router` | Model selection and routing logic |
| `vision` | Image input support — base64-encoded images in LLM requests; optional dedicated `vision_model` per provider |
+| `extractor` | `chat_typed()` — typed LLM output via JSON Schema (`schemars`) |
| `stt` | `SpeechToText` trait and `WhisperProvider` (OpenAI Whisper, feature-gated behind `stt`) |
| `candle_whisper` | Local offline STT via Candle (whisper-tiny/base/small, feature-gated behind `candle`) |
| `error` | `LlmError` — unified error type |
diff --git a/crates/zeph-tui/src/widgets/snapshots/zeph_tui__widgets__splash__tests__splash_default.snap b/crates/zeph-tui/src/widgets/snapshots/zeph_tui__widgets__splash__tests__splash_default.snap
index 3151c0c..2f90eff 100644
--- a/crates/zeph-tui/src/widgets/snapshots/zeph_tui__widgets__splash__tests__splash_default.snap
+++ b/crates/zeph-tui/src/widgets/snapshots/zeph_tui__widgets__splash__tests__splash_default.snap
@@ -14,7 +14,7 @@ expression: output
│ ███████╗███████╗██║ ██║ ██║ │
│ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ │
│ │
-│ v0.10.0 │
+│ v0.11.0 │
│ │
│ Type a message to start. │
│ │
diff --git a/docs/src/architecture/crates.md b/docs/src/architecture/crates.md
index 35a005a..5f13b42 100644
--- a/docs/src/architecture/crates.md
+++ b/docs/src/architecture/crates.md
@@ -23,7 +23,7 @@ Agent loop, bootstrap orchestration, configuration loading, and context builder.
LLM provider abstraction and backend implementations.
-- `LlmProvider` trait — `chat()`, `chat_stream()`, `embed()`, `supports_streaming()`, `supports_embeddings()`, `supports_vision()`
+- `LlmProvider` trait — `chat()`, `chat_typed()`, `chat_stream()`, `embed()`, `supports_streaming()`, `supports_embeddings()`, `supports_vision()`
- `MessagePart::Image` — image content part (raw bytes + MIME type) for multimodal input
- `EmbedFuture` / `EmbedFn` — canonical type aliases for embedding closures, re-exported by downstream crates (`zeph-skills`, `zeph-mcp`)
- `OllamaProvider` — local inference via ollama-rs
diff --git a/docs/src/changelog.md b/docs/src/changelog.md
index 1802d65..44fa141 100644
--- a/docs/src/changelog.md
+++ b/docs/src/changelog.md
@@ -8,9 +8,36 @@ See the full [CHANGELOG.md](https://github.com/bug-ops/zeph/blob/main/CHANGELOG.
## [Unreleased]
+## [0.11.0] - 2026-02-19
+
+### Added
+- Vision (image input) support across Claude, OpenAI, and Ollama providers (#490)
+- Interactive configuration wizard via `zeph init` subcommand with 5-step setup
+- clap-based CLI argument parsing with `--help`, `--version` support
+- Structured LLM output via `chat_typed()` with JSON schema enforcement
+- Pipeline API with composable `Step` trait, `Pipeline` builder, and `ParallelStep` combinator
+- Structured intent classification for skill disambiguation
+- DocumentLoader trait with text/markdown/PDF file loaders in zeph-memory
+- Document ingestion pipeline: load, split, embed, store via Qdrant
+- Audio input support with `SpeechToText` trait and OpenAI Whisper backend (feature: `stt`)
+- Local Whisper backend via candle for offline STT
+- Telegram voice/audio message handling with automatic file download
+- Slack audio file upload handling with host validation and size limits
+- Shell-based installation script with SHA256 verification and platform detection
+- TUI test automation infrastructure with insta snapshots and proptest
+- TUI word-jump, line-jump cursor navigation, keybinding help popup, clickable hyperlinks
+- VectorStore trait abstraction in zeph-memory
+- Operation-level cancellation for LLM requests and tool executions
+
+### Changed
+- Consolidate Docker files into `docker/` directory
+- Typed deserialization for tool call params
+- CI: replace oraclelinux base image with debian bookworm-slim
+
### Fixed
-- TUI freezes during fast LLM streaming and parallel tool execution: biased event loop with input priority and agent event batching (#500)
-- Redundant syntax highlighting and markdown parsing on every TUI frame: per-message render cache with content-hash keying (#501)
+- Strip schema metadata and fix doom loop detection for native tool calls (#534)
+- TUI freezes during fast LLM streaming and parallel tool execution (#500)
+- Redundant syntax highlighting and markdown parsing on every TUI frame (#501)
## [0.10.0] - 2026-02-18
diff --git a/docs/src/getting-started/installation.md b/docs/src/getting-started/installation.md
index f000266..0c0d007 100644
--- a/docs/src/getting-started/installation.md
+++ b/docs/src/getting-started/installation.md
@@ -19,7 +19,7 @@ ZEPH_INSTALL_DIR=/usr/local/bin curl -fsSL https://github.com/bug-ops/zeph/relea
Install a specific version:
```bash
-curl -fsSL https://github.com/bug-ops/zeph/releases/latest/download/install.sh | sh -s -- --version v0.10.0
+curl -fsSL https://github.com/bug-ops/zeph/releases/latest/download/install.sh | sh -s -- --version v0.11.0
```
After installation, run the configuration wizard: