
Когда я писал первую статью на Хабр про openLight в марте, проект состоял из одного коммита, одной Raspberry Pi и одного Telegram-бота.
У меня был Pi с Tailscale, маленький Matrix-сервер и несколько сервисов, за которыми хотелось приглядывать. Я устал печатать ssh pi@raspberrypi.local && systemctl status ... с телефона, поэтому написал небольшой Go-бинарь: Telegram-бот, SQLite и локальный Ollama как fallback, если обычный роутер не понимал запрос.
Прошло два месяца. Бинарь всё ещё весит около 25 МБ. Всё ещё один YAML-конфиг. Всё ещё SQLite. Но под капотом почти всё переписано хотя бы один раз.
И главное, изменилось понимание того, чем вообще стал проект.
openLight - это легковесный операционный слой для личных серверов, а не очередной AI-ассистент общего назначения.
В марте я бы так не сформулировал. Чтобы прийти к этому, понадобилось несколько месяцев реального использования, переписываний и откатов назад.
Это ретроспектива о том:
что сработало
что оказалось ошибкой
и почему я всё больше верю в маленькие локальные системы вместо “автономных AI-агентов”
Пять моментов, ради которых всё это

Поздний вечер, я не дома. Synapse упал на VPS. Я нажимаю
Restartпрямо в Telegram. Сервис поднимается. Ноутбук даже не открывал.Очередь в магазине. Tailscale начал сыпать warning’ами. Нажимаю
Logs, вижу знакомую проблему с peer’ом, ставлюIgnoreна 15 минут.Перелёт. Watch-цикл продолжает работать сам. Когда я приземляюсь, в чате уже лежат сообщения
resolved— всё восстановилось без меня.Mac mini дома. На нём Ollama и несколько Docker-сервисов. Watch на CPU > 90% срабатывает из-за моего же фонового джоба, о котором я уже забыл.
Удалённая машина.
/restart matrixс телефона уходит в docker-compose на VPS. Для меня это выглядит так же, как локальная Raspberry Pi.
Вся архитектура ниже существует только потому, что такие сценарии реально происходят.
Что изменилось технически
Роутинг: от плоского к deterministic-first
Изначально роутер был очень простым:
попробовать slash-команду
попробовать regex
если ничего не подошло, то отправить запрос в Ollama
Этого хватает примерно на неделю.
Потом начинаешь замечать:
половина задержки - это запуск модели на Pi
модель иногда выбирает “почти правильный”, но не тот tool
а “не понимаю запрос” и “уверен на 51%, выполняю” - это две очень разные ситуации

Сейчас перед LLM есть несколько полностью детерминированных слоёв:
slash-команды
aliases
нормализация
rule-based parsing
semantic mapping
И только если всё это не сработало, подключается модель.

Скриншот выше, тот же самый skill /status, но без LLM-вызова: русская фраза детерминированно нормализовалась.

skills, watch list, notes против agent.test.yaml.CLI теперь работает через тот же runtime, что и Telegram-бот:
тот же registry
тот же router
тот же auth
те же skill’ы
Это позволило использовать его и для smoke-тестов, и для локальной отладки.
От localhost к SSH-нодам
Первая версия openLight умела работать только с той машиной, на которой была запущена.
Но быстро стало понятно, если у тебя есть VPS, Mac mini, Raspberry Pi и ещё пара коробок, то нужен единый интерфейс. Так появилась идея:
один openLight
много SSH-нод
Нода - это просто именованный SSH-target в конфиге.
Сервис может выглядеть так:
node:vps:compose:/opt/matrix/docker-compose.yml:synapse
Для пользователя это всё ещё просто:
/restart matrix

Но внутри это может быть:
systemd
docker
docker compose
локально
удалённо через SSH
Самое важное, пользователь этого не видит. Есть:
один skill
один allowlist
один audit path
Именно так и должно быть.
От request-response к monitoring loop
Самое большое изменение - система watch’ей. v0.0.1 был полностью реактивным: я что-то спрашивал, агент отвечал. v0.1.0 добавил monitoring loop:
правила
polling
incidents
cooldown’ы
и Telegram-алерты с кнопками
Restart, Logs, Status, Ignore.
Но самая важная часть не в polling’е. А в том, что кнопки используют тот же самый skill path, что и ручные команды. Когда я нажимаю Restart в alert’е, вызывается тот же service_restart, что и при обычной команде.
тот же allowlist
тот же audit
тот же logging path
Нет отдельного “режима автоматизации”.

