Groselia

Соцсети, которые ведут себя сами

Моя роль

Сооснователь
Разработка
Продуктовый дизайн и дизайн бренда

Описание

Groselia ведёт соцсети прежде всего для технологических стартапов, а также для компаний других отраслей и размеров: стратегия, дизайн, публикации, ответы на комментарии и отчёты — на всех каналах, с одной платформы.

Команда

Danilo ParmegianiСооснователь
Pedro CritchiСооснователь

Контекст

Я основал Groselia вместе с Pedro, вдвоём. Он отвечает за маркетинг, продажи и операции; я спроектировал бренд и продукт и построил платформу, на которой всё работает, — от базы данных до последней анимации. Пока продукт был self-serve, в нём зарегистрировались более 200 человек, а сегодня на нём работают контент и соцсети наших клиентов. В июне 2026 года мы привлекли pre-seed на R$100k от Link Vector — акселератора Link School of Business, которую я окончил, а через два месяца после пивота в сервис Groselia приносит больше R$15 000 в месяц.

Инструменты

Codex
Claude Code
Figma
Adobe tools

Стек

  • React
  • Next.js
  • TypeScript
  • Tailwind
  • Supabase
  • Frontier LLMs
  • Trigger.dev
  • Stripe
  • Vercel

Сроки

2025 — сейчас

В цифрах

R$180k+
годовой run rate
200+
аккаунтов создано
350
брендов настроено
9,700+
commits
520+
пул-реквестов
47
edge-функций

Задача

Разработка перестала быть узким местом. Им стала заметность.

AI обрушил стоимость создания софта. Основатель без инженерного опыта теперь может выпустить продукт за выходные — и все остальные тоже. Дешевле не стало одно: добиться, чтобы его кто-то заметил. Дистрибуция — это непрерывная операция, а не задача: публиковать каждый день в восьми соцсетях, каждой из которых нужен свой формат, отвечать на каждый комментарий и разбираться в цифрах, которые каждое приложение считает по-своему.

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

Как мы сюда пришли

Groselia четыре раза меняла форму, прежде чем нашла себя. Каждый поворот сохранял то, что работало, и отбрасывал остальное.

  1. Конец 2025 — февр. 2026

    Argibee

    AI-платформа для дизайна брендов. В конце 2025 года она появилась как прототип, а в феврале 2026-го стала настоящей компанией. Свой рынок она не нашла, но её движок бренд-китов стал основой всего, что было потом.

  2. Апр. 2026

    Моушн-видео

    Groselia начиналась с лонч-видео в стиле Apple, сделанных из шаблонов After Effects. Я вручную проверил весь пайплайн, а потом понял, что до нужной планки качества он не масштабируется.

  3. Июнь 2026

    Pre-seed от Link Vector

    Мы попали в Startup School от Link School of Business — 100-дневную программу для основателей, снятую как реалити-шоу (смотреть сезон). Она завершилась демо-днём, где я питчил Groselia со сцены, и нашим pre-seed на R$100k от Link Vector — акселератора Link School of Business, которую я окончил.

    Мой питч на демо-дне
  4. Авг. 2026

    Lovable для маркетинга

    Один разговор вместо формы: опишите кампанию, и Groselia её спланирует, напишет и опубликует. Чат-агент с инструментами, а не набор ботов.

  5. Сент. 2026

    SMM-менеджер

    Клиенты не хотели, чтобы AI делал для них контент. Они хотели, чтобы их собственные фото хорошо публиковались, а на комментарии отвечали. Мы убрали генерацию и сосредоточились на ведении каналов.

  6. Сейчас

    Service as a software

    Мы продаём работу, а не инструмент. Наша команда ведёт соцсети каждого клиента на платформе, и благодаря ей один человек справляется с тем, на что раньше нужно было агентство.

Строим публично

Мы с самого начала строили публично. Ещё во времена Argibee мы рассказывали о своём пути на YouTube — от запуска листа ожидания Argibee до первого видео, где показали Groselia. Остальная история, видео за видео, — на нашем канале.

Запуск листа ожидания Argibee
Первое видео, где мы показали Groselia

Бренд

