____ ____ _
| _ \ _ __ _ _| _ \ ___ ___| | __
| | | | '__| | | | | | |/ _ \ / __| |/ /
| |_| | | | |_| | |_| | (_) | (__| <
|____/|_| \__, |____/ \___/ \___|_|\_\
|___/
Local-first CLI coding agent. Chart your course. Execute with precision.
DryDock is a TUI coding assistant designed to work with local LLMs. It provides a conversational interface to your codebase — explore, modify, build, and test projects through natural language and a powerful set of tools.
Important
DryDock is tested and optimized for Gemma 4 26B-A4B (26B MoE, 4B active parameters) served via vLLM. Other models and providers are supported (Mistral, OpenAI, Anthropic, Ollama) but are not as thoroughly tested. If you use a different model, expect to tune prompts and tool settings.
| Component | Spec |
|---|---|
| GPUs | 2x NVIDIA RTX 4060 Ti 16GB |
| Model | Gemma-4-26B-A4B-it-AWQ-4bit |
| Serving | vLLM (Docker image vllm/vllm-openai:gemma4) |
| Performance | ~70 tok/s, 131K context, 0% timeouts |
| Active params | 4B per token (MoE architecture — fast inference) |
# Download the model weights (requires HuggingFace access)
pip install huggingface-hub
huggingface-cli download casperhansen/gemma-4-26b-a4b-it-AWQ-4bit \
--local-dir /path/to/models/Gemma-4-26B-A4B-it-AWQ-4bitdocker run -d \
--gpus all \
--name gemma4 \
-p 8000:8000 \
-v /path/to/models:/models \
--ipc=host \
vllm/vllm-openai:gemma4 \
--model /models/Gemma-4-26B-A4B-it-AWQ-4bit \
--quantization compressed-tensors \
--tensor-parallel-size 2 \
--max-model-len 131072 \
--max-num-seqs 2 \
--gpu-memory-utilization 0.95 \
--kv-cache-dtype fp8 \
--served-model-name gemma4 \
--trust-remote-code \
--tool-call-parser gemma4 \
--enable-auto-tool-choice \
--attention-backend TRITON_ATTNKey flags:
--tensor-parallel-size 2— split across 2 GPUs--kv-cache-dtype fp8— reduce KV cache memory for longer contexts--tool-call-parser gemma4+--enable-auto-tool-choice— required for Gemma 4 tool calling--max-num-seqs 2— limit concurrent requests (prevents OOM on 16GB GPUs)
Verify the model is running:
curl http://localhost:8000/v1/models# ~/.drydock/config.toml
[models.gemma4]
name = "gemma4"
provider = "generic-openai"
alias = "gemma4"
temperature = 0.2
thinking = "high"
[providers.generic-openai]
api_base = "http://localhost:8000/v1"
api_style = "openai"pip install drydock-cliOr with uv:
uv tool install drydock-clicd your-project/
drydockFirst run creates a config at ~/.drydock/config.toml and prompts for your provider setup.
> Review the PRD and build the package
- TUI Interface: Full terminal UI with streaming output, tool approval, and session management.
- Adaptive Thinking: Automatically adjusts reasoning depth per turn — full thinking for planning, fast mode for file writes.
- Powerful Toolset: Read, write, and patch files. Execute shell commands. Search code with
grep. Delegate to subagents. - Project-Aware: Scans project structure, loads
AGENTS.md/DRYDOCK.mdfor context. - Subagent Delegation: Large tasks can be delegated to builder/planner/explorer subagents with isolated context.
- Loop Detection: Advisory-only detection that nudges the model away from repetitive actions without blocking.
- Conda/Pip Support: Auto-approves
pip install,conda install,pytest, and other dev commands. - Bundled Skills: Ships with skills like
create-presentationfor PowerPoint generation. - MCP Support: Connect Model Context Protocol servers for extended capabilities.
- Safety First: Tool execution approval with
--dangerously-skip-permissionsfor full auto-approve.
default: Standard agent that requires approval for tool executions.plan: Read-only agent for exploration and planning.accept-edits: Auto-approves file edits only.auto-approve: Auto-approves all tool executions.
drydock --agent planDryDock includes several optimizations specifically tuned for Gemma 4:
- Simplified prompt (
gemma4.md): 20-line system prompt instead of 125 lines. Complex prompts cause Gemma 4 to plan instead of act. - Non-streaming mode: Streaming breaks Gemma 4 tool call JSON parsing. DryDock automatically disables streaming for Gemma 4.
- Thinking token filtering: Gemma 4 leaks
<|channel>thought<channel|>tokens into text output. DryDock strips these before storing in context. - Adaptive thinking: Full thinking for planning (turn 1) and error recovery. Thinking OFF for routine file writes — eliminates 30-120s hangs between files.
- search_replace resilience: Auto-detects already-applied edits, infers missing file paths, fuzzy-matches whitespace differences.
- Reduced tool set: Disables tools that confuse Gemma 4 (
ask_user_question,task_create, etc.).
drydock # Start interactive session
drydock "Fix the login bug" # Start with a prompt
drydock --continue # Resume last session
drydock --resume abc123 # Resume specific sessionKeyboard shortcuts:
Ctrl+C— Cancel current operation (double-tap to quit)Shift+Tab— Toggle auto-approve modeCtrl+O— Toggle tool outputCtrl+G— Open external editor@— File path autocompletion!command— Run shell command directly
drydock --prompt "Analyze the codebase" --max-turns 5 --output json
drydock --dangerously-skip-permissions -p "Fix all lint errors"DryDock is configured via config.toml. It looks first in ./.drydock/config.toml, then ~/.drydock/config.toml.
drydock --setup # Interactive setup
export MISTRAL_API_KEY="your_key" # Or set env varKeys are saved to ~/.drydock/.env.
Set a smarter model for the /consult command:
consultant_model = "gemini-2.5-pro"The consultant provides read-only advice — it never calls tools. Use /consult <question> to ask it.
Create agent configs in ~/.drydock/agents/:
# ~/.drydock/agents/redteam.toml
active_model = "devstral-2"
system_prompt_id = "redteam"
disabled_tools = ["search_replace", "write_file"]DryDock discovers skills from:
- Custom paths in
config.tomlviaskill_paths - Project
.drydock/skills/or.agents/skills/ - Global
~/.drydock/skills/ - Bundled skills (shipped with the package)
[[mcp_servers]]
name = "fetch_server"
transport = "stdio"
command = "uvx"
args = ["mcp-server-fetch"]DryDock uses a shakedown harness (scripts/shakedown.py) that drives the real TUI via pexpect and judges on user-perceptible criteria — not tool-call counts.
# Single project test
python3 scripts/shakedown.py \
--cwd /path/to/project \
--prompt "review the PRD and build the package" \
--pkg package_name
# Interactive back-and-forth test
python3 scripts/shakedown_interactive.py \
--cwd /path/to/project \
--pkg package_name
# Full regression suite (370 PRDs)
bash scripts/shakedown_suite.shPass criteria: no write loops, no ignored interrupts, no search_replace cascades, package executes, session finishes within time budget.
Type /help in the input for available commands. Create custom slash commands via the skills system.
drydock --continue # Continue last session
drydock --resume abc123 # Resume specific session
drydock --workdir /path/to/dir # Set working directoryCopyright 2025 Mistral AI (original work) Copyright 2026 DryDock contributors (modifications)
Licensed under the Apache License, Version 2.0. See LICENSE for details.
DryDock is a fork of mistralai/mistral-vibe (Apache 2.0). See NOTICE for attribution.