Наверное, это решение нравится мне больше всего. И оно почти противоположно тому, куда движется большая часть AI-agent tooling. Сейчас популярная идея:
дать модели shell
дать sandbox
дать autonomy
и надеяться на лучшее
Но для инфраструктуры это выглядит опасно. Инфраструктуре нужен не “автономный агент”. Ей нужен понятный, проверяемый execution path. Автоматизация - это кнопка поверх уже существующего безопасного механизма, а не отдельный уровень привилегий.
Что изменилось стратегически
Skill’ы — единственная настоящая граница безопасности
В ранних версиях у меня был mutating_execute_threshold - порог уверенности для действий, которые меняют состояние. Потом я понял, что это неправильная модель. Правильная модель гораздо проще:
LLM может выбирать только из уже существующих skill’ов, а сами skill’ы обеспечивают безопасность на уровне Go-кода.
Либо функция существует и проходит allowlist-проверки. Либо нет. Модель - это классификатор намерения, а не носитель привилегий.
Core vs Optional
В какой-то момент я заметил странную вещь. Каждый раз, когда я добавлял:
vision,
browser,
voice,
OCR,
мне хотелось включить это по умолчанию. Потому что демо выглядит круто. А потом через пару недель я дебажил:
память,
Playwright,
лишние зависимости,
latency,
и весь тот “AI assistant creep”, которого изначально хотел избежать.
Поэтому сейчас в проекте есть чёткое разделение:
core modules,
optional modules.
Если убрать optional-модули, то openLight всё ещё останется openLight. Если убрать core, то проект потеряет идентичность.

Один и тот же реестр виден LLM-классификатору и в ответе на пользовательский /skills. Никакой параллельной поверхности нет.
От Raspberry Pi к personal infrastructure
Где-то на третьем или четвёртом крупном рефакторе я понял, что openLight уже не про Raspberry Pi. Pi был просто самой маленькой машиной, которая оказалась под рукой. На самом деле меня начала интересовать другая категория:
маленькие always-on компьютеры
локальные серверы
Mac mini
старые ThinkPad
NUC
Raspberry Pi
домашние ARM-машины
Все они живут в странном промежутке:
это уже не ноутбук
но ещё и не “облако”
Для них плохо подходит mainstream tooling. Kubernetes здесь почти всегда избыточен. Datadog - тоже. Большие AI-agent frameworks - тем более. Этим машинам нужен:
маленький
понятный
дешёвый
repairable слой управления
Mac mini особенно сильно изменил моё восприятие проекта. M1 спокойно тянет:
Ollama
несколько Docker-сервисов
monitoring
Telegram-agent
и при этом потребляет смешное количество энергии
В какой-то момент openLight перестал быть “ботом для Raspberry Pi”. Он стал агентом для personal infrastructure, который просто использует Telegram как интерфейс. И мне кажется, что в ближайшие годы вокруг этой категории появится очень много интересного софта.
Что оказалось ошибкой
Фрейминг “альтернатива OpenClaw”
В первых README я слишком сильно определял проект через: “мы не такие как X” Это плохая идея. Во-первых, если человек не знает OpenClaw, ему всё равно. Во-вторых, решения начинают приниматься “от противного”: “они делают так, значит мы должны наоборот”. Это не архитектурный принцип.
“Structured tool calling” в раннем roadmap
Тогда мне казалось, что проблема решается более сложным tool-calling. Сейчас я думаю наоборот: проблема решается более сильным deterministic routing. Большая часть запросов вообще не должна доходить до LLM.
Полный registry в prompt
Ранний classifier видел:
все skill’ы
все описания
весь registry
Это:
раздувало prompt
замедляло routing
и ухудшало качество
Двухстадийная классификация решила проблему:
сначала только группы
потом только skill’ы внутри группы
LLM input budget - это тоже архитектурное ограничение.
Что подтвердилось практикой
Telegram - отличный интерфейс для homelab
Я пробовал:
Slack
web UI
dashboard’ы
Но всё проигрывало сценарию:
“я не дома, сервис упал, достал телефон, нажал Restart”.
SQLite хватает
Watch’и
Incidents
History
Settings
Skill calls
Всё живёт в одном SQLite-файле. Backup - это literally cp. И мне это нравится.
Один Go-бинарь — правильная форма
Без:
Redis,
Postgres,
service mesh,
Helm,
runtime dependency zoo.
scp + systemd/launchd - и всё работает.
Локальные LLM уже достаточно хороши
Qwen 0.5B на Raspberry Pi хватает для routing/classification. Мне не нужен GPT-4, чтобы понять:
“что там сломалось?”
Модель здесь не “думает”. Она помогает выбрать intent. И маленькие модели surprisingly хороши в этом.
Почему мне кажется, что это направление важно
Сейчас вся AI-индустрия движется в сторону:
огромных cloud-agent systems
autonomous workflows
giant tool ecosystems
generalized assistants
Но чем дольше я работаю над openLight, тем сильнее мне кажется:
самая полезная AI-инфраструктура ближайших лет будет не гигантской, а маленькой.
Не cloud-first. А local-first.
Не “autonomous”. А deterministic by default.
Не opaque. А observable.
Не “умной”. А repairable.
openLight - это очень маленький проект. Но для меня он стал способом исследовать именно эту идею. Он не пытается заменить инженера. Он пытается уменьшить трение между инженером и теми маленькими системами, которыми этот инженер уже управляет.
Код лежит на github.com/evgenii-engineer/openLight.
Если у тебя дома есть:
Raspberry Pi
Mac mini
VPS
homelab
или просто несколько always-on машин
возможно, openLight тебе пригодится.
Комментарии (16)

