Задача
Что мы сделали
Один бэкенд на целую сеть приложений
Когда приложений два, контент можно держать в файлах внутри каждого. Когда их двадцать четыре, каждая правка в тексте превращается в новый релиз в Google Play и неделю ожидания.
Мы сделали платформу, в которой содержимое живёт отдельно от приложений: редактор правит его в админке, а телефоны забирают обновлённый набор сами — без обновления самого приложения.
Каждая плитка — приложение: сколько в нём материалов и какая версия контента сейчас опубликована.
Приложение только читает
Главное решение архитектуры простое: телефон не пишет в платформу ничего, кроме обезличенных событий. Он забирает манифест, забирает набор материалов на своём языке — и всё. Нет ни учётных записей, ни синхронизации, ни конфликтов.
Благодаря этому новое приложение заводится почти без кода: в админке создаётся запись, генерируется ключ, заполняются рубрики и материалы, нажимается «Опубликовать» — и версия контента растёт на единицу. Ключ и адрес вписываются в приложение, дальше оно работает само.
Двадцать четыре приложения в одной таблице
У каждого свой ключ доступа, свой набор языков, своя версия контента и своё состояние. Видно, что опубликовано, что в работе, а что лежит идеей. Это не витрина — это рабочий список, из которого ведётся вся сеть.
Материалы разной формы
Рецепт, инструкция, вопрос викторины, карточка для игры, код ошибки, загадка, факт — у каждого формата своя форма редактирования, а не одно поле «текст». Добавить сотню материалов можно импортом: вставляется массив, выбирается тип и язык, и система показывает отчёт по строкам — что принялось, что нет и почему.
Не платить за то, что не изменилось
Набор материалов для одного приложения — это сотни килобайт. Качать их каждый раз при запуске бессмысленно, поэтому ответ подписан меткой версии: если на телефоне уже свежий набор, сервер отвечает «изменений нет» и не передаёт ничего.
Здесь была та самая ловушка, из-за которой экономия не работала: прокси, сжимающий ответы, переписывает метку в «слабую» форму, и строгое сравнение перестаёт совпадать. Телефон каждый раз качал всё заново. Сравнение пришлось научить принимать все три формы метки — строгую, слабую и перечисленную через запятую.
Медиа, которое не раздувает приложение
Каждое изображение при загрузке переводится в WebP и хранится в двух размерах: полный до 1200 пикселей и миниатюра до 400. Раздаёт их сервер с длинным кешем, а приложение получает готовые адреса — никаких преобразований на телефоне.
Статистика без персональных данных
Приложения шлют обезличенные события — открытие, переход, действие. Никаких идентификаторов человека, никаких контактов. За раз принимается не больше пятидесяти событий, некорректные строки просто отбрасываются, а не роняют весь запрос.
Рядом в платформе сводятся показатели из магазина приложений и рекламной сети — чтобы смотреть установки и доход там же, где лежит контент, а не в трёх разных кабинетах.
Как это делалось
Что под капотом
Платформа
Laravel с админкой на Filament. Живёт на обычном хостинге: без root, без контейнеров, очереди и кеш в базе, изображения конвертируются сразу при загрузке.
API
Четыре адреса на чтение, ключ в заголовке, ограничение по ключу и по адресу, метка версии с ответом «изменений нет». Ошибки — обычный JSON с кодом.
Хранилище
Отдельное место для сборок и материалов магазина: иконки, снимки экрана, описания. Плюс перекрёстные ссылки между приложениями сети.
Что получилось
Сеть из двадцати четырёх приложений, в которой правка текста доходит до пользователя за минуты, а не за неделю. Новое приложение заводится в админке за считаные минуты: создать, наполнить, опубликовать, вписать ключ.
И всё это работает на обычном хостинге — без отдельного сервера, очередей в памяти и контейнеров, которые там просто негде запустить.