Я хотел, чтобы бренд Groselia был смелым: таким, чтобы люди останавливались и смотрели — на сайте, в приложении и в каждом посте в наших соцсетях. Где бы человек с ним ни столкнулся, бренд должен впечатлить, вызвать немного восхищения и желание нанять нас из-за того, что он только что увидел. И прежде всего он должен был потрясающе смотреться для технологических стартапов — экосистемы, частью которой мы являемся, и клиентов, для которых мы строим в первую очередь.

Весь бренд я спроектировал с помощью плагина Figma внутри Codex: логотип, типографику и то, как она соединяется с символом в правильных пропорциях, визуальный стиль, библиотеку SVG-иконок, текстовые стили и упорядоченную цветовую палитру. Каждое решение попадало на одну доску, с размерами, чтобы его можно было сравнить и оспорить.

Codex рядом с файлом Groselia в Figma: система логотипа, логотип на каждом фоновом цвете, символ во всех цветах палитры и цветовая палитра
Доски бренда, сделанные в Figma с помощью плагина Figma внутри Codex.

Символ

Символ появился первым и остался. Три мягких лепестка, вращающихся вокруг центра, перешли из самой первой версии компании, и новый логотип строился вокруг него, а не поверх: его геометрию копировали и масштабировали, но никогда не перерисовывали.

Словесный знак

Словесный знак набран TT Commons Pro Bold строчными буквами и переведён в векторы, чтобы везде выглядеть одинаково. С родными интервалами он казался рыхлым рядом с символом, поэтому я сжал трекинг до −4%, сдвинув каждую букву влево ещё на 6,4 единицы при 160px. Звучит как мелочь, но слово сузилось с 564 до 520 единиц и стало читаться как единая форма.

Сетка из H

Всё измеряется в H — видимой высоте словесного знака — на сетке H/10. Так логотип масштабируется, и никому не нужно снова подбирать его на глаз.

Для вертикального логотипа я нарисовал шесть вариантов: три размера символа (1.50H, 1.75H, 2.00H) на два отступа (0.15H, 0.25H), и мы выбрали B: символ 1.75H, на 0.15H выше слова. Для горизонтального я сравнил отступы от 0.20H до 0.35H и остановился на символе 1.10H с отступом 0.35H.

1.75H0.15HH

Вертикальный логотип на построечной сетке. H — высота словесного знака; шаг сетки — H/10.

Логотип Groselia: горизонтальный

Горизонтальный

Символ 1.10H · отступ 0.35H

Логотип Groselia: вертикальный

Вертикальный

Символ 1.75H · отступ 0.15H

Логотип Groselia: символ

Символ

Исходные пропорции, 0.93 : 1

Colour

The palette is fifteen colours, loud on purpose. But the logo only ever comes in four treatments: blue symbol with black text, blue with white, all black and all white. The other colours are grounds, never the symbol.

To prove that, I put the symbol and both lockups on twelve backgrounds, 24 studies each, and kept the ones where its silhouette survives. On blue grounds the symbol goes monochrome. Click a colour to copy it.

Типографика

TT Commons Pro справляется со всем: шесть начертаний от Light до ExtraBold, шкала из одиннадцати ступеней от 12 до 96px и настоящий курсив. Я перевёл на него все 688 текстовых слоёв в файле, так что брендбук, приложение и сайт теперь говорят одним голосом.

Основной шрифт

TT Commons
Pro

TT Commons ProДисплей · 01
→Groselia@
Reels → Posts
Nº 128⅝ e

Иконка приложения

Иконка приложения — единственное место, где бренд становится объёмным: символ из фарфора, в несколько слоёв, освещённый сверху и слегка глянцевый. В одном из обновлений я уменьшил символ внутри на 10%, чтобы ему было свободнее в плашке. У неё есть и собственная связка со словесным знаком: плашка размером 1.5H.

Иконка приложения Groselia

Мир 3D-объектов

Вокруг логотипа живёт труппа 3D-объектов: сердце с глазами-пуговками, облачка чата, хештег, искорки. Это голос бренда на сайте и в наших постах, и они никогда не стоят на месте: парят, а на сайте реагируют на курсор. Эти тоже: толкните их или оттяните один и отпустите.

Neo doodles