Elaugaste
09.05.2026 01:38Понять бы только, почему все это не завернуть на хелсчеки и не рестартить юнитом. Вместо того чтобы быть обслуживающим персоналом для своей железки. Бонусом отпадает потребность в llm

SabMakc
09.05.2026 01:38А что за прикол с английскими словами в тексте? Это не какие-то термины, не названия, а просто отдельные слова и понятия на английском.
Это модель, подготовившая статью, плохо знает русский? Или специально сделано?

obbana
09.05.2026 01:38ИИ контент (пускай так вот обработанный) уже… надоел)) Мне вот тоже непонятно, имея Docker/Systemd почему вообще что-то нужно постоянно перезагружать? Я ничего у себя нигде не перезагружаю и все работает. Иногда текстом состояние в телеграм - это наверно удобнее чем Grafana, когда не у компа или в поездке, но в остальном непонятно зачем это всё

for7raid
09.05.2026 01:38Согласен. Начал читать статью и не понял прикладного смысла этой системы. Почему докер упал и его нужно перезагрузить вручную? Почему посыпались ошибки чего-то там, но автор просто их поставил в игнор? Может не такие уж и важные эти уведомления и нет смысла в магазине на них отвлекаться. Кажется, здесь вместо того, чтобы настроить нормально сервера и системы, автор делает автоматизацию (ради автоматизации).

sergeifedorenkon
09.05.2026 01:38Статья не про падение докера, падение докера это всего ли артефакт жизни

PsihXMak
09.05.2026 01:38По стилю похоже на одну из последних ChatGPT. Он тоже в строгом режиме пишет сухую инфу, опуская контекст. Ну и списки. Бооольше списков!

Barnaby
09.05.2026 01:38ChatGPT русский хорошо знает, это такой-то китаец, спасибо что без иероглифов :)
опуская контекст
Просто ии тоже не понял зачем все это нужно :)

SilverHorse
09.05.2026 01:38ИИ пишет статью о том, как ИИ придумал то, как использовать ИИ там, где ИИ не нужен...
Когда уже хабр введет плашку, как в стиме, "этот бред сгенерирован ИИ, потому что у автора не хватило ума написать что-то оригинальное, да и писать было не о чем, потому что сам автор ничего толком не сделал"?

Antra
09.05.2026 01:38> Telegram: "что там с системой" → Hostname, CPU, Memory, Disk, Uptime, Temperature, всё в одном коротком ответе.
Скриншот выше, тот же самый skill
/status, но без LLM-вызова: русская фраза детерминированно нормализовалась.Можно пояснить, как именно безо всяких LLM чисто детерминировано из "что там с системой" система поняла, что от нее требуется?
Это же не "заученная фраза"? на "система в норме?" или "состояние системы?" такой же ответ был бы безо всяких LLM? Но и не просто по вхождению "систем", разумеется.

martelle
09.05.2026 01:38Никогда не стал бы ставить криптокошельки на смартфон. Потому что доверия телефону - околоноль
Никогда не стал бы заходить на свои серверы со смартфона, по той же причине.
-
Автор - васян локалхоста (убунтуй ещё небось). И то что у него что-то постоянно валится и требует перезагрузки - 100%ный пруф.
лучше б админские скиллы покачал, а не слоп генерил

WhiteBehemoth
по-моему нет какого-то монолитного движения. Есть облачные агенты для трудоёмких задач. Для агентов уровня "подай-принеси", в противовес, создаются инструменты для разработки своих решений.
Вот, к примеру, свежая статья про свежий, относительно лёгкий, агентский фреймфорк https://devblogs.microsoft.com/dotnet/durable-workflows-in-microsoft-agent-framework/ (я на этом https://github.com/microsoft/agent-framework делал своего "ассистента" для pRI 3b с той же sqlite и телеграммом для интерфейса - работает шустро и стабильно).