hax — минималистичный coding-агент для терминала, написанный на C
📂 Исходный код на GitHubМинималистичный терминальный coding-агент, написанный на C: один нативный бинарник, локальные модели как первоклассные граждане, честный Unix-инструмент без плагин-рантаймов и IDE-панелей.
Большинство coding-агентов сегодня — это Node-пакеты на сотни мегабайт, с плагин-рантаймами, MCP-маркетплейсами и IDE-панелями. Проект hax идёт ровно в противоположную сторону: это терминальный агент, написанный на чистом C, который компилируется в один нативный бинарник, стартует мгновенно и потребляет лишь несколько мегабайт памяти. Идея простая: если агент экономный, у локальной модели остаётся больше оперативной памяти для контекста и весов.
Проект развивается активно — около 800 звёзд на GitHub, лицензия MIT, есть собственный сайт usehax.dev. В этой статье разберём, что внутри, кому он нужен и как его запустить.
Ключевые особенности
Лёгкость по дизайну. Один нативный бинарник на C с небольшим набором зависимостей. Никакого рантайма, никакого интерпретатора — отсюда мгновенный старт и минимальное потребление памяти. Автор прямо позиционирует это как преимущество для работы с локальными моделями: каждый мегабайт, сэкономленный агентом, достаётся модели.
Локальные модели как первоклассные граждане. Достаточно запустить llama-server -m [model].gguf, а затем hax --provider llama.cpp — hax сам обнаружит модель и возможности рантайма. Отдельный конфиг для провайдера не нужен. Ollama поддерживается аналогично: работает ollama serve — работает и hax.
Уважение к терминалу. Агент стримит Markdown и вывод инструментов в реальном времени, переразбивая строки под ширину окна. Перерисовывается только текущая стриминговая строка или область ввода — нативный scrollback терминала сохраняется. hax не захватывает терминал целиком и не ломает его поведение, что редкость для TUI-приложений.
Прозрачность. Встроенный просмотр транскрипта (Ctrl+T) показывает ровно то, что было отправлено модели и что она ответила. Опционально можно включить детальный трейс wire-протокола — полезно, если вы хотите понять, что именно агент шлёт в API.
Широкая поддержка провайдеров. OpenAI (и совместимые), Anthropic (и совместимые), Codex (через подписку ChatGPT), OpenRouter, OpenCode Zen/Go, llama.cpp, Ollama и произвольные кастомные эндпоинты.
Приличный Unix-инструмент. Пути по XDG-спецификации, чистый stdout в одношотовом режиме -p с подсказками для resume в stderr, читаемые текстовые конфиги и файлы сессий, композиция через подпроцессы вместо системы плагинов.
Философия: чего в hax сознательно нет
Это, пожалуй, самая интересная часть проекта. В hax намеренно отсутствуют:
- MCP-маркетплейсы;
- рантайм плагинов;
- IDE-панели;
- пермишен-промпты на каждую команду.
Автор не скрывает: если вам нужен именно такой набор функций — есть куча других агентов, которые его дают. hax вместо этого закрывает эти потребности проверенными Unix-паттернами: композиция через подпроцессы, текстовые файлы, стандартные потоки. Каждое «упущение» подробно обосновано в документе docs/philosophy.md в репозитории — редкий случай, когда проект честно объясняет, почему он чего-то не умеет.
Целевая аудитория сформулирована там же: разработчики, которые живут в терминале, гоняют локальные модели, аудитируют поведение своих инструментов, собирают пакеты для дистрибутивов или запускают агентов там, где ресурсов мало.
Установка
hax работает на Linux, macOS, FreeBSD и OpenBSD; на Windows — через WSL. BSD-системы собираются только из исходников.
Homebrew (macOS или Linux):
brew install oleksandrchekhovskyi/hax/hax
Arch Linux — пакет hax есть в AUR.
Любой другой дистрибутив — скачайте прекомпилированный статический бинарник (x86_64 или aarch64) со страницы релизов и распакуйте hax в любой каталог из PATH.
Сборка из исходников — даёт бинарник, слинкованный с системными shared-библиотеками вместо статического:
git clone https://github.com/OleksandrChekhovskyi/hax.git
cd hax
scripts/install_deps.sh # Debian/Ubuntu, Fedora, Arch, openSUSE, Alpine, macOS, FreeBSD, OpenBSD
make # binary lands at ./build/hax
make install # optional; may prompt for sudo
Скрипт install_deps.sh ставит зависимости: компилятор C, libcurl, jansson, meson, ninja, pkg-config, а также fzf — его hax использует для автодополнения @file, если он доступен. Для разработки удобно make symlink — свежесобранный бинарник линкуется в ~/.local/bin и остаётся на PATH между пересборками. Для линтера дополнительно нужны clang-format и clang-tidy (scripts/install_deps.sh lint).
В примерах ниже предполагается, что hax на PATH; после обычной сборки используйте ./build/hax.
Подключение провайдера
Самый простой первый запуск — интерактивный: стартуйте hax и выполните /provider, чтобы увидеть доступных провайдеров и выбрать модель. Интерактивные выборы провайдера, модели и уровня effort запоминаются.
| Провайдер | Настройка |
|---|---|
codex |
/login внутри hax |
openai |
переменная OPENAI_API_KEY |
anthropic |
переменная ANTHROPIC_API_KEY |
openrouter |
переменная OPENROUTER_API_KEY |
opencode-zen / opencode-go |
переменная OPENCODE_API_KEY |
llama.cpp |
запущенный llama-server |
ollama |
запущенный ollama serve |
| совместимый или кастомный эндпоинт | см. docs/providers.md |
Быстрый старт
Запускайте hax из каталога проекта, в котором он должен работать:
hax # interactive REPL
hax -p "list TODOs" # run one prompt, print the final answer
printf "explain x" | hax -p # read the prompt from stdin
hax -c # continue the latest session for this directory
hax --resume # pick a past session for this directory
hax --resume=ID -p "next" # resume a specific session in one-shot mode
hax --help покажет использование CLI, а /help в REPL — слэш-команды и горячие клавиши. Более подробная документация по использованию — в docs/usage.md.
Обратите внимание на то, как устроены сессии: hax -c продолжает последнюю сессию именно для текущего каталога, а --resume позволяет выбрать из прошлых. В одношотовом режиме -p stdout остаётся чистым — только финальный ответ, а служебные подсказки идут в stderr. Это делает hax удобным для пайпов: агент можно встроить в скрипт или вызвать из другого инструмента, получив предсказуемый вывод.
Конфигурация и сессии
Конфигурация опциональна. Логика разрешения настроек прозрачная: интерактивные выборы запоминаются отдельно от конфиг-файла, флаги CLI действуют только на текущий запуск, переменные окружения удобны для шелла и скриптов. Возобновлённые разговоры восстанавливают свои провайдер, модель, effort и пресет — если только флаг CLI не переопределяет выбор.
Формат файла конфигурации, порядок разрешения, пресеты и полный справочник настроек описаны в docs/configuration.md. Формат файлов сессий и поток hax --json — в docs/sessions.md: сессии лежат в человекочитаемом текстовом формате, что снова работает на прозрачность и совместимость с Unix-инструментами.
Отладка и вклад в проект
Для тех, кто хочет копнуть глубже, в docs/debugging.md описаны трейсы и логи транскрипта, mock-провайдер и демо-скрипты — можно разрабатывать и тестировать hax вообще без доступа к реальным LLM API.
Проект принимает контрибуции: правила подготовки и отправки изменений описаны в CONTRIBUTING.md. Для C-проекта настроен приличный инструментарий качества: .clang-format и .clang-tidy в репозитории, цель make lint, плюс тесты в каталоге tests и сборка через Makefile и meson.
Почему это интересно
hax — это ответ на вопрос: каким был бы coding-агент, если бы его писали в традициях Unix, а не в традициях npm. Небольшой бинарник на C, который стартует за миллисекунды, честно показывает, что отправляет модели, работает с локальной llama-server-инсталляцией «из коробки» и не пытается захватить ваш терминал — это одновременно и рабочий инструмент, и образец инженерной культуры. Если вы разработчик с локальной моделью на ноутбуке, мейнтейнер пакета в дистрибутиве или просто любите минимализм — hax заслуживает внимания. А если вам нужны маркетплейсы и плагины, автор честно скажет: возьмите другой агент.