Для всего плоского есть Neo, наш набор иконок: толстый чёрный контур, заливки из палитры и один белый блик. На сайте каждая иконка сначала выглядит как простая линейная иконка в белой плашке и превращается в свой дудл при наведении, а её части появляются по одной: диск выскакивает, полоски падают, блик прорисовывается. Это родные дудлы и анимация сайта, скопированные как есть. Наведите на любую.

Официальные подключения
Без вашего участия
Пауза в любой момент
Всё записывается
Данные остаются приватными
Уйти можно когда угодно
Ответы вашим голосом
Проверка человеком
Лиды отмечаются
Платная реклама
Лендинг
Редизайн продукта
Ребрендинг
Искра
Сердце
Кубок

Продукт

Всё в Groselia делается в одном чате. Вы пишете, что и когда должно выйти, а она планирует, публикует, отвечает на комментарии и рассказывает, что сработало. Работа приходит как один план, который одобряет владелец, а не как десяток экранов, которыми надо управлять.

Разговор, а не дашборд

Как прошла прошлая неделя?

Лучшая неделя с июня.

  • Охват вырос на 38% благодаря рилсу с латте-артом (41K просмотров в Instagram, 64K в TikTok).
  • Сохранений вдвое больше у карусели про эспрессо. Рецепты люди сохраняют.
  • Комментарии ждут ответа. 14 вопросов о доставке и помоле, большинство без ответа.

Закономерность ясна: видео с 17 до 19, фото утром. Я бы держался этого следующие две недели.

2 дня назад

Доброе утро! На этой неделе вас ждут две вещи:

  • Урожай Carmo de Minas появится на полке в пятницу, а под него пока ничего не запланировано.
  • 14 вопросов ждут ответа под вашими постами, в основном о доставке.

С чего начнём?

Выберите один вариант
8 минут назад

Groselia начиналась как форма: выбери цель, заполни поля, получи кампанию. Никто не хочет заполнять формы о собственном бизнесе, поэтому теперь у каждого бренда вместо этого один разговор.

Вы открываете свой бренд и пишете. Спросите, что опубликовать на этой неделе, закиньте фото с телефона или напишите «ответь на вчерашние комментарии». Агент сначала смотрит, потом отвечает: ваш календарь, что сработало, память бренда.

Если ему что-то нужно от вас, он задаёт один короткий раунд вопросов, на которые вы отвечаете в одно касание. Затем предлагает один план: посты с датами и временем, ответы, любые изменения. Вы правите что хотите, одобряете и смотрите, как заполняется календарь.

Карточка здесь — настоящий чат, собранный в браузере из собственных токенов приложения. Попробуйте.

Спроектировано дважды: для владельцев, потом для нас

Первой аудиторией были владельцы малого бизнеса, которые сами ведут свои соцсети. Они не мыслят кампаниями, воронками или частотой публикаций; они думают: «что выложить на этой неделе?». Поэтому самым сложным было спрятать механику: онбординг в четыре вопроса, бренд-кит, заполненный по ссылке, календарь с перетаскиванием, каждый экран на семнадцати языках и удобный на телефоне.

Потом мы поняли, что клиенты не хотят управлять никаким инструментом, даже самым простым. Они хотели, чтобы работа была сделана. Так что главными пользователями стали мы. Один человек в нашей команде ведёт много брендов, и тому же приложению пришлось обзавестись мультибрендовыми рабочими пространствами, циклами, которые открываются встречей и закрываются отчётом, шагом одобрения для каждого поста и одним ящиком входящих для всех соцсетей. Клиенты по-прежнему заходят в приложение, но теперь там они наблюдают за работой, а не делают её.

ноябрь 2026 г.

Пн
103
Вт
113
Ср
123
Чт
133
Пт
143
Сб
152
Вс
162
8:00

Почему мы платим на 40% выше рынка

Импортирован
6
Новый урожай
49:00

Новый урожай: Carmo de Minas

Опубликован
5
За кадром
17:30

POV: первая смена в обжарочной

Опубликован
Рецепты
9:00

Как мы настраиваем эспрессо

Опубликован
12:00

Непопулярное мнение о тёмной обжарке

Опубликован
Ошибка
За кадром
1218:00

