Сейчас сделаю приложение и заработаю на нем. АХАХАХАХАХ, удачи

За полгода я сделал мобильное приложение, получил 2000 установок и… 8 платных подписок по $6. Причем одна из подписок — моя.

За полгода я сделал мобильное приложение, получил 2000 установок и… 8 платных подписок по $6. Причем одна из подписок — моя.

Меня зовут Максим, я Android-разработчик в команде дизайн-системы «БКС Мир инвестиций». В 2025 году у нас шёл большой редизайн: компонентная библиотека росла, команды подключали новые Compose компоненты, а вместе с этим быстро рос и объём UI-тестов.
Для команды это быстро стало не абстрактной инженерной задачей, а вопросом скорости и стабильности разработки. Нужно было дать тестировщикам единый способ находить компоненты на экране и проверять их состояние, не заставляя разработчиков вручную поддерживать одинаковую тестовую разметку в каждом компоненте.
Эта статья про то, как мы решили задачу через Kotlin IR Compiler Plugin. Снаружи решение выглядит почти незаметно: разработчик ставит одну аннотацию, а на этапе компиляции компонент автоматически получает стабильный testTag и тестовые semantics, собранные из его state. В результате у команды стало меньше бойлерплейта в компонентах, меньше риска рассинхронизации между state и тестами, а экранные UI-тесты получили более устойчивый контракт работы с дизайн-системой.
Я разрабатываю PWA для голосовой практики английского. Несколько раз пытался опубликовать его в RuStore через Trusted Web Activity (TWA) — Google-обёртку, которая упаковывает PWA в подписанный Android AAB. После четырёх отказов модерации я понял, что для моего класса приложений TWA в RuStore не работает, и за день переключился на Telegram Mini App.
Эта статья — не история стартапа, а разбор технических решений:

Вообще‑то, я бэкендер последние лет 20, но недавно остался без работы (и AI тут не причём), решил «замутить» свой «стартап», пока ищу новую работу Java‑программиста. А заодно подтянуть новые технологии, поглубже изучить немецкий и английский и немного развеяться…
Писать приложения под iOS было моим хобби последние лет 10, и пару моих приложений до сих пор постоянно висят в топе в Российском AppStore, но это были всё «игрушки», а захотелось сделать что‑то взаправду стоящее, и так возникла идея написать лучшее (ни больше ни меньше) приложение для изучения языков с помощью аудирования. Точнее, товарищ подсказал идею. А ещё точнее — идея давно была реализована под Андроид, но аналогов под iOS нет, а очень хотелось. И мне, и товарищу:). Да и смартфона с андроидом у меня нет и никогда не было, не судите строго, но не люблю я вирусы и глюки.
Идея следующая: берёте любое аудио на любом нужном вам языке, загружаете в приложение, и оно автоматически (можно так же вручную) разбивает аудиофайл на нужные вам сегменты для «шэдоуинга», аудирования, многократного прослушивания и тому подобного. Аналогов в сторе я не нашёл, точнее, что‑то отдалённо похожее там есть, но без своих настроек, без выбора своего контента для изучения, без красивой визуализации аудио, короче, без всего того, что нам бы хотелось иметь.
Итак, идея есть, какие технологии использовать? В старых моих приложениях был UIKit, Realm/CoreData, и, сториборды. Не судите строго, я как бэкэндер тогда не знал, что использование сторибордов среди «трушных» айосников считается плохим тоном и плохой приметой. Но теперь‑то я решил использовать современные технологии! И выбрал такой стэк: SwiftUI, SwiftData, Speech Framework. Что касается последнего, то он вроде бы доступен ещё с iOS 10, но я решил, что технологии развиваются, и распознавание текста из аудио должно было бы сделать со времени iOS 10 огромный рывок вперёд. Но теперь я не так сильно в этом уверен, и об этом эта моя маленькая статья…

Рано или поздно каждый Android‑разработчик сталкивается с задачей «одно приложение — много сборок»: white‑label‑решения, региональные версии, отдельные сборки для разных магазинов приложений, демо для клиентов, внутренние окружения.
Встроенный механизм product flavors в Android Gradle Plugin отлично справляется со своей задачей — пока количество вариантов умещается в голове и в паре экранов build.gradle.kts.
В этой статье я разберу подход, при котором конфигурация flavors строится динамически: список вариантов и их параметры живут вне build.gradle.kts.

