Drydock

A local-first, provider-agnostic terminal coding agent for your own LLM.

No accounts, no telemetry, no cloud — your code and credentials never leave your machine.

Apache-2.0 · clean-room 100% local Windows · macOS · Linux pip · drydock-cli
$ pip install drydock-cli
$ drydock  # autodetects your local model server
19+
built-in tools
14
bundled skills
0
telemetry calls
100%
on your machine

Everything an agent needs — on your machine

A full agentic CLI harness in a Textual TUI: scrolling transcript, collapsible tool & reasoning cards, a live activity line. The model drives every tool below autonomously — all clean-room, dependency-free (nothing beyond openai + textual).

🗂️

Files & shell

Read (with a structure index for huge files), Write, Edit, Bash, Glob, Grep — with advisory write guards.

👁️

Vision

Point at an image — a screenshot, mockup, or diagram — and a vision model sees it. The agent can also Screenshot your screen and read it back.

🔀

Version control

First-class GitStatus / GitDiff / GitLog / GitCommit — structured and truncated; commits are local and reversible.

🌐

Internet search

WebSearch + WebFetch bring live results and pages into context — and degrade cleanly offline.

📚

GraphRAG knowledge base

Ingest your docs — text, PDF, Word, STIG checklists — with /graphrag build; the agent retrieves facts via the Knowledge tool.

🧭

Multi-agent

Dispatch runs read-only sub-agents in parallel, each in a fresh context, for focused investigation.

🧠

Second-model advisor

Wire in a stronger model (e.g. Gemini, any OpenAI-compatible endpoint) with /advisor; the agent consults it when stuck.

🔌

MCP support

Connect Model Context Protocol servers; their tools appear as mcp__server__tool — works with third-party servers like Graphify.

🛡️

Governed reliability

The model proposes; the harness governs. Explicit task phases, a verification gate on "done", per-action progress scoring, and graduated recovery when a run stalls — advisory → reflection → suppressing the looping call → an honest stop. Watch it work: /events · /trace.

⏯️

Interrupt & resume

Every turn checkpoints the session. Killed mid-task? The next launch offers /resume — the transcript and objective come back, and anything left in-flight is flagged before it's retried.

🧮

Model registry

Keep several model servers configured and switch live: /model add qwen http://box2:8001/v1, then /model qwen — each model routes to its own endpoint, with a configurable default.

Local-first, by design

Drydock is an original, Apache-2.0, clean-room codebase owned end to end.

  • The only outbound calls are to the model endpoint you configure and (optionally) the web tools you invoke.
  • No telemetry, no phone-home, no hardcoded third-party hosts, no credential transmission — ever.
  • A credential-exfiltration scanner gates every release and blocks anything reaching off-box.
  • Safety is advisory, never blocking: catastrophic commands are refused; sensitive ones prompt Allow / Always / Deny.

Bundled skills

Reusable /<name> commands — author your own as markdown, or use the built-in families for compliance and ML engineering.

⚖️

NIST governance

Defensive, clean-room skills for AI & cyber risk management.

/nist-ai-rmf/nist-csf
📋

RMF & STIG automation

Ingest the NIST 800-53 catalog and DISA STIG benchmarks; assess, remediate, and export POA&Ms — 100% local for CUI.

/rmf-*/stig-*
🔬

ML engineering

PyTorch workflows: training, full & LoRA fine-tuning, metrics (F1 · MCC · ROC-AUC), RL, and data prep.

/ml-train/ml-finetune/ml-metrics/ml-debug/ml-rl/ml-data

Runs on your hardware

Provider-agnostic — any OpenAI-compatible endpoint (llama.cpp, vLLM, Ollama, LM Studio). Tuned against dense Gemma-4-31B (QAT, 64K) on a single workstation; first launch autodetects a local model server with no account or API-key prompt.

Serve Gemma-4-31B on a 2×GPU box — either runtime exposes an OpenAI API on :8000 as gemma4:

# llama.cpp — flexible concurrency
llama-server -m gemma-4-31B-it-qat-UD-Q4_K_XL.gguf -c 65536 -np 2 --port 8000 --alias gemma4

# vLLM — ~2× faster/request, 128K context (max-num-seqs 2)
docker run -d --gpus all --ipc=host -v /data3/Models:/models -p 8000:8000 -e NCCL_P2P_DISABLE=1 \
  vllm/vllm-openai:v0.26.0 --model /models/gemma-4-31B-it-qat-w4a16-ct --served-model-name gemma4 \
  --tensor-parallel-size 2 --max-model-len 131072 --max-num-seqs 2 --gpu-memory-utilization 0.97 \
  --kv-cache-dtype fp8 --tool-call-parser gemma4 --enable-auto-tool-choice

Then point drydock at it: drydock --provider vllm --base-url http://<host>:8000/v1 --model gemma4. Drydock handles the vLLM-Gemma quirks (empty-content-on-truncation, /props fallback) as of 3.1.7.

Tools  Read · Write · Edit · Bash · Glob · Grep · ViewImage · Screenshot · todo · task · Dispatch · Worker · GitStatus · GitDiff · GitLog · GitCommit · WebSearch · WebFetch · Knowledge · BuildKnowledge · mcp__<server>__<tool>

Commands  /help · /model · /cwd · /undo · /back · /resume · /compact · /context · /graphrag · /events · /trace · /shell · /skills · /loop · /mcp · /advisor · /ask · /status · /clear · /quit

Or just ask the agent — "how do I add my own docs?" — it knows its own commands.