Оцениваем заказы наших постоянных гостей

Опубликован
8:30

Время круассанов

Запланирован
3
Вакансии
11:00

Знакомьтесь: Ana, наш старший бариста

Вручную
РецептыНовый урожай+1
17:00

Латте-арт в замедленной съёмке

Запланирован
9:00

Во что превращается 1 кг зелёного кофе

Запланирован
7
За кадром
11:00

Обжарочная изнутри, от начала до конца

Запланирован
Рецепты
18:30

Колд брю за 60 секунд

Черновик
Нужно видео
Новый урожайПромо
9:00

Новый урожай уже на полке

Запланирован
Черновик
Вакансии
10:00

Ищем старшего обжарщика

Запланирован
17:00

Айс-латте от начала до конца

Черновик
Промо
10:00

Ваш субботний столик

Запланирован
15:00

Сезон эспрессо-тоника открыт

Черновик
Рецепты
11:00

Пуровер за 4 минуты: гайд

Запланирован
Промо
18:00

Знакомьтесь: пачка Oakline

Черновик
4

Сделано так, чтобы читали агенты

Всё чаще первым читателем бренда или веб-страницы оказывается AI. Поэтому всё в Groselia написано для агентов так же, как для людей. Память бренда — это набор простых документов в Markdown: предпочтения, что можно и чего нельзя, факты о бренде. Агент читает их перед каждым ответом и сам редактирует четырьмя инструментами — так AI-ассистенты ведут собственную память. Люди открывают и редактируют те же самые документы в бренд-ките.

Insights работают через одно общее ядро, которое читают и дашборд, и агент, поэтому когда вы спрашиваете «что работает?», ответ берётся из тех же цифр, что вы видите. И сайт делает то же самое для ассистентов, которых люди спрашивают о нас: groselia.com отдаёт llms.txt, более длинный llms-full.txt и файл со сравнением, и всё это генерируется из одного источника фактов в коде, так что то, что AI говорит о наших ценах или безопасности, не может разойтись с сайтом.

Вовлечённость во времени

По неделям, последние 30 дн., по дате публикации

ER7,69%

Ключевые функции

  • Бренд-кит по ссылке

    Вставьте адрес сайта и подключите аккаунты. Groselia соберёт данные с сайта, прочитает ваши прошлые посты и сама заполнит логотип, цвета, шрифты, голос и аудиторию.

  • Один разговор

    AI-агент с 41 инструментом пишет подписи к вашим медиа, подбирает время по вашим собственным данным о вовлечённости, читает метрики и готовит ответы, а затем собирает всё в план.

  • Календарь для восьми соцсетей

    Instagram, LinkedIn, TikTok, YouTube, X, Facebook, Threads и Reddit, каждая в родном формате, а прошлые посты импортируются, так что календарь никогда не пустует.

  • Ответ на каждый комментарий

    Комментарии и личные сообщения из всех соцсетей в одном ящике входящих, с черновиками ответов голосом бренда, а всё деликатное откладывается для человека.

  • Аналитика простым языком

    Охват, просмотры и вовлечённость по всем аккаунтам — с честностью о том, что каждая платформа отдаёт, а что нет, — и ответ на вопрос «что работает?».

  • Циклы и согласования

    Работа идёт циклами. Каждый открывается встречей и закрывается отчётом, который AI пишет по цифрам, а каждый пост может ждать одобрения клиента.

Сделано с AI-агентами

Я построил Groselia, а моей инженерной командой были AI-агенты. Codex и Claude Code писали код, каждое изменение в своей ветке, а я его проектировал, ревьюил каждый пул-реквест и решал, что выходит в релиз.

А большинство промптов я не печатал, а надиктовывал с помощью Wispr Flow. Хороший промпт — это длинное подробное ТЗ, и голосом я мог выдавать его с той же скоростью, с какой думал.

  • Codex

    Агент для кода

  • Claude Code

    Агент для кода

  • Wispr Flow

    Голосовой ввод

Сайт

Сайт — место, где бренд звучит громче всего. Я спроектировал и построил его на Next.js. Он на семнадцати языках и при регистрации передаёт язык каждого посетителя в приложение.

Первый экран, с которым можно играть

