slothd: локальный ИИ-демон, который наводит порядок в файлах, пока вы отошли от клавиатуры

Три развилки решают, можно ли доверять фоновому агенту на диске: облако или полностью локальный inference, сначала план или сразу перенос файлов, табличная триаж перед тяжёлой моделью. slothd, open-source демон с приоритетом локального режима и работой без сети по умолчанию, закрывает контур для соло-разработчика: PDF и скриншоты без отправки приватных документов в облачный ИИ, Gemma 3 через локальный Ollama только там, где не хватает метаданных. В build-story Dhruv Jani (@dj29) показывает, почему «медленный» темп агента работает как фича, а не как баг.
Почему «терпеливый» демон, а не чат-агент в каждой папке
Заголовок build-story обещает демон, который терпеливо разбирает захламлённое рабочее пространство, а не интерактивный чат на каждый файл. Dhruv Jani привязывает релиз к Hacktoberfest Open-Source AI Challenge, неделя Week 3: Slow and Steady: фоновый ИИ не мешает во время работы.
Механика проверяемая: через нативные OS API демон смотрит на бездействие клавиатуры и мыши и включается после 5+ минут непрерывной неактивности. Пока вы отошли, он сканирует целевые зоны: рабочие каталоги, «свалки» на Desktop, project inboxes. Для vibe-workflow это другой контракт с агентом: не «сгенерируй имя сейчас», а «подчисти хаос, когда я не в IDE».
Мотивация приземлённая: накопившиеся PDF, установщики и скриншоты с нечитаемыми именами. Jani явно отказывается гонять приватные документы в облачный ИИ ради сортировки. Локальный open-source демон здесь граница доверия к данным на диске, а не маркетинговый лозунг.
Двухступенчатый контур: таблица, Gemma и офлайн по умолчанию
Чтобы не кормить vision/LLM каждым байтом, slothd строит воронку из двух стадий.
Стадия 1: семь сигналов файловой системы (логарифм размера, категория расширения, глубина пути, час и день модификации, длина имени, энтропия UUID и цифр в имени). По умолчанию работает детерминированный локальный движок TabPFN-Heuristic-Local, порядка менее 1 ms на батч в офлайн-режиме; при настроенных credentials и checkpoint можно переключиться на Prior Labs TabPFN (Jani указывает ~15–25 ms).
Стадия 2: только файлы, которым нужна семантика по содержимому, уходят в Gemma 3 локально через Ollama (в таблице треков gemma3:4b). PDF обрабатываются через PyMuPDF (рендер в память); ответ жёстко ограничен Pydantic JSON schema через параметр format в Ollama. Если Ollama недоступен, демон делает короткий health probe (0,2 s) и откатывается к классификации по расширению. В трейсе Sentry встречается Connection refused на 127.0.0.1:11434.
Паттерн знакомый тем, кто уже крутит локальный inference: сначала дешёвый фильтр, потом модель. Иначе соло-разработчик платит latency и VRAM за каждый мусорный .dmg в загрузках.
Ядро (idle detection, scan, triage, Gemma через локальный Ollama, SQLite WAL, rollback) по заявлению автора работает без интернет-вызовов по умолчанию. Партнёрские облачные интеграции (Tiger Data, SerpApi, ElevenLabs) включаются только через --enrich-online, с офлайн-fallback: локальный vector search, эвристики, terminal chimes.
Семантический поиск строится на эмбеддингах 768-dim моделью nomic-embed-text: основной бэкенд Tiger Data PostgreSQL + pgvector (опционально), локальный fallback SQLite vector. Как пример UX Jani приводит запрос вроде «Where is my AWS invoice from October?».
Репозиторий под лицензией MIT на GitHub: JaniDhruv/slothd. Запуск и CLI завязаны на uv run; точка входа для эксперимента: демо-набор test_workspace/messy_inbox:
uv run slothd scan test_workspace/messy_inbox
На этой фикстуре Jani приводит воспроизводимые цифры: 10 файлов, 2 clutter anomalies, 1 duplicate set (SHA-256), 973 B reclaimable, 0 cloud API calls, 1 ms metadata triage на локальном движке. Там же указано: uv run pytest -v даёт 118 passed; uv run ruff check . all checks passed (заявления автора, не независимый бенчмарк редакции).
В репозитории есть слой rules/prompts под GitHub Copilot: .github/copilot-instructions.md, кастомные промпты (/new-sorter, /audit-privacy, /verify-demo), CLI slothd copilot. Это опциональная надстройка; офлайн-ядро от неё не зависит, но показывает связку «агент + явные инструкции в репо» рядом с локальным inference.
Доверие к автоматизации: dry-run, WAL и откат
Файловая система не прощает сценарий «агент сам всё переложил». Команда slothd organize по умолчанию в режиме dry-run; реальный перенос только с флагом --go или после Approve в локальном dashboard (FastAPI + Vanilla ES6).
Каждое одобренное перемещение пишется в SQLite WAL с batch_id; откат через slothd undo. Коллизии имён решаются суффиксами _1, _2; сохраняются mtime и atime. В комментариях Dev.to Jani уточняет продуктовые edge cases: содержимое важнее имени файла, multi-label tags, низкий confidence → не переименовывать слепо.
Для схемы «человек подтверждает каждый шаг» это минимальный набор, без которого фоновый ИИ на диске быстро превращается в стресс, а не в помощника.
Ollama для кода: три проверки на своём диске
Если вы уже держите Ollama для кодинга, slothd редкий случай, когда тот же стек применяют к бытовому хаосу на диске, а не к репозиторию. Три развилки из лида стоят проверки на вашей машине: включён ли только локальный контур, устраивает ли dry-run перед --go, не гоняете ли Gemma по файлам, которые отсекла табличная стадия.
Build-story вышел 21 октября 2026; на Dev.to у него 46 публичных реакций и 11 комментариев, оценочное время чтения 14 минут. Требования к железу для gemma3:4b Jani в одном месте не сводит: перед боевым деплоем имеет смысл прогнать scan на копии каталога, а не на единственной рабочей папке.
Источники
- I Built slothd: A Local-First, Offline-Capable AI Daemon That Patiently Organizes Your Messy Workspace, Dhruv Jani (@dj29), Dev.to; дата доступа: 2026-10-22 (UTC).
- github.com/JaniDhruv/slothd, репозиторий проекта (MIT); упомянут в build-story, дата доступа: 2026-10-22 (UTC).