Блог Laraue Software — C# .NET open source разработка

Реальный код, реальные решения, реальные компромиссы. Пишем о том, что строим — .NET библиотеки, Telegram-боты, интеграции с ИИ и архитектурные ошибки, на которых можно учиться.

Telegram Login Widget vs авторизация через Mini App в .NET — две схемы валидации, один JWT
Часть 13 цикла о разработке Telegram-таск-трекера в одиночку. Пользователи просили добавить веб-версию вне Telegram Mini App, но для этого нужно было реализовать отдельную авторизацию. Добавление Telegram Login Widget не потребовало больших доработок - виджет работает через тот же JWT, что и Mini App, а само приложение почти не зависит от Telegram после выполнения авторизации.
Read →
Объединение группы изображений в одну запись ботом в Telegram — обрабатываем медиагруппы и правки без использования таймеров
Часть 12 цикла о разработке Telegram-таск-трекера в одиночку. Telegram присылает альбом изображений отдельными сообщений, а правки — новыми апдейтами. Разбираем, как собрать медиагруппу в одну запись без привычного таймера-аккумулятора и как трактовать правку как обновление, а не дубль.
Read →
Сохраняем медиа из Telegram-бота — храним превью, стримим оригинал
Часть 11 цикла о разработке Telegram-таск-трекера в одиночку. Учим бота работать с фото и видео, разбираем решение с хранением файлов - маленькие превью в локальном хранилище и прямой стриминг больших файлов прямиком из Telegram, без буферизации в памяти.
Read →
Когда не стоит делать внешний ключ nullable — моделирование пустого состояния отдельной строкой
Часть 9 цикла о разработке Telegram-таск-трекера в одиночку. Слой issue в веб-приложении и решение по проектированию БД в его центре — когда nullable внешний ключ это неверный выбор, а отдельная строка-«по умолчанию» лучше, на примере issue, эпиков и бэклога.
Read →
Аутентификация Telegram Mini App в .NET от и до — валидация initData, выпуск JWT и фронтенд на Nuxt
Часть 8 цикла о разработке Telegram-таск-трекера в одиночку. Полный флоу аутентификации Telegram Mini App в реальном приложении на .NET и Nuxt — валидация подписи initData на сервере через HMAC-SHA256, выпуск и использование JWT-bearer, чтение пользователя из HttpContext и почему важен CORS.
Read →
Деплой .NET-приложения и PostgreSQL на дешёвый VPS через Docker Compose
Часть 6 цикла о разработке Telegram-таск-трекера в одиночку. Деплой на дешевый VPS через Docker Compose — self-hosted PostgreSQL, настроенный под 1 ГБ RAM, GitHub CI-пайплайн, работающий на push в main и описание докерфайлов.
Read →
Чистая архитектура Telegram-бота на .NET — контроллеры вместо гигантского switch
Часть 5 цикла о разработке Telegram-таск-трекера в одиночку. Чистый Telegram-бот на .NET с контроллерами и middleware в стиле ASP.NET вместо гигантского switch, слоёная структура решения и связка EF Core и linq2db на одних моделях для запросов, с которыми EF Core справляется плохо.
Read →
Выбор стека пет-проекта для соло-разработки — .NET, PostgreSQL, Nuxt и почему мы предпочитаем скучные технологии
Часть 4 цикла о разработке Telegram-таск-трекера в одиночку. Причины выбора .NET 10, PostgreSQL 18, Nuxt 4 и Vue 3. Немного о переезде с MongoDB на Postgres в прошлом проекте, который научил нас отдавать предпочтение скучным стабильным технологиям.
Read →
От «Сохраненных сообщений» в Telegram к настоящему таск-трекеру — определяем путь пользователя
Часть 3 цикла о разработке Telegram-таск-трекера в одиночку. Почему «Сохраненные сообщения» неудобны для ведения дел, с какого минимального сценария начинались Laraue Boards и почему путь пользователя определяется до начала разработки.
Read →
Прототипируем интерфейс с ИИ до написания кода
Часть 2 цикла о разработке Telegram-таск-трекера в одиночку. Почему мы начинаем с интерфейса, как HTML-прототипы от ИИ заменили Figma и каким получился первый прототип Laraue Boards.
Read →
Jira-альтернатива в одиночку — зачем мы её делаем и ссылки на репозитории
Часть 1 цикла о разработке Telegram-таск-трекера в одиночку с ИИ. Какую проблему мы решаем, зачем нужен ещё один таск-трекер, на каких двух репозиториях построен цикл статей.
Read →