Featured image of post Как я навайбкодил CommRelay и перестал бояться desktop-приложений

Как я навайбкодил CommRelay и перестал бояться desktop-приложений

История о том, как нестабильный чат для стримов превратился в собственное desktop-приложение на Go и Wails.

Недавно я выпустил CommRelay - локальное приложение для стримеров, которое собирает чат из Twitch, YouTube Live и VK Live в один overlay для OBS. На игровом блоге уже есть релизный пост , а здесь хочу скорее зафиксировать инженерную часть истории: как я в очередной раз подумал “а почему бы не навайбкодить свое?” - и внезапно получил рабочее desktop-приложение.

Началось всё довольно прозаично. Я стримлю сразу на несколько площадок, и для такого режима нужен нормальный общий чат. Существующее приложение, которым я пользовался, в какой-то момент стало раздражать нестабильностью: то сообщения приходят с задержкой, то что-то отваливается, то перед эфиром приходится заниматься не стримом, а шаманством вокруг чата.

В какой-то момент я понял, что хочу контролировать этот кусок сам. У меня большой опыт backend-разработки на Go, а задача по сути выглядела знакомо: взять несколько источников сообщений, привести их к общей модели, раздать через WebSocket и показать в браузере. Не космический корабль, а понятный локальный сервис.

Первой версией CommRelay была обычная CLI-тулза. Запускается локальный HTTP-сервер, у него есть админка и отдельная страница overlay для OBS:

1
2
http://127.0.0.1:17877/
http://127.0.0.1:17877/overlay

Для меня как для разработчика это нормальная модель. Запустил бинарник, открыл адрес, добавил Browser Source в OBS - всё понятно. Но для обычного пользователя это уже лишний слой сложности. Хочется, чтобы было как с нормальным приложением: скачал, распаковал, кликнул, окно открылось, всё работает.

И тут я подумал про desktop.

До этого у меня уже был опыт вайбкодинга desktop-приложения на Rust для распознавания голосовых команд. Опыт был полезный, но местами болезненный. Rust мне менее знаком, а с GUI постоянно всплывали какие-то мелочи: то внешний вид, то поведение компонентов, то странные проблемы в деталях интерфейса. У меня сложилось ощущение, что кодинговые агенты сейчас гораздо увереннее работают с web-интерфейсами, чем с классическим desktop GUI.

А Go мне роднее. Плюс CommRelay всё равно по природе серверное приложение: коннекторы, reconnect, OAuth для YouTube, локальный config, WebSocket, раздача статических файлов. Поэтому мысль “оставить core на Go, а desktop сделать как тонкую оболочку вокруг web UI” выглядела очень естественно.

Примерно в это же время мне попалась статья про Wails. И внезапно оказалось, что это почти идеально ложится на задачу. Wails даёт desktop-окно, lifecycle приложения, сборку под разные платформы и возможность использовать привычный веб-фронтенд внутри. В CommRelay desktop-версия просто поднимает локальный сервер в фоне и открывает админку в окне приложения. Overlay при этом остаётся обычным URL для OBS, что отлично совпадает с моделью Browser Source.

Технически это оказалось приятно простым. Основная логика не переехала в какой-то новый мир: Go-код остался Go-кодом, HTTP-сервер остался HTTP-сервером, overlay остался веб-страницей. Wails добавил удобную упаковку, а не заставил переписывать архитектуру.

В первом релизе я даже не стал усложнять фронтенд: админка и overlay сделаны на обычных HTML/CSS/JS. Но после этого опыта мне стало гораздо спокойнее смотреть и на связку React + Go + Wails. Если нужен более сложный интерфейс, можно взять React и всё равно держать backend-часть на знакомом Go. Получается очень понятное разделение: Go отвечает за надежность, интеграции и локальный сервер, frontend - за удобный интерфейс.

Самое приятное, что результат не остался игрушечным прототипом. CommRelay уже умеет собирать чат из Twitch, YouTube Live и VK Live / VK Video, показывает статусы подключений, поддерживает emotes, безопасные превью картинок, настройки overlay и автоматический reconnect. А главное - я сам уже провожу с ним стримы.

Итог для меня довольно важный: я перестал бояться desktop-приложений. Раньше они казались отдельной категорией боли, где нужно заново погружаться в чужой GUI-стек и постоянно бороться с деталями платформ. Теперь у меня появилась более спокойная модель: если приложение хорошо раскладывается на локальный backend и web-интерфейс, то Go + Wails закрывают огромную часть задач.

Само приложение лежит на GitHub: github.com/mechastrider/comm-relay . А если интересна пользовательская сторона проекта, то вот тот самый релизный пост в игровом блоге: Первый релиз CommRelay - локального мультичата для OBS .

Создано при помощи Hugo
Тема Stack, дизайн Jimmy