A CLI agent
close to
the modelNo guardrails
Bring your own model. haze can read and edit files, attach images, run commands and dev servers, fetch URLs, manage tasks, delegate work, and follow Markdown skills. LSP navigation is optional.
$npm i -g @denizokcu/haze
Three commands.
Install haze, add an OpenAI-compatible endpoint, and pick a model.
- 01 $npm i -g @denizokcu/haze Install globally from npm.
- 02 haze Open haze from a project directory.
- 03 /provider then /model Add any OpenAI-compatible endpoint and pick a model. OpenRouter, OpenAI, LM Studio, Ollama, or a proxy.
That's the core. There is no Pro plan. To save a workflow, open /skills, choose add skill, and use the wizard below.
Create skills
inside haze.
Open /skills, choose add skill, and describe the job. You decide whether the Markdown file belongs to this project or in your global haze directory. Once it exists, call it like any other slash command.
Skills are ordinary Markdown files. Put a team workflow in .haze/skills or keep a personal one in ~/.haze/skills.
haze labels project skills as repository content. A project skill takes priority over a global skill with the same name unless you disable it.
The model can load a matching skill on its own, or you can call the skill by name.
You can also load a skill directly. Type /code-review in the chat to run it as a slash command.
Watch it work.
Tool calls appear in compact activity blocks while they run. haze shows the work but does not pause for approval.
Type @ to browse files in the workspace. If you type a file or directory path yourself, haze can read it for that turn even when it sits outside the workspace. Edits still stay inside the project. Images only go to providers you have marked as image-capable.
haze can keep up to five dev servers or watchers running in the background. Each process has a capped output log. Aborting a turn leaves it running; starting a new session or leaving haze stops it.
If a job splits into separate pieces, /fleet can hand them to disposable workers. Each worker starts with fresh project instructions and fixed limits. The main conversation only receives the short result.
Failed and repeated tool calls include a recovery hint. File pages use a sparse line index, and a timed-out command cannot hang haze just because one of its children kept an output pipe open.
haze reads global guidance and the project's root instructions at startup. It picks up nested instructions when it reaches that part of the tree and reads them again if they change.
Session files skip streaming chatter and bulky raw output. Use /resume to browse old workspace sessions, continue one, or fork a copy.
What the model can use.
haze ships with the tools below and collects no telemetry. The fetch tool handles network reads and only accepts public URLs.
Browse project files with cursor pagination. A directory path typed by the user can also open that directory for reading during the turn.
Read numbered UTF-8 lines in bounded pages. A small, signature-checked index speeds up later pages. User-typed paths can open files outside the workspace for reading during that turn.
Search with the bundled ripgrep binary. Results have one global cap, and ignored paths require an explicit override.
Page through raw output that was too large for the original result. The retained data has fixed memory limits.
Look up symbols, definitions, and references through a language server you configure. haze kills the server process tree if normal shutdown fails.
Unique text replacements with line-prefix tolerance and recovery hints.
Line-range edits with EOF clamping for slightly-oversized ranges.
Create files and parent directories.
Run commands with capped output and report the cwd, duration, classification, and validation result. Set background=true to register a dev server or watcher. If a foreground command times out or is aborted, haze kills its process tree and does not wait forever on an open pipe.
List background work, read its output, or stop it. haze allows five registered processes, each with a 256 KB rolling output window. The status bar shows how many are running. A session reset or haze exit stops them all.
Read public http(s) URLs as Markdown, formatted JSON, or text. haze rejects unsafe schemes, private addresses, and malformed IPv6-like hosts. It checks redirects and pins each connection to the public IP it validated.
Replace the workspace task list when the work enters a new phase. haze assigns the IDs and clears a completed list on the next user turn.
Load a global or project Markdown workflow, then read its references as needed. Results show where the skill came from, and haze marks project skills as untrusted repository content.
Send separate tasks to disposable workers. A worker starts with the project instructions for its scope and only the tools allowed by its mode. Its private context stays private; the parent gets a short result. If a worker ignores an abort, haze keeps its concurrency or mutation slot occupied until it actually stops.
Use /lsp to configure read-only language-server navigation. Presets are included for TypeScript, Rust, Python, Go, and PHP, but haze does not install the servers. LSP tools only appear when an enabled server command is on PATH. Otherwise the model uses grep, listFiles, and readFile. When haze closes a server or receives bad protocol data, it terminates the server's process tree and forces it to exit if needed.
Bring your
own model.
Use any OpenAI-compatible endpoint. Add its URL and key with /provider. Then let /model fetch the available models, or type them yourself if discovery fails. haze never picks one for you. A remote endpoint needs HTTPS when you send credentials, but loopback HTTP still works. To send png, jpeg, gif, or webp files, mark the provider as image-capable. A path you type may point outside the workspace, though haze will only read it.
| Provider | Type | Status |
|---|---|---|
| OpenAI | Hosted | Supported |
| Anthropic | via OpenRouter | Supported |
| via OpenRouter | Supported | |
| Mistral AI | Hosted | Supported |
| Meta | via OpenRouter | Supported |
| Ollama | Local | Supported |
| LM Studio | Local | Supported |
| OpenRouter | Aggregator | Supported |
| Groq | Hosted | Preset |
| DeepSeek, xAI, Cerebras | Hosted | Presets |
| Together, Fireworks, Hugging Face | Hosted | Presets |
| Moonshot, NVIDIA, Qwen | Hosted | Presets |
| Any OpenAI-compatible proxy | Custom | Supported |
Command
reference.
The core commands, aliases, model options, log options, and installed skills are listed here. The model uses writeTasks directly, so haze has no task command.
| Agent & Session | |
/help |
Show all slash commands. |
/exit, /quit |
Exit haze. |
/clear |
Clear conversation history and the task list. |
/new |
Start a fresh durable session for this workspace. |
/resume [id] |
Browse this workspace's sessions and either continue one or fork a copy. Pass an exact id to resume it directly. |
/session |
Show the current durable session file. |
/compact [instructions] |
Keep recent messages and condense older context into a size-limited excerpt, starting with the newest entries. The result says what it omitted. |
/init |
Create or update compact, budget-aware AGENTS.md project instructions. |
/context |
Show a token breakdown of the current request: system prompt, project context, tools (incl. MCP), and chat messages. |
/tips |
Toggle rotating keyboard and workflow tips beneath the busy label. |
/fleet [--review] [--profile name] [--workers provider:model] [--concurrency n] <prompt> |
Split independent work across disposable workers. The profile controls concurrency and deadlines, and each run has a tool limit. haze serializes file changes across retries. If a worker ignores an abort, its slot stays occupied until it stops. These options apply to one run, and haze declines work that cannot run in parallel. |
| Configuration | |
/provider |
Choose or add a provider. From there you can manage its models, set the API key, toggle image input, or remove the provider. |
/model |
Choose a configured model or fetch a provider's model list from its OpenAI-compatible /models endpoint. |
/model <name-or-provider:name> |
Set a model directly. Also sets its provider. |
/model list |
List all configured models. |
/settings |
Show provider, model, API key and image-capability status, LSP/MCP servers, skills, and loaded context files. |
/settings open |
Open ~/.haze/settings.json with the OS default app. |
/logs [id] |
List recent LLM logs, or summarize one by id. New detailed logs are written only when haze starts with --debug. |
/lsp |
Configure language-server navigation tools. Interactive picker: add a preset (typescript, rust, python, go, php) or a custom command, then enable/disable/remove. LSP tools appear only when an enabled server command is on PATH. |
/mcp |
Configure Model Context Protocol servers like Context7. Interactive picker: add a preset or custom http/sse/stdio server, then enable/disable/remove it or set a masked API key. MCP tools never shadow built-ins. |
| Skills | |
/skills |
Create and manage global or project Markdown skills. The picker shows each skill's source and lets you enable, disable, validate, or remove it. |
| Dynamic | |
/<skill-name> |
Invoke any installed skill directly, such as /code-review. The model can also invoke skills when they match a request. |
Terminal flags (run haze --help) | |
haze -p, --prompt <text> |
Run one non-interactive turn with the full toolset, print the final reply, and exit. Complete turns exit with 0; aborted or failed turns exit non-zero. Pass the prompt with -p or pipe it through stdin, for example echo "..." | haze. Print mode does not save sessions and ignores --continue. You can use --resume <id> to load context without changing the original session. |
haze --output <text|json|stream-json> |
Choose the print-mode output. json writes one { type, status, result, usage } envelope for scripts and CI. stream-json writes live NDJSON events, followed by the same result envelope. The final status determines the exit code. |
haze -m, --model <selector> |
Override the model for this run without changing settings. Use the name or provider:name of a model already added through /provider. An unknown or ambiguous selector exits non-zero with a precise error. |
haze -c, --continue |
Resume the latest saved session for this workspace (interactive only). |
haze --resume <id> |
Resume an exact workspace session. Combine with -p to load its context for one non-durable turn. Unknown ids exit non-zero. |
haze --no-session |
Run without saving or resuming a durable session. |
haze --debug |
Show model/tool debug logs and write a detailed JSONL log to ~/.haze/logs/ (works in both interactive and print mode). |
NOTE / The model can load a skill when your request matches it. You can also load one directly with /<skill-name>.