Привет. Я Максим, уже лет пять пишу под Android. И всё время упирался в одно и то же: хотелось спокойно выкатывать фичи по чуть-чуть, резать что-то одним кликом, если пошло не так, и не собирать всё в один огромный релиз «на авось». То есть по сути — фича-флаги и нормальные эксперименты. Но то, что я пробовал, как-то не садилось на мои задачи.

Где-то стек был чужой: нормальной Kotlin-native истории не было, всё через обвязки. Где-то — целая платформа с кучей фич, а мне нужен был по сути «включил/выключил» и простой A/B. Или ещё один облачный сервис: свой пайплайн, свои лимиты, свои договоры. В итоге я подумал: ладно, сделаю то, что сам бы использовал. Так и появился Flagent.

Чего не хватало по факту

Мне нужно было вот что. Во-первых, сами фича-флаги: включать и выключать фичи без нового билда в сторе. Не «закоммитить и ждать неделю», а «переключил в админке — приложение уже ведёт себя по-другому». Во-вторых, эксперименты: не разбросанные по коду if (BuildConfig.DEBUG) и не «пусть бэкенд решает», а явные правила: кому показываем, какой процент, какой вариант. И в-третьих — чтобы всё это жило рядом с Kotlin и тем стеком, на котором я уже работаю, а не «ещё один мир» со своими SDK и ограничениями.

Я посмотрел, что есть — готовые продукты и самописные решения в разных компаниях. Что-то взял на вооружение, но одного «вот оно, то самое» не нашёл. Поэтому завёл свой проект и начал делать под себя.

Что уже есть в Flagent

Сейчас это open-source бэкенд плюс небольшая админка. Поднимаешь у себя — и подключаешь приложения через API или SDK.

Бэкенд на Ktor, внутри — чистая архитектура, без лишних слоёв. БД — PostgreSQL, MySQL или SQLite (последний удобен для локальной возни). Админка на Compose for Web: создаёшь флаги, настраиваешь сегменты (кто в кого попадает), варианты, ограничения. Есть отладочная консоль — можно посмотреть, почему пользователь попал или не попал в эксперимент.

SDK есть под Kotlin (включая «усиленный» с офлайн-оценкой и подтяжкой изменений по SSE), под JavaScript/TypeScript, Swift, Python, Go. Плюс плагин для Ktor — если флаги крутятся на бэкенде. Оценка флагов — детерминированная: один и тот же пользователь при тех же правилах всегда получает один и тот же вариант (MurmurHash3), без «попал сегодня в A, завтра в B». Можно таргетировать по сегментам и ограничениям: регион, тип подписки, что угодно из контекста.

Важный кусок для мобилки — клиентская оценка в Kotlin (и в Go): после одной загрузки снапшота флаги считаются локально, без запроса на сервер при каждом isEnabled(). Плюс обновления в реальном времени по SSE: поменял флаг в админке — клиенты подхватывают за секунды, без перезапуска приложения.

В общем, уже можно поднять сервер, накидать флагов, подключить приложение и либо прикрывать фичи флагами, либо крутить простые A/B. Я не изобретал велосипед с нуля — смотрел, как устроены другие платформы, но собирал под свой вкус: типобезопасность, корутины, self-host без привязки к облаку.

Как попробовать

Самый быстрый вариант — Docker. Нужно передать логин/пароль админа и JWT-секрет, иначе в UI не зайти (это мы недавно в доках поправили). Минимально так:

docker run -d -p 18000:18000 \
  -e FLAGENT_ADMIN_EMAIL=admin@local \
  -e FLAGENT_ADMIN_PASSWORD=admin \
  -e FLAGENT_JWT_AUTH_SECRET=любой-секрет-не-короче-32-символов \
  -v flagent-data:/data \
  ghcr.io/maxluxs/flagent

Дальше открываешь http://localhost:18000, логинишься (admin@local / admin), создаёшь флаг, в настройках тенанта берёшь API-ключ. В приложении ставишь SDK и делаешь проверку:

if (client.isEnabled("my-feature")) {
    // новое поведение
} else {
    // старое
}

Полный разбор — в Quick Start и в доках: как настроить БД, как деплоить, какие переменные окружения, как подключать SDK под твой язык.

Куда это всё

Пока что это пет-проект. Я в первую очередь закрываю им свои кейсы, но было бы круто, если бы им могли пользоваться и другие: чтобы доки были нормальные, чтобы можно было спокойно self-hostить, а в перспективе — может, и managed-вариант. Жёсткого роадмапа не даю: делаю по мере необходимости и по фидбеку.

Если зашло — ты на Kotlin или Ktor, или просто ищешь простой свой сервер флагов без облачной подписки — буду рад, если попробуешь, поставишь звезду на GitHub, напишешь в issue или discussion, как бы ты это применял. От этого и будут зависеть следующие шаги.

Спасибо, что дочитал. Репозиторий — GitHub, всё остальное — в документации.