Пока страница загружается, логотип поворачивается, а затем появляется первый экран: 3D-объекты, которые парят, наклоняются вслед за мышью и разлетаются от курсора, и сцена при прокрутке, которая заканчивается фразой «Made for you».

groselia.com
Первый экран groselia.com: «We run your socials. You run your business.» с 3D-объектами вокруг сердца

Настоящее приложение, воссозданное в коде

Раздел «Inside your Groselia» показывает платформу такой, какая она есть: она воссоздана в коде по экранам самого приложения с демо-брендом.

groselia.com
«Inside your Groselia»: экран подключения каналов платформы

Блог

Заметки о ведении соцсетей. Посты — это простые MDX-файлы, по одному на язык, без CMS, и у каждого своя лента и структурированные данные, чтобы поисковики и AI-ассистенты читали его правильно.

groselia.com
Блог groselia.com: первый пост подсвечен под курсором, ниже другие посты

Форма, которая квалифицирует лиды

Каждая кнопка «Book a call» перед календарём открывает короткую форму: кто вы, где публикуетесь, что вам нужно и какой у вас бюджет. Каждый шаг сохраняется в нашу базу по ходу заполнения, так что мы видим даже недописанные ответы, а заполненная форма шлёт уведомление нашей команде в Slack.

groselia.com
Страница записи: «Let's talk about your social media.», форма рядом с тремя шагами

Адаптивный, всегда

Каждая страница спроектирована и для телефонов, а не просто ужата под размер. Там, где нет наведения, секции оживают, когда доходят до середины экрана.

Главная страница на телефоне
«Always in sync with your team» на телефоне, первая карточка активна
Форма записи на телефоне, на шаге с вопросом, что вам нужно и какой месячный бюджет

Инженерия

Архитектура

Платформу я построил сам, а AI был моим напарником. Приложение — на React и Vite, лендинг — на Next.js, и оба работают на одном проекте Supabase: Postgres с row-level security, авторизация, realtime и хранилище, плюс 47 edge-функций. Всё медленное или запланированное выполняется в Trigger.dev, соцсети подключены через один API публикации, а Stripe отвечает за тарифы, карты и бразильский boleto.

Есть ещё MCP-сервер и плагин для Codex, так что Groselia можно пользоваться прямо из AI-агента: те же бренды, посты и черновики, но в виде инструментов.

Где используется

Ядро

Supabase

За кулисами

Приложение, сайт и MCP-сервер размещены на Vercel.

Наведите курсор или нажмите на блок, чтобы увидеть, что он делает и с чем связан.

Путь поста

Лучший способ понять, как всё связано, — проследить путь одного поста: от фразы в чате до его цифр в Insights. Переключайте шаги сами или включите автовоспроизведение.

Веб-приложение

Владелец просит

«Опубликуй фото урожая в пятницу, в Instagram и LinkedIn». Сообщение уходит в edge-функцию агента, которая стримит ответ обратно.

ReactSSE-стрим

Агент

Агент работает на лучших моделях рынка — от Anthropic, OpenAI и других провайдеров — как одна стриминговая edge-функция с циклом вызова инструментов. У модели 41 собственный инструмент плюс веб-поиск и загрузка страниц, до восьми шагов за ход. Сложной частью никогда не была модель. Сложно было сделать так, чтобы агент всегда знал, что правда прямо сейчас.

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

Остальное определили два правила. Всё публичное или необратимое попадает в план, который одобряет владелец, и никогда не уходит напрямую. И пост существует, только если его создал инструмент на этом ходу — это положило конец временам, когда агент описывал работу, которую не сделал. А ещё агент не привязан к одной модели: когда модель поменьше и подешевле стала достаточно хорошей, я перевёл чат на неё, чтобы снизить стоимость одного диалога.

Контекст, собираемый заново на каждом шаге

Инструкции и инструментыкешируются на час
Дата и времячасовой пояс владельца
Документы памятипредпочтения, что можно и чего нельзя
Живой календарькаждый пост и его статус
Открытые планыпредложенные и одобренные
История до сих порскользящее саммари
→LLMТоповые модели · до 8 шагов→

Вызовы инструментов

✓get_posting_times
✓get_insights
✓propose_plan

План ждёт одобрения

