Блог Laraue — .NET, Nuxt, Telegram-боты и работа с ИИ

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

DeepSeek API в .NET — OpenAI-совместимый клиент без SDK, Ollama для разработки и ИИ, который приводит заметки в порядок
Часть 26 цикла о разработке Telegram-таск-трекера небольшой командой. Как в Boards появился ИИ, который превращает поток мыслей из чата в аккуратную задачу: DeepSeek в продакшене, Ollama для локальной разработки, свой OpenAI-совместимый клиент на HttpClient и команда /aisave в Telegram.
Читать →
Telegram-бот для групповых чатов на .NET — привязка чата к доске и задачи из сообщений
Часть 25 цикла о разработке Telegram-таск-трекера небольшой командой. Как бот Boards научился работать в групповых чатах: привязка чата к доске командой /link, два режима сохранения сообщений, проверка администратора, privacy mode и переход группы в супергруппу.
Читать →
JWT в HttpOnly-cookie вместо localStorage — авторизация через cookie в ASP.NET Core и Nuxt
Часть 24 цикла о разработке Telegram-таск-трекера небольшой командой. Как токен веб-приложения переехал из localStorage в HttpOnly-cookie: как ASP.NET Core читает JWT из cookie, что для этого понадобилось фронтенду на Nuxt, как настроить CORS и как мы упростили локальный запуск проекта.
Читать →
Как мы переписали фронтенд — архитектура Nuxt с явными зависимостями, тесты на Vitest и правила для ИИ-агентов
Часть 23 цикла о разработке Telegram-таск-трекера небольшой командой. Почему интерфейс Boards пришлось переписать, как устроена новая архитектура фронтенда, в которой каждая страница явно объявляет свои зависимости, как это помогает тестам на Vitest и зачем в репозитории файл с правилами для ИИ-агентов.
Читать →
Комментарии к задачам — права, загрузка в фоне и пагинация API без COUNT
Часть 22 цикла о разработке Telegram-таск-трекера небольшой командой. Как устроены комментарии к задачам в Boards: кто может их читать, писать и редактировать, почему они загружаются отдельным запросом в фоне и как работает пагинация без запроса COUNT.
Читать →
Telegram как хранилище файлов для веб-приложения — загрузка через бота и общая модель вложений
Часть 21 цикла о разработке Telegram-таск-трекера небольшой командой. Как мы научили веб-приложение загружать картинки в задачи и хранить их в Telegram через бота и свели файлы из бота и из веба к одной модели вложений.
Читать →
История изменений задач — как мы сделали аудит-лог в таск-трекере
Часть 20 цикла о разработке Telegram-таск-трекера небольшой командой. Как в Boards появилась история изменений задач, почему мы пишем её явно в сервисах в той же транзакции, что и сами изменения, и почему не подошли интерсепторы EF Core, темпоральные таблицы и event sourcing.
Читать →
Кастомные поля задач — EAV против JSONB в PostgreSQL, отдельная таблица для каждого типа и фильтрация по значениям
Часть 19 цикла о разработке Telegram-таск-трекера небольшой командой. Как мы добавили к задачам атрибуты (кастомные поля), почему выбрали модель EAV с отдельной таблицей значений для каждого типа, а не колонку JSONB, и как работает фильтрация задач по значениям атрибутов.
Читать →
Последовательные номера задач — счётчик на INSERT ON CONFLICT в PostgreSQL, ключи спейсов и URL организаций
Часть 18 цикла о разработке Telegram-таск-трекера небольшой командой. Как у issues появились последовательные номера вида BRD-42, почему для них подошёл счётчик на INSERT ... ON CONFLICT DO UPDATE, а не sequence в PostgreSQL, как устроены ключи спейсов и URL организаций.
Читать →
Права доступа в таск-трекере без ролей — альтернатива RBAC, четыре версии модели и права на уровне спейса
Часть 17 цикла о разработке Telegram-таск-трекера небольшой командой. Почему в Boards нет ролей, как система прав прошла через четыре версии в поисках баланса между гибкостью и простотой и почему права в итоге выдаются только на уровне организации и спейса.
Читать →
Мультитенантность в SaaS-таск-трекере — организации, личная организация пользователя и отдельный JWT для организации
Часть 16 цикла о разработке Telegram-таск-трекера небольшой командой. Как мы добавили в Boards организации: модель данных с общей базой, личную организацию для каждого пользователя, вступление по коду приглашения и отдельный JWT, который выдаётся при входе в организацию.
Читать →
Интеграционное тестирование API в ASP.NET Core — WebApplicationFactory, настоящий PostgreSQL и типизированный прокси к контроллерам
Часть 15 цикла о разработке Telegram-таск-трекера небольшой командой. Почему мы написали первые интеграционные тесты, когда приложение уже работало в продакшене, как устроен тестовый хост на WebApplicationFactory с настоящей базой и собственный прокси, который превращает вызов метода контроллера в HTTP-запрос.
Читать →
Спейсы в таск-трекере — группировка досок по проектам, модель данных и перенос данных существующих пользователей
Часть 14 цикла о разработке Telegram-таск-трекера небольшой командой. Как спейсы группируют доски по проектам, почему спейс хранится у доски, а не у issue, и SQL-миграция, которая дала каждому пользователю спейс по умолчанию.
Читать →
Мы написали CMS-бэкенд на .NET для markdown и отказались от него в пользу SSR на Nuxt
Почему мы удалили собственный бэкенд, отдающий markdown как API, и перенесли блог в приложение на Nuxt — вечная синхронизация фронтенда с бэкендом, возможности, которых не хватало, и что упростилось после переезда.
Читать →
Как мы ведём бэклог в Boards через Claude Code и MCP
Часть 27 цикла о разработке Telegram-таск-трекера небольшой командой. Мы сделали MCP-сервер для Laraue Boards, чтобы разобраться, как работает MCP, а потом начали пользоваться им с Claude Code каждый день. Как за два часа появилась первая версия, что было в ней не так и какой ежедневный цикл он дал.
Читать →
Почему ревью кода, сгенерированного ИИ, часто дороже самостоятельного написания
Современный подход к разработке все больше сводится к тезису - код должен писать ИИ, а разработчик лишь направляет его в нужную сторону и проверяет результаты. А то, что отревьюить сгенерированный код так, чтобы ему довериться, часто дольше, чем написать его самостоятельно, старательно опускается.
Читать →