<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Go on Игорь Лазарев</title>
        <link>https://igorlazarev.ru/tags/go/</link>
        <description>Recent content in Go on Игорь Лазарев</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ru</language>
        <copyright>Игорь Лазарев</copyright>
        <lastBuildDate>Sun, 21 Jun 2026 15:36:56 +0300</lastBuildDate><atom:link href="https://igorlazarev.ru/tags/go/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Как я навайбкодил CommRelay и перестал бояться desktop-приложений</title>
        <link>https://igorlazarev.ru/p/comm-relay-wails-experience/</link>
        <pubDate>Sun, 21 Jun 2026 15:36:56 +0300</pubDate>
        
        <guid>https://igorlazarev.ru/p/comm-relay-wails-experience/</guid>
        <description>&lt;img src="https://igorlazarev.ru/p/comm-relay-wails-experience/poster.webp" alt="Featured image of post Как я навайбкодил CommRelay и перестал бояться desktop-приложений" /&gt;&lt;p&gt;Недавно я выпустил &lt;strong&gt;CommRelay&lt;/strong&gt; - локальное приложение для стримеров, которое собирает чат из Twitch, YouTube Live и VK Live в один overlay для OBS. На игровом блоге уже есть &lt;a class=&#34;link&#34; href=&#34;https://mechastrider.ru/p/comm-relay-release/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;релизный пост&lt;/a&gt;
, а здесь хочу скорее зафиксировать инженерную часть истории: как я в очередной раз подумал &amp;ldquo;а почему бы не навайбкодить свое?&amp;rdquo; - и внезапно получил рабочее desktop-приложение.&lt;/p&gt;
&lt;p&gt;Началось всё довольно прозаично. Я стримлю сразу на несколько площадок, и для такого режима нужен нормальный общий чат. Существующее приложение, которым я пользовался, в какой-то момент стало раздражать нестабильностью: то сообщения приходят с задержкой, то что-то отваливается, то перед эфиром приходится заниматься не стримом, а шаманством вокруг чата.&lt;/p&gt;
&lt;p&gt;В какой-то момент я понял, что хочу контролировать этот кусок сам. У меня большой опыт backend-разработки на Go, а задача по сути выглядела знакомо: взять несколько источников сообщений, привести их к общей модели, раздать через WebSocket и показать в браузере. Не космический корабль, а понятный локальный сервис.&lt;/p&gt;
&lt;p&gt;Первой версией CommRelay была обычная CLI-тулза. Запускается локальный HTTP-сервер, у него есть админка и отдельная страница overlay для OBS:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://127.0.0.1:17877/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://127.0.0.1:17877/overlay
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Для меня как для разработчика это нормальная модель. Запустил бинарник, открыл адрес, добавил Browser Source в OBS - всё понятно. Но для обычного пользователя это уже лишний слой сложности. Хочется, чтобы было как с нормальным приложением: скачал, распаковал, кликнул, окно открылось, всё работает.&lt;/p&gt;
&lt;p&gt;И тут я подумал про desktop.&lt;/p&gt;
&lt;p&gt;До этого у меня уже был опыт вайбкодинга desktop-приложения на Rust для распознавания голосовых команд. Опыт был полезный, но местами болезненный. Rust мне менее знаком, а с GUI постоянно всплывали какие-то мелочи: то внешний вид, то поведение компонентов, то странные проблемы в деталях интерфейса. У меня сложилось ощущение, что кодинговые агенты сейчас гораздо увереннее работают с web-интерфейсами, чем с классическим desktop GUI.&lt;/p&gt;
&lt;p&gt;А Go мне роднее. Плюс CommRelay всё равно по природе серверное приложение: коннекторы, reconnect, OAuth для YouTube, локальный config, WebSocket, раздача статических файлов. Поэтому мысль &amp;ldquo;оставить core на Go, а desktop сделать как тонкую оболочку вокруг web UI&amp;rdquo; выглядела очень естественно.&lt;/p&gt;
&lt;p&gt;Примерно в это же время мне попалась статья про &lt;strong&gt;Wails&lt;/strong&gt;. И внезапно оказалось, что это почти идеально ложится на задачу. Wails даёт desktop-окно, lifecycle приложения, сборку под разные платформы и возможность использовать привычный веб-фронтенд внутри. В CommRelay desktop-версия просто поднимает локальный сервер в фоне и открывает админку в окне приложения. Overlay при этом остаётся обычным URL для OBS, что отлично совпадает с моделью Browser Source.&lt;/p&gt;
&lt;p&gt;Технически это оказалось приятно простым. Основная логика не переехала в какой-то новый мир: Go-код остался Go-кодом, HTTP-сервер остался HTTP-сервером, overlay остался веб-страницей. Wails добавил удобную упаковку, а не заставил переписывать архитектуру.&lt;/p&gt;
&lt;p&gt;В первом релизе я даже не стал усложнять фронтенд: админка и overlay сделаны на обычных HTML/CSS/JS. Но после этого опыта мне стало гораздо спокойнее смотреть и на связку &lt;strong&gt;React + Go + Wails&lt;/strong&gt;. Если нужен более сложный интерфейс, можно взять React и всё равно держать backend-часть на знакомом Go. Получается очень понятное разделение: Go отвечает за надежность, интеграции и локальный сервер, frontend - за удобный интерфейс.&lt;/p&gt;
&lt;p&gt;Самое приятное, что результат не остался игрушечным прототипом. CommRelay уже умеет собирать чат из Twitch, YouTube Live и VK Live / VK Video, показывает статусы подключений, поддерживает emotes, безопасные превью картинок, настройки overlay и автоматический reconnect. А главное - я сам уже провожу с ним стримы.&lt;/p&gt;
&lt;p&gt;Итог для меня довольно важный: я перестал бояться desktop-приложений. Раньше они казались отдельной категорией боли, где нужно заново погружаться в чужой GUI-стек и постоянно бороться с деталями платформ. Теперь у меня появилась более спокойная модель: если приложение хорошо раскладывается на локальный backend и web-интерфейс, то Go + Wails закрывают огромную часть задач.&lt;/p&gt;
&lt;p&gt;Само приложение лежит на GitHub: &lt;a class=&#34;link&#34; href=&#34;https://github.com/mechastrider/comm-relay&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github.com/mechastrider/comm-relay&lt;/a&gt;
. А если интересна пользовательская сторона проекта, то вот тот самый релизный пост в игровом блоге: &lt;a class=&#34;link&#34; href=&#34;https://mechastrider.ru/p/comm-relay-release/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Первый релиз CommRelay - локального мультичата для OBS&lt;/a&gt;
.&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