Неделя урожая: 3 поста, 4 ответа

Агент собирает свой контекст
// Volatile block: time + memory + live calendar + active plans + rolling summary.
// Rebuilt each turn (never cached) so the agent always sees current state.
const volatileSystem = () => {
  const parts = [
    nowBlock,
    renderMemories(memories),
    renderCalendar(calendar, todayISO),
    renderPlans(plans),
  ]
  if (documents.length) parts.push(renderDocuments(documents))
  if (rollingSummary) parts.push(`STORY SO FAR (summary of earlier messages in THIS conversation):\n${rollingSummary}`)
  // … then a line for each of the brand's other conversations
  return parts.join('\n\n')
}

Модель данных

Около 55 таблиц в нескольких понятных группах. У рабочего пространства есть участники и бренды; всё остальное привязано к бренду, поэтому row-level security везде отвечает на один вопрос: является ли этот человек участником этого бренда?

Кто

  • Рабочие пространства
  • Участники
  • Роли в брендах
  • Профили

Бренд

  • Бренды
  • Цвета, шрифты, логотипы
  • Продукты и люди
  • Документы памяти
  • Документы бренда

Чат

  • Диалоги
  • Сообщения
  • Планы
  • Пункты плана

Календарь

  • Посты
  • По одному на соцсеть
  • Метрики постов
  • Комментарии к постам

Каналы

  • Подключённые аккаунты
  • Ежедневные метрики аккаунтов
  • Настройки каналов

Входящие и циклы

  • Ветки входящих
  • Входящие сообщения
  • Черновики ответов
  • Циклы
  • Отчёты по циклам

Всё, что ниже «Кто», несёт id бренда; row-level security проверяет его при каждом чтении и записи.

Надёжность и безопасность

Groselia публикует в настоящие аккаунты, поэтому самые дорогие сбои — пост, ушедший дважды, или пост, который тихо так и не вышел. Большая часть инженерной работы — именно здесь.

1Двойное одобрение срабатывает один раз

Исполнитель планов забирает план, а затем каждый пункт условным обновлением, и каждый ключ идемпотентности строится из собственного id пункта. Двойной клик или повторный запрос просто повторяет прежний результат, а не публикует пост ещё раз.

2Вебхуки подписаны и переигрываются

Каждая доставка от API публикации должна нести валидную подпись HMAC. Обработчики идемпотентны, потому что доставки могут приходить больше одного раза, а отдельная задача каждые десять минут переигрывает пропущенные события.

3Отказ до постановки в очередь

Один общий файл правил описывает, что принимает каждая соцсеть (Instagram нужны медиа, YouTube — видео, в Facebook нельзя смешивать). Планировщик проверяет его до того, как что-то попадёт в очередь, и отклонённый пост возвращается как «Ошибка» с причиной, а не висит в календаре как «Запланирован».

4Доступ проверяется при каждом вызове

Row-level security в Postgres, проверка роли в каждой edge-функции и доступ к MCP через OAuth с PKCE — с ограничением по бренду и по действию, отзывается с одной страницы.

Какое-то время моё локальное приложение и боевое использовали одну продакшн-базу, и однажды миграция, запущенная раньше деплоя, опустошила живую страницу Brand Kits. С тех пор работа над бэкендом сначала идёт в ветке Supabase и сливается в продакшн вместе с кодом, которому она нужна.

Качество и процесс

Около 1000 тест-кейсов в 140 тестовых файлах покрывают приложение, MCP-сервер и edge-функции. Некоторые проверки появились потому, что однажды что-то сломалось: тест на паритет валит сборку, если в каком-то из 17 языков не хватает ключа, а наборы тестов базы для MCP работают на синтетических данных и в конце откатываются.

У агента есть свои эвалы. Один задаёт живому агенту фиксированный набор вопросов об эффективности бренда, каждый в новом диалоге, и проверяет, что агент прочитал Insights за правильный период, а в ответе те же цифры, что показывает страница Insights.

Один человек выпустил 520+ пул-реквестов, относясь к AI-агентам как к команде. Каждое изменение получает свою ветку в своём git worktree, поэтому Claude Code и Codex могут работать над несколькими задачами сразу, не мешая друг другу. Каждый прогоняет тесты и проверку типов, открывает небольшой пул-реквест, и ничего не сливается, пока я это не прочитаю.

