Портфолио · собственный продукт

Max Posting — продукт, а не сайт

Сервис отложенных публикаций и ИИ-текстов для каналов в мессенджере MAX. От первой строки кода до боевых платежей — один человек, два месяца.

2 месяца до прода1 разработчик1009 автотестов
Открыть max-posting.ru ↗ Обсудить свой проект
// зачем

Что решает
Max Posting

В MAX появились каналы — а инструментов для авторов не появилось.

Max Posting — планировщик публикаций и ИИ-тексты для каналов в мессенджере MAX
задача → решение

Канал ведёт себя сам

Пост нельзя запланировать, статистики нет, писать надо руками и ровно в момент публикации. Автор либо сидит с телефоном в девять утра, либо канал стоит.

  • Планировщик публикует точно в срок, без участия автора
  • Нейросеть пишет в голосе конкретного канала — по его теме и примерам постов
  • Просмотры собираются сами, по каждому посту и по каналу целиком
  • Подключение канала — пересылкой одного поста боту
Открыть сайт ↗
// что внутри

Восемь частей
одного сервиса

Не лендинг с формой, а работающий продукт с деньгами внутри.

Планировщикпосты уходят в канал точно в срок
ИИ-текстыв голосе канала, по теме и примерам
ИИ-картинкикарточки-инфографики к посту
Статистикапросмотры по каждому посту и каналу
Кошелёктокены, приём карт и СБП, автосписания
Бот-помощникподключение и управление прямо из чата
Размещенияодин пост в несколько каналов, автоудаление
Публичный отчётстраница со статусом размещения для заказчика
// как сделано

Стек и
инфраструктура

Всё своё: код, сервер, деплой, бэкапы, тесты.

ФронтReact 19, TypeScript, Vite, Tailwind
СерверFastify, PostgreSQL 16, своя очередь задач
Инфраструктурасвой VPS, nginx, systemd, ночные шифрованные бэкапы
Нейросетигенерация текста и изображений через OpenAI-совместимый API
Тестыvitest, база в памяти на реальных миграциях, Playwright
Деплойодна команда: 15 проверок, миграции, смоук, живые сценарии
// что ломалось

Шесть задач,
которых не видно снаружи

Продукт отличается от сайта тем, что ломается в местах, о которых заранее не догадаешься.

Мессенджер в пересланном сообщении отдаёт идентификатор первоисточника, а не наш. Повторная попытка не узнавала собственную публикацию в ленте и отправляла вторую. Развёл два разных поля — что пересылать и по чему опознавать свой пост — и запретил откат на обычную отправку по таймауту: таймаут не значит, что пост не ушёл.
Хранился только результат конверсии в markdown, а он беднее оригинала: часть выделений и ссылок просто не переживала преобразование. Стал хранить исходный текст с разметкой как он пришёл и собирать из него HTML на отправке. Проверено на живом посте: текст совпал побайтно, все 32 диапазона разметки на месте.
Лимит в 4000 символов платформа считает по сырому полю вместе с тегами разметки, а моя проверка считала видимый текст. Пост на 3839 видимых знаков превращался в 6079 и получал отказ — три раза подряд, с алертом. Счётчик переписан на то же поле, которое смотрит платформа.
Звёздочки и решётки из markdown попадали туда, где их никто не разбирает. Одна и та же ошибка нашлась сначала в пяти местах, потом ещё в двадцати двух. Завёл одну функцию очистки и статический страж, который роняет деплой, если в коде появится новое место с той же утечкой.
Без HTTP/2 браузер открывает много параллельных соединений, и фильтрующее оборудование обрывает доступ. Включил HTTP/2, вынес эталон конфига веб-сервера в репозиторий и поставил проверку версии протокола в проверки деплоя — потому что ручная правка на сервере ломала это дважды.
Проверка по пустому списку всегда истинна — тест горит зелёным и не проверяет ничего. Завёл правило и сторожа: проверка по коллекции обязана падать, если коллекция пуста. Заодно запретил сравнивать текст подстрокой: именно так однажды лишний служебный символ уехал подписчику при полностью зелёном прогоне.
// цифрами

Объём работы

Проект живой: работает на своём сервере, принимает оплату, публикует в реальные каналы.

84узла в карте возможностей
53миграции базы данных
1009автотестов в 83 файлах
15проверок перед каждым деплоем
28живых сценариев против настоящего мессенджера
2месяца от первой строки до боевых платежей
// зачем это вам

Что кейс
доказывает

Главный вопрос ко мне звучит так: «ты один — потянешь?»

Доведу до концане прототип и не демо: сервис в проде, с оплатой и живыми пользователями
Отвечаю за всёфронт, сервер, база, деплой, безопасность, бэкапы — без подрядчиков между вами и результатом
Не ломаю продкаждый выпуск проходит 15 автоматических проверок, откат готов заранее
Если это смог — сайт тем болеесайт с формами и каталогом проще продукта с деньгами внутри

Нужен такой же
уровень исполнения?

Опишите проект — покажу, какой из кейсов ближе всего к вашей нише, и вернусь со структурой, сроком и сметой.

01Рассказываете задачуТЗ, пример сайта или пара слов о проекте и цели.
02Аудит и сметаСтруктура, стек, сроки и цена — фиксируем план.
03Разработка и запускСайт сразу под рост в поиске, с аналитикой и поддержкой.
Отвечу в течение рабочего дня · без спама