Когда производительность начинает иметь значение
По производительности Rust находится в той же лиге, что и C++, но с заметно более дружелюбной моделью безопасности. Возможно, вы уже слышали о командах, которые постепенно переходят на Rust, заменяя существующий код. А если вам уже приходилось бороться с лагами от GC или пытаться сделать плавную анимацию, отсутствие сборщика мусора начинает выглядеть особенно заманчиво.
Но можно ли сделать так, чтобы использовать Rust внутри приложения .NET для Android, iOS, MacCatalyst и Windows было действительно удобно?

Привет, Хабр! На связи Анна, лидер Flutter-команды Friflex, и Роза, Flutter-разработчица Friflex. Эта статья о том, как мы убираем лишнюю рутину в VSCode. Расскажем про полезные расширения и поделимся списком шорткатов, которые помогают быстрее искать, править и перемещаться по коду.

Привет, меня зовут Саша, я ведущий специалист технической поддержки по услугам ИБ. Однажды я решил, что мне обязательно нужен свой пет-проект, ну или как минимум какое-то хобби, которым можно заниматься в свободное время.
Первым делом на ум, конечно же, пришло программирование. Создать небольшое приложение «для себя» можно не погружаясь в тонкости работы языков и фреймворков, а для старта – это именно то, что нужно.
В своей работе я часто использую Python, однако код, который я на нем пишу, предназначен для автоматизации задач по обработке данных, запускается в терминале и не предусматривает прямое взаимодействие с пользователем через интерфейс. Полноценному приложению необходим понятный интерфейс, а для его создания нужны дополнительные инструменты.
В этой статье я хочу познакомить вас с Python-фреймворком, который, на первый взгляд, может показаться достаточно специфичным, но притом отлично подойдет новичкам и любителям, делающим первые шаги в сфере разработки приложений.
Давайте вместе разберемся — что же такое Kivy?

Нестабильное позиционирование — не только пользовательская проблема, но и для нас как разработчиков картографического сервиса. Когда спутники теряются или данные становятся неточными, рушится целая цепочка: от отображения местоположения на карте до построения маршрута и поведения навигатора.
А источников ошибок много — плотная застройка, подземные парковки, тоннели и зоны с нестабильным сигналом. Чтобы приложение оставалось рабочим даже в таких условиях, мы стараемся улучшить систему позиционирования. Ниже рассказываем про работу с геопозицией и что сделали, чтобы приложение оставалось рабочим, даже если сигнал пропал.

Привет, я Максим Королев из Петрович-Теха, цифрового партнера сети строительных магазинов «Петрович». Компания специализируется на продаже стройматериалов, комплектации крупных объектов и комплексном обслуживании, включая доставку и подъем на этаж. В первой статье рассказывал, как мы сделали семейство Telegram-ботов для ITSM, во второй — как вынесли бизнес-логику «Дежурного» в CORE и подключили MAX.
Сегодня про совсем другой бот и другую задачу. Не про инциденты и дежурных, а про мобильные бригады подъёма товаров заказчику и то, как сделать их работу ещё удобнее и прозрачнее без дорогого мобильного приложения.

В новом дайджесте уход Тима Кука и ненависть к Gboard, диск выбора месяца в стиле Airbnb и анимация зачеркивания текста в SwiftUI, основы разработки приложений для iOS, приватность в обычной клавиатуре, Kotlin-агент широкого профиля KMP, атаки мобильных приложений глазами хакера, рост релизов в App Store и Google Play и многое другое. Заходите!

Написал полностью офлайновый голосовой ввод на русском для Android. Никаких серверов, подписок и привязок к аккаунтам. За распознавание отвечает открытая нейросеть GigaAM v3 от Сбера: модель зашита прямо в APK, работает без интернета и отлично расставляет знаки препинания.
Главная фишка — не нужно отказываться от любимой клавиатуры со свайпом. Это не замена Gboard, а просто плавающая кнопка, которая появляется поверх любого поля ввода. Работает элементарно: тапнул — говоришь. Как только делаешь естественную паузу в речи, готовый текст тут же влетает в активное окно. Напрямую, минуя буфер обмена.
Стек: GigaAM v3 + sherpa-onnx (NNAPI / CPU) + крошечный детектор речи Silero VAD. Требования: Android 13+, ARM64. Исходники открыты (MIT).