Изменение→Свой worktree→Claude Code или Codex→Тесты и типы→Небольшой PR→Моё ревью→Слияние и деплой

Технические сложности

Каждая выглядела как баг в интерфейсе, а оказывалась чем-то глубже: формой стрима, меткой времени, тем, что соцсеть реально отдаёт, часами.

Генерация, которая ощущается живой · Realtime

Генерация месяца постов выглядела так: спиннер, а потом сразу двенадцать постов. Казалось медленно, но проблема была не в модели, а в гранулярности.

Я перевёл вывод модели на JSON Lines и стал стримить его, вставляя каждый пост в момент, когда закрывается его строка. Календарь подписан на изменения Postgres через Supabase Realtime и сначала рисует заглушки, так что посты печатаются сами, один за другим.

То же ожидание теперь похоже на то, как смотришь на чью-то работу.

Две метки времени, которые никогда не совпадали · Данные

Supabase предупредил, что у базы вот-вот закончится дисковый IO. С чтением всё было в порядке. Что-то перезаписывало одни и те же строки: 344 тыс. вставок, чтобы хранить 83 тыс. сообщений.

Синхронизация входящих сравнивала сохранённую метку времени с той, что читала обратно. Postgres возвращал её как +00:00, а мы записывали как Z, поэтому каждый диалог выглядел изменённым и при каждом проходе скачивался заново. Сравнение моментов времени вместо строк всё исправило.

Сравнение двух меток времени
export function sameInstant(a: string | null | undefined, b: string | null | undefined): boolean {
  if (a == null && b == null) return true;
  if (a == null || b == null) return false;
  if (a === b) return true;
  const ta = Date.parse(a);
  const tb = Date.parse(b);
  return Number.isFinite(ta) && Number.isFinite(tb) && ta === tb;
}

Вставок, чтобы хранить 83 тыс. сообщений

344 тыс.→одна на новое сообщение

Диалогов, перечитываемых за проход

все→только изменённые

Лишние записи прекратились, а истории входящих, которые никогда не досинхронизировались, впервые загрузились полностью.

Ноль — не всегда ноль · Аналитика

Наш провайдер аналитики отдаёт одну и ту же структуру для всех соцсетей и заполняет нулём всё, о чём сеть не сообщает. У Instagram «было» ноль кликов на каждом посте. Графики вежливо врали.

Реестр метрик по платформам: он фиксирует, что каждая сеть действительно отдаёт, при загрузке заменяет всё остальное на null и позволяет каждому графику честно показать, упростить или скрыть метрику.

Аналитика по восьми соцсетям, которая никогда не показывает число, которое никто не измерял.

Разлогинен из-за спешащих часов · Авторизация

Моего сооснователя выкидывало из аккаунта сразу после входа: пятнадцать обновлений токена в секунду, а потом лимит запросов. Больше ни у кого это не воспроизводилось.

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

Обновлений токена в секунду

15→0

Вход работает при любых часах на устройстве, а консоль сообщает, если они сбиты.

Выводы

Вкус — это ров

Когда AI делает разработку дешёвой, выпускать продукты может каждый, и большинство из них выглядит одинаково. Дефицитом остаётся суждение: понимать, что выкинуть, каким должен ощущаться экран, когда анимация уже лишняя. Для команды из двух человек, которая никого не перетратит, вкус — это то, благодаря чему Groselia выглядит и работает как нечто гораздо большее, и это единственное, что я никогда не отдам модели.

Продавайте результат, а не инструмент

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

Контекст важнее хитрости

Агент становился лучше, когда знал больше, а не когда промпт становился умнее. Живой календарь, память и открытые планы на каждом ходу, плюс правило спрашивать, прежде чем действовать, дали больше, чем любое обновление модели.

AI меняет размер команды

Когда агенты параллельно пишут большую часть кода, моя работа сместилась к тому, чтобы решать, что строить, ревьюить каждое изменение и держать планку высокой. Один человек теперь может вести то, на что раньше нужна была команда, — пока этот человек остаётся редактором.

Следующий проект

Все проекты