In English: wend is an interactive disk usage analyzer for the terminal — a directory tree with shares and sizes next to a sunburst or treemap chart, drawn with character cells. It ships as a single static binary with no dependencies. Full documentation: README.en.md. Note that the application interface itself is currently in Russian only.
Интерактивный анализатор занятого места на диске для терминала.
Сканирует директорию в фоне и сразу показывает дерево с долями и размерами, а справа рисует то же самое кольцевой диаграммой (sunburst) или treemap — без графической оболочки, прямо в терминале.
/home/user/projects · 19.3 GiB · 8k элементов
╭──────────────────────────────────────────────╮╭──────────────────────────────────────────────╮
│ доля объект размер││projects · 10 в этой папке · 8k всего · [спис…│
│█████ 100% ▾ projects 19.3 GiB││ 12.4 GiB 64% 4.2k node_modules/ │
│███▎╌ 64.3% ▸ node_modules 12.4 GiB││ 3.5 GiB 18% 1.4k .git/ │
│▉╌╌╌╌ 18.0% ▸ .git 3.5 GiB││ 1.7 GiB 9% 180 assets/ │
│▍╌╌╌╌ 8.7% ▸ assets 1.7 GiB││ 1.3 GiB 6% 320 build/ │
│▍╌╌╌╌ 6.5% ▸ build 1.3 GiB││ 337.7 MiB 2% 910 vendor/ │
│▏╌╌╌╌ 1.7% ▸ vendor 337.7 MiB││ 118.8 MiB 1% 640 src/ │
│╌╌╌╌╌ 0.6% ▸ src 118.8 MiB││ 24.1 MiB 0% 260 tests/ │
│╌╌╌╌╌ 0.1% ▸ tests 24.1 MiB││ 15.2 MiB 0% 74 docs/ │
│╌╌╌╌╌ 0.1% ▸ docs 15.2 MiB││ 1.8 MiB 0% — package-lock.json │
│╌╌╌╌╌ 0.0% package-lock.json 1.8 MiB││ 14.2 KiB 0% — README.md │
│╌╌╌╌╌ 0.0% README.md 14.2 KiB││ │
╰──────────────────────────────────────────────╯╰──────────────────────────────────────────────╯
/home/user/projects · 19.3 GiB · 8k элем. · inode 4718952 · ссылок 12 · 2026-07-26 …
8k файлов / 8 папок · j/k навигация h/l свернуть/развернуть v вид tab панель r перескан…
(превью без цвета; в реальном терминале диаграммы и полосы раскрашены)
- Инкрементальный скан. Дерево наполняется по мере обхода — не нужно ждать завершения, чтобы начать смотреть.
- Четыре режима отображения: список, горизонтальные полосы, кольцевая диаграмма и treemap. Диаграммы рисуются символами с цветным фоном и учитывают, что ячейка терминала вдвое выше своей ширины.
- Связанные панели. Ветка под курсором в таблице подсвечена на диаграмме, остальное приглушено.
- Настоящие данные ФС: доля от родителя, число вложенных элементов, время изменения, inode, число жёстких ссылок и реально занятое на диске место.
- Дедупликация жёстких ссылок по inode — файл, на который ведёт несколько ссылок, считается один раз.
- Адаптивная вёрстка. Колонки отключаются по мере сужения терминала, ничего не переносится и не разъезжается.
Бинарь статический и не тянет за собой ничего: ни libc, ни рантайма. Он
работает и в дистрибутиве на musl, и в контейнере FROM scratch. Достаточно
положить один файл в PATH.
curl -fsSL https://raw.githubusercontent.com/Tinddd28/wend/main/scripts/install.sh | shСкрипт определит ОС и архитектуру, скачает последний релиз, сверит
контрольную сумму и положит бинарь в /usr/local/bin (при необходимости
через sudo).
Полезные переменные:
PREFIX=$HOME/.local/bin sh install.sh # установить без sudo
VERSION=nightly sh install.sh # свежая сборка из main
VERSION=v1.0.0 sh install.sh # конкретная версия
sh install.sh --dry-run # посмотреть, что будет скачаноЕсли не хочется выполнять скачанный скрипт не глядя — а это разумно — скачайте его отдельно, прочитайте и запустите:
curl -fsSLO https://raw.githubusercontent.com/Tinddd28/wend/main/scripts/install.sh
less install.sh && sh install.shНа странице Releases рядом с
архивами лежат распакованные бинари — их можно скачать и запустить сразу,
без распаковки. Имя вида wend_<ос>_<архитектура>, версии в нём намеренно
нет: только так работает постоянная ссылка на «последний релиз».
curl -fsSLO https://github.com/Tinddd28/wend/releases/latest/download/wend_linux_amd64
chmod +x wend_linux_amd64
./wend_linux_amd64 ~/DownloadsАрхив втрое меньше и несёт с собой LICENSE и README:
tar -xzf wend_v1.0.0_linux_amd64.tar.gz
sha256sum -c SHA256SUMS --ignore-missing # SHA256SUMS лежит рядом с архивами
sudo install -m 0755 wend /usr/local/bin/wendПод Windows архивы в формате .zip, бинарь внутри — wend.exe.
nightly— свежая сборка каждого коммита вmain, по постоянным ссылкам видаhttps://github.com/Tinddd28/wend/releases/download/nightly/wend_linux_amd64. Тег переезжает на каждый коммит, это канал «последняя сборка», а не история версий.- Артефакты CI — на странице любого прогона Actions внизу лежат готовые бинари под все шесть платформ, в том числе для пул-реквестов. Хранятся 30 дней, доступны авторизованным пользователям GitHub.
go install github.com/Tinddd28/wend/cmd/wend@latestБинарь попадёт в $(go env GOPATH)/bin — убедитесь, что этот каталог есть
в PATH.
Требуется Go 1.26.5 или новее (версия зафиксирована в go.mod).
git clone https://github.com/Tinddd28/wend.git
cd wend
go build -o wend ./cmd/wendwend # текущая директория
wend ~/Downloads # конкретный путь
wend --version
wend --helpНедоступные из-за прав каталоги пропускаются, обход остального дерева не прерывается.
| Клавиши | Действие |
|---|---|
j / k, ↓ / ↑ |
вверх-вниз |
g / G, Home / End |
в начало / в конец |
Ctrl+f / Ctrl+b, PgDn / PgUp |
страница вниз / вверх |
l, →, Enter |
раскрыть директорию, шагнуть внутрь |
h, ← |
свернуть директорию, подняться к родителю |
Tab |
переключить панель |
v |
сменить режим главной панели |
r |
пересканировать заново |
q, Ctrl+c |
выход |
Переключаются по v по кругу:
- Список — размер, доля от объёма родителя, число вложенных элементов, имя.
- Полосы — то же плюс горизонтальная гистограмма, отмасштабированная по крупнейшему соседу.
- Кольца — sunburst: центр показывает суммарный объём, каждое следующее кольцо соответствует уровню вложенности, угол сегмента пропорционален размеру. До пяти колец; тон берётся из углового положения сегмента, поэтому вложенные элементы сохраняют цвет родителя.
- Treemap — squarified-раскладка: площадь плитки пропорциональна размеру, до трёх уровней вложенности с подписями.
Несколько мест, где wend намеренно расходится с наивным подсчётом:
- Доля считается от объёма родителя, а не всего дерева, — так она остаётся информативной на любой глубине.
- Жёсткие ссылки. Файл с
nlink > 1учитывается в суммах один раз, по первой встреченной ссылке. Повторы помечаются⇥, показываются с нулевым вкладом, а их общее число видно в статусбаре. Именно поэтому итог может быть меньше, чем сумма размеров всех файлов. - Размер на диске (
blocks × 512) показывается в строке деталей, когда расходится с логическим размером больше чем на 10% — это бывает у sparse-файлов и из-за округления до размера блока. На платформах безsyscall.Stat_t(Windows) inode, число ссылок и размер на диске недоступны, и дедупликация не выполняется. - Символические ссылки не раскрываются: обход по ним не идёт, поэтому цикл через симлинк не может увести скан в бесконечность.
go test ./... # тесты
go test -race ./... # с детектором гонок: дерево читается из UI
# и пишется из горутины сканера
go vet ./...
gofmt -l ./cmd ./internalСтруктура:
cmd/wend/ точка входа, разбор аргументов
internal/scan/ обход ФС и потокобезопасное дерево результатов
internal/humanize/ форматирование размеров, счётчиков и дат
internal/tui/ bubbletea-модель, layout, клавиши
├── sidebar/ таблица дерева
├── mainview/ главная панель и её режимы
├── statusbar/ детали выбранного объекта и подсказки
├── canvas/ растровый холст из символьных ячеек
├── chart/ кольцевая диаграмма и treemap
└── style/ палитра и обрезка строк по ширине
Три workflow, все на официальных экшенах и gh CLI, без сторонних зависимостей:
| Workflow | Когда | Что делает |
|---|---|---|
ci.yml |
push в main, пул-реквесты |
gofmt, go vet, go test -race, сборка под 6 платформ с выгрузкой артефактов |
nightly.yml |
push в main |
тесты и обновление предрелиза nightly — свежая сборка по постоянной ссылке |
release.yml |
тег v* |
проверки, тесты, архивы с SHA256SUMS, GitHub Release со списком изменений |
Выпустить релиз:
git tag -a v1.0.0 -m "v1.0.0"
git push origin v1.0.0Теги с дефисом (v1.0.0-rc1) помечаются предрелизными и не подменяют собой
«последнюю версию».
Те же артефакты собираются локально, без ожидания CI:
./scripts/build-release.sh v1.0.0 # результат в dist/Версия Go во всех workflow берётся из go.mod, чтобы CI не разъезжался с
проектом. Сборка всегда идёт с CGO_ENABLED=0 и -trimpath — отсюда
статический бинарь и воспроизводимость.