Привет. Полгода назад я выложил singbox-launcher — десктопный GUI для управления ядром sing-box. По фидбеку стало понятно: идея зашла, людям удобно собирать и отлаживать конфиги на ноутбуке, а потом переносить их на роутеры и другие сетевые устройства. Подробнее о десктопной версии я писал на Хабре.
Пару слов для тех, кто не в контексте. Есть небольшой класс кроссплатформенных сетевых ядер, которые умеют гибкую маршрутизацию трафика и поддерживают современный набор протоколов: WireGuard, VLESS, SOCKS5, Shadowsocks, Hysteria2, TUIC и так далее. Sing-box в этом списке — не самый раскрученный, но для меня он оказался наиболее интересным: быстрая эволюция, внимание к деталям, чистый код, живое общение мейнтейнеров с пользователями, классно организованный по логике конфиг.
Довольно быстро стали приходить запросы на Android-порт. Первое время казалось, что это будет прямое переиспользование десктопного кода. На практике сценарии потребления на мобильных оказались сильно другими: другой UX, другой lifecycle, Doze и background-лимиты, OEM-специфика, ограниченный экран, другие ожидания от автозапуска и обновлений. В итоге пришлось переписать практически всё с нуля.
Результат этой работы — LxBox, и сегодня я хочу рассказать, чем он отличается от существующих Android-клиентов и как устроен изнутри.

В прошлой статье я сравнивал Paginator с Paging 3 на кошачьем уровне: «вот простой фид, смотрите — три строки вместо тридцати». Это полезно для первого знакомства, но не отвечает на главный вопрос: а как оно себя поведёт, когда продукт начнёт требовать то, ради чего люди обычно и пишут свой велосипед поверх Paging 3?
В этой статье я беру мессенджер — потому что мессенджер это честный полигон. Там есть:

Не прошло и четыре года, российские аккаунты Apple Developer для разработчиков потеряли свою актуальность. С 1 апреля по поручению Минцифры российские операторы связи отключили возможность пополнения баланса Apple ID с помощью мобильного счета — ограничения внедрили МТС и Билайн, которые оставались своеобразным спасательным кругом как для компаний, так и для физиков — свои сервисы в App Store я до сих пор оплачивал только с помощью специально заведённой для этого симки Билайн (МТС я на дух переношу, и ни за что не стал бы пользоваться им даже если бы не было другого выхода вообще).
Apple официально подтвердила, что обработка платежей в App Store и других сервисах компании в России остановлена. Оставшиеся доступные варианты оплаты — подарочные или иностранные карты — требуют смены региона (как итог, не все нужные приложения становятся доступны для скачивания). Поэтому, можно сказать, что российские аккаунты Apple умерли — для использования доступны теперь только бесплатные приложения и сервисы.
Особенно больно от того, как это повлияло на авторов мобильных приложений и игр — разработчиков с российским аккаунтом Apple Developer. Если в 2022 году Apple отключила монетизацию контента в РФ (в 2023 году правила смягчились. Компания разрешила получать оплату на аккаунты, зарегистрированные в России, но только при условии, что платежи будут совершать исключительно российские пользователи — т.е. работать на зарубежную аудиторию с локальным аккаунтом всё равно оставалось невозможно), то теперь проблем подкинула родина. И теперь, когда даже российские пользователи не могут пополнить баланс Apple ID и оплатить сервис, приложение или игру, работа через российский Apple Developer вообще теряет всякий смысл — только если вы не продвигаете внутри какой-нибудь бесплатный сервис.

Сегодняшние приложения для мобильных и настольных устройств умеют распознавать на изображениях почти что угодно, - от QR-кодов до количества калорий в еде на на фото. На платформах, которые поддерживает .NET MAUI, для этого можно использовать разные варианты, как локальные ML-движки вроде TensorFlow Lite, нативные SDK для конкретной платформы, типа ARKit на iOS, так и разные Vision API. Далее все зависит уже от реализации в приложении.
И вот, когда речь идет пойдет о распознавании изображений от камеры, наш вариант - пакет DrawnUi.Maui.Camera. В предыдущей статье я показывал, как использовать SkiaCamera для анализа аудио с AI в реальном времени, а сегодня займемся видео: разберем на примере распознавания лиц.

За последний год я перепробовал всё: Cursor, Claude Code, Codex, локальные Qwen-модели для ревью, пять версий своего CLAUDE.md, Xcode MCP от Apple, mobile-mcp, Conductor для параллельных агентов. Что-то осталось в проде, что-то выкинул через неделю. А какие-то вещи, которые казались обязательными год назад, сегодня выглядят как антипаттерны.
Это статья не про «AI изменит всё» и не про то, как за вечер собрать Todo-приложение через Claude Code. Это про то, как iOS-разработчику, который уже живёт с AI-инструментами, выжать из них максимум - и не наступить на грабли, на которые наступили до тебя остальные.

В последние годы короткие видеоформаты повлияли на ожидания многих пользователей от видеосервисов. Всё чаще зритель рассчитывает, что ролик начнёт воспроизводиться почти мгновенно, а переключение между видео будет происходить без задержек. Однако на стороне разработчика видеоплатформы за таким сценарием стоит немало технических нюансов: если не оптимизировать плеер, бэкенд и процессы кодирования, пользовательский опыт быстро начинает страдать из‑за зависаний и долгого старта воспроизведения.
Привет, меня зовут Рамиль Габдрахманов, я руковожу разработкой видеоплееров в Yandex Infrastructure. Нашу видеоплатформу используют многие сервисы Яндекса: Кинопоиск, Яндекс Маркет, Яндекс Музыка и другие — а компании вне Яндекса могут использовать её через Yandex Cloud Video. В день наш плеер воспроизводит 103 847 867 931 секунду видео.
Сегодня расскажу о том, как устроены ленты коротких видео у нас, что под капотом и какие оптимизации мы применяем.

Когда я начал делать кредитный трекер, казалось, что финансовая математика — самая простая часть проекта. Формула аннуитета есть в любом учебнике, Excel справляется за пять минут.
Я ошибался.
Небольшой контекст: до этого я довольно долго не делал ничего для Android — работал в других областях, экосистема успела заметно измениться. Вернуться оказалось неожиданно приятно: Compose после нескольких лет XML-вёрстки ощущается как глоток свежего воздуха, KSP вместо KAPT работает заметно быстрее, а Room с Flow и корутинами — это уже совсем другой уровень удобства по сравнению с тем, что я помнил. Так что статья отчасти и про это: как выглядит возвращение в Android-разработку после перерыва.
Под катом — технический разбор того, как на самом деле устроен кредитный калькулятор внутри Android-приложения. С реальным кодом, реальными компромиссами и честным признанием того, что мы намеренно упростили.

Если коротко: пагинация — это когда вы не грузите 100 000 товаров из каталога одним запросом, а показываете их страницами по 20–50 штук и подгружаете следующую порцию, когда пользователь домотал до конца.
Звучит как задача на полдня. На практике — по-разному.
Я пишу мобильные приложения уже давно, и каждый раз, когда в новом проекте появлялась пагинация, рядом с ней через месяц-другой появлялся один и тот же набор багов и ad-hoc-решений. Флаги isLoadingNextPage, isLoadingPrevious, isRefreshing, isEmpty, hasError, hasNextPage. Попытки «просто заменить элемент без перезагрузки страницы». Восстановление позиции после убийства процесса. Прыжок на конкретную страницу по deeplink.
На Android есть Jetpack Paging 3, и его берут по умолчанию. Но как только вы выходите за рамки «загрузи следующие 20 элементов на скролле вниз» — начинается интересное. А если ваш проект — Kotlin Multiplatform, то Paging 3 вообще не ваш вариант: это Android-библиотека, она не едет на iOS.
Я расскажу про опенсорсную библиотеку Paginator, которую делаю последние несколько лет. Она работает одинаково на Android, JVM и iOS из одного commonMain, закрывает сложные сценарии из коробки — и даже на самой обычной ленте настраивается короче, чем Paging 3. Это не поход против Paging 3 и не попытка что-то кому-то доказать. Это просто описание того, что есть другой инструмент, и он делает то же самое компактнее.