
macOS *
Настольная ОС компании Apple
Новости
Аутентификация через биометрию в Kotlin Multiplatform или Koncierge

Наконец-то неплохо продвинувшись в написании своего мультиплатформенного приложения Modern Money мне понадобилась аутентификация для Kotlin Multiplatform.
Хотелось иметь один API для PIN-кода и биометрии, а под капотом использовать Android Biometric Prompt, Windows Hello, Touch ID.
Так появился Koncierge — набор KMP-модулей biometric, auth и auth-compose
Казалось бы, задача довольно стандартная: объявить expect-класс и написать несколько actual-реализаций. На Android это примерно так и получилось. А вот Windows Hello, JVM-модуль и публикация всех артефактов заставили немного разобраться в том,
После многих лет борьбы я получил ещё один шанс: Deep Brain Stimulation — Abbott Libberta RC

Меня зовут Станислав Герасимов. Я программист С++/Qt, а также Go и выпускник магистратуры НИУ ВШЭ. С детства живу с тяжёлым неврологическим заболеванием — вторичной генерализованной дистонией с выраженными гиперкинезами. После многих лет лечения, нескольких нейрохирургических операций и многочисленных отказов в дальнейшем лечении в России я прошёл повторную операцию глубокой стимуляции мозга (DBS) в Турции у профессора Аттилы Йылмаза. На этом сайте я делюсь своей историей, рассказываю о лечении, программировании DBS, реабилитации, жизни с неврологическим заболеванием, а также о работе в сфере информационных технологий. Надеюсь, мой опыт окажется полезным и поддержит тех, кто также продолжает бороться за своё здоровье и качество жизни.
[Pet project] 90% людей забывают, о чём договорились на созвоне. Я же экономлю часы каждую неделю

Мы привыкли думать, что после хорошего созвона все участники понимают одно и то же: что решили, кто что делает и какие следующие шаги. На практике это почти никогда не так. В одном из исследований памяти разговоров участники через неделю после беседы смогли совпасть в воспоминаниях друг с другом лишь по 4,7% деталей разговора. То есть два человека, которые были на одном и том же созвоне, спустя время помнили практически разные версии событий. При этом люди, которые фиксировали информацию сразу после разговора, сохраняли значительно больше деталей (источник: Cognitive Science — Memory for conversations). Проще говоря, каждый уносит с встречи свою версию происходящего.
В рабочей среде это особенно заметно. Мы проводим десятки встреч, обсуждаем решения, договариваемся о следующих шагах - а потом тратим время, пытаясь восстановить контекст по чатам и обрывкам воспоминаний.
Именно это и подтолкнуло меня начать записывать встречи и в итоге привести к небольшому pet-проекту, который неожиданно начал экономить мне часы каждую неделю.
«Четыре шага — и точка» Я сам придумал главное ограничение своего приложения

Пару недель назад я рассказывал здесь, как три ночи чинил рендер, который не был сломан. С тех пор в главном ничего не изменилось: я по-прежнему энтузиаст, а не разработчик; код печатает машина, а что и зачем печатать, решаю я. Правда, машин в этот раз было две: код писала Claude Opus 4.8 в режиме ultracode с рассуждением, выкрученным на максимум (xhigh), а вторая — Fable 5 — атаковала приложение. Об этом ближе к концу. Изменилось всё остальное. Typhoonminigen — бесплатное open-source (MIT) нативное macOS-приложение для локальной генерации FLUX.2 Klein на Apple Silicon, без Python, без ComfyUI, без облака — доросло до версии 2.0: 57 новых функций, 150+ исправлений. Про них и статья. Но начать придётся не с функций, а с признания: самый живучий баг приложения сидел не в коде. Он сидел во мне.
Настоящий Liquid Glass, как у системного HUD на macOS 26, через приватные API
Я хотел сделать маленькую OSD-панель яркости на macOS так, чтобы она выглядела как системный HUD: не просто полупрозрачная плашка поверх обоев, а нормальное стекло, через которое видно и немного преломляется рабочий стол. По дороге выяснилось неприятное: SwiftUI .glassEffect для такой задачи не подходит вообще, публичный NSGlassEffectView даёт только половину результата, а вид, близкий к системному HUD, появляется уже после ковыряния приватного CAFilter glassBackground. Ниже — весь путь, с кодом, ошибками и местами, где я сам сначала чинил не то
Хардкорная агентская разработка под iOS, часть 1: отдельный Mac Mini для агентов

Агентская разработка развивается семимильными шагами. Но не всё идёт так радужно, как хотелось бы. Например, ИИ-агенты по умолчанию заваливают разработчика вопросами: а можно я сделаю вот так? а если скриптик написать? а можно я на гитхаб схожу? а можно я соседний проект гляну?
Это приводит к consent fatigue — я не раз ловил себя на мысли, что я уже давно только и делаю, что жму “allow”, “allow everytime”, редко вникая в суть того, что спрашивает агент, но полностью доверить агенту делать всё, что ему заблагорассудится, мне как-то боязно. Всё-таки на основном макбуке много личных и рабочих данных, которые агент может случайно (или через prompt injection) удалить или слить в сеть. Стрёмно. Поэтому я какое-то время играл в игру “я типа читаю, что ты у меня спрашиваешь”.
Хотя правильное решение — запуск агента в режиме YOLO (в случае claude — с флагом --dangerously-skip-permissions). И тогда при правильной постановке задачи агент может часами сам работать и делать то, что нужно, уведомляя меня только по выполнении.
Это первая статья цикла. Здесь — базовая настройка Mac Mini и вся возня с SSH, чтобы YOLO-агент работал на отдельной машине без ручного ввода паролей и переживал разрывы сети. Специфику iOS-разработки (git worktree, параллельное тестирование, idb, прогон приложения, грабли симулятора и прочее) я вынес в следующие части, так что статья будет полезна не только iOS-разработчикам, но и всем, кто хочет запускать YOLO-агентов и не париться о безопасности. С некоторыми оговорками, разумеется, подробности ниже.
Как я решил проблему ввода спецсимволов без запоминания кучи клавиатурных сокращений
Ввод специальных символов с клавиатуры начинает вызывать боль, как только вы пытаетесь выйти за рамки предустановок в системе. В итоге степень числа проще написать как ^2, а градус заменить словом не потому что так правильно, а потому что иначе приходится вспоминать Alt-коды, переключать раскладки, копировать символы из интернета или держать в голове комбинации клавиш.
По большому счету проблема не в самих символах, а в способе доступа к ним.
Типографские раскладки решают эту задачу через клавиатуру: добавляют новые комбинации и позволяют вводить символы напрямую. Подход рабочий, но не всегда удобный. Горячие клавиши могут конфликтовать с программами или системными сочетаниями. Раскладки зависят от языка ввода. Установка и перенос настроек тоже добавляют лишний слой сложности.
Я решил подойти к той же задаче проще. Помимо прочего функционала в программе KeyRay я добавил возможность автоматической замены текста.
Что такое Apple Declarative Device Management?

В рамках WWDC 2026, а если быть точнее, то в ролике What’s new in managing Apple devices, инженер Device Management team, Cyrus Daboo, заявляет о том, что "Declarative Device Management уже здесь" и используется в продакшене для управления парками корпоративных устройств Apple по всему миру.
Что касается классического MDM, то ранее компания Apple уже обозначала некоторые команды MDM как Deprecated, например, ScheduleOSUpdate, которая отвечает за установку обновлений macOS. Информацию об этой команде уже не найти на сайте Apple Developer | Device Management , но она все еще присутствует в репозитории Device management schema data for MDM на Github Apple. В следующей macOS 27 Golden Gate эта команда точно не будет работать, и без функционала DDM установить обновления "тихо и незаметно" не получится. В системе пока еще присутствует терминальная команда softwareupdate, но там есть нюансы, о которых можно прочитать в одной из статей, опубликованной в корпоративном блоге Ринго на Хабре.
Меняем Punto Switcher на macOS: открытый код, ноль телеметрии и ноль зависимостей — в обоих смыслах

Если серьёзно — зависимостей у RuSwitcher действительно ноль: только системные фреймворки и чистый Swift, никакой телеметрии и ничего постороннего в Package.swift. Но начнём с боли.
Если вы пишете на двух языках, то знаете эту боль: набрал полстроки, поднял глаза — а там ghbdtn вместо «привет». На Windows эту проблему закрывает Punto Switcher. А на macOS? Его Mac‑версию Яндекс забросил ещё в 2017-м, да и у самого Punto хватает «сюрпризов»: встроенный кейлоггер‑«дневник», телеметрия, навязывание Яндекс‑сервисов и закрытый код. Мне хотелось простого, открытого и без слежки — поэтому я написал своё: RuSwitcher, лёгкий переключатель раскладки в меню‑баре. Open source (MIT), ноль зависимостей, ноль телеметрии.
В статье — как это устроено внутри: перехват клавиатуры через CGEventTap, динамический маппинг любых двух раскладок через UCKeyTranslate, и отдельно — раздел «грабли», включая историю про то, как я случайно выложил релиз, где DMG назывался 2.1.0, а внутри лежала сборка 2.0.3.
Запретный 3ds Max на Mac mini M4: 1 час 21 минута на интерьер

Autodesk не рекомендует 3ds Max на Apple Silicon. Я всё равно завёл 3ds Max 2022 + Chaos Corona 15 на Mac mini M4 через Parallels и отрендерил интерьер на CPU за 1 час 21 минуту. Внутри: полный порядок установки, фикс лагов вьюпорта, обход ошибки AVX2 и честные замеры.
Картинки рвало полосами, а файлы при этом были чистыми

Три ночи я был уверен, что у меня сломан рендер.
Вертикальные картинки — те самые 9:16, под обои телефона и под сторис, — на экране разъезжались горизонтальными полосами. Как будто старый телевизор поймал помехи. Квадрат рисуется нормально. Горизонталь — нормально. А вертикалку рвёт в труху.
Три раза я её «починил». И все три раза чинил вообще не то.
Правда оказалась дурацкой и красивой одновременно: файлы были в полном порядке. Рвало только то, как macOS показывала их на экране. Но к этому моменту я уже немного поседел.
Это не история из серии «смотрите, какой я молодец». Это честный рассказ, как обычный человек без программистского образования за неделю собрал себе на Mac локальный генератор картинок — и на какие грабли наступил по дороге. Я энтузиаст, не разработчик. И сразу самое важное, чтобы потом не было неловко: я не написал ни одной строчки кода. Ни единой. Даже Xcode толком не открывал. Код писал вместе со мной Claude Code, модель Opus 4.8. И сам движок генерации — тоже не мой. А моё во всём этом — то, что движок не топит ваш Mac и не показывает вам битые картинки. Звучит мелко? Вот про эту мелочь и весь рассказ. Прятать тут нечего, про границы расскажу честно прямо сейчас.
Почему rsync ≠ гарантия целостности данных. Как я проверяю бэкапы и нахожу расхождения

Работа с rsync и многими другими утилитами для бэкапирования несёт в себе совершенно не очевидную и от этого особенно недооценённую опасность — риск получить рассинхронизацию содержимого файлов, о которой никто и никогда не узнает до того, пока не станет поздно. Статья задумана как рассказ об очень интересной, но малоизвестной утилите precizer. С её помощью можно контролировать целостность данных при синхронизации, бэкапировании или восстановлении файлов. Программа вполне удобно организована и позволяет убедиться, что ни один байт не был утерян в процессе.
Основано на реальных событиях (обожаю этот жанр кино!)
Учитывая просто отвратительную надёжность современных HDD, статья описывает ставшую уже тривиальной борьбу с последствиями выхода HDD из строя.
Материал разделён на несколько глав, пестрящих избыточными техническими подробностями с целью обосновать, почему было принято именно такое решение, а не иное. Возможно, читателям такая архитектура покажется полезной и удобной, и возникнет непреодолимое желание повторить, но сделать ещё лучше! В тексте будет много IMHO, эмоций и попыток плоско пошутить. Гарантирую!
Кому интересен ответ только на главный вопрос, можно сразу перейти к практике использования программы precizer.
Выделенный жирным текст можно читать отдельным слоем и получить краткое представление о затронутых темах.
Ближайшие события
jumie — локальный ИИ ассистент в терминале

Все мы любим терминал. Но мало кто помнит наизусть все флаги команды find или как правильно распаковать хитрый архив без гугла. Данный инструмент может помочь избежать данной рутины.
Вики врёт, прод молчит: почему пора сделать OpenAPI единственным источником правды о вашем API

Я мобильный разработчик. Иногда при работе со структурами данных я имею дело с endpoint-ами, иду в вики, нахожу страницу с описанием — и не верю ей. Потому что по опыту знаю: страница описывает API таким, каким он был задуман полгода назад, а не таким, какой он сейчас. Дальше начинается знакомый ритуал: пишу в чат бэкендеру, он отвечает «глянь в сваггере», сваггер сгенерирован из аннотаций и показывает приблизительную картину, реальный ответ с сервера от неё отличается, потому что правило сериализации живёт в одном месте, а правило генерации описания — в другом. В итоге я делаю то, что делает большинство клиентских разработчиков: дёргаю endpoint «вживую», смотрю реальный JSON и верю только ему. То же самое бывает и при работе с внешними API (в том числе и солидных компаний).
Это и есть проблема источника правды. У нас не один источник, а несколько, и они конкурируют. Вики — это намерение. Код бэкенда — это реализация. Реальный трафик — это факт. И когда между ними возникает расхождение (а оно возникает всегда), цена ошибки ложится в первую очередь на потребителя API: на фронтенд, на iOS, на Android, на десктоп, на внешних интеграторов.
Эту боль на Habr описывали многие. Алексей, Java-разработчик ЮMoney, в статье «Как улучшить межсерверное взаимодействие и сэкономить время разработчика» формулирует её предельно прямо: «Swagger UI, который генерируется автоматом по метаданным классов, показывает очень примерное описание того, что у нас реально отдаётся из API. Поэтому фронты и мобильные разработчики не могут начать разработку, не вызвав endpoint на живую». Это не чья-то личная неаккуратность — это структурный изъян процесса, в котором правда не централизована.
StillCore — мониторинг чипа для Mac, который я всегда хотел

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

Если вы работаете в большой компании и одновременно живёте там, где есть какие-то региональные ограничения на сервисы, у вас почти наверняка две VPN-конфигурации:
рабочая — для доступа к внутренним ресурсам (GitLab, Jira, Confluence и т.д.)
личная — для личных целей
И постоянное переключение между ними — это, мягко говоря, неудобно.
Живые обои на Mac своими руками: Metal, окна на уровне рабочего стола и немного математики

Я сделал приложение NeonDrift — живые обои для macOS на основе Metal-шейдеров. Для базовой работы не нужны сторонние библиотеки, Screen Recording или Accessibility-доступ. Только AppKit, MetalKit и SwiftUI.
В статье разберу как это устроено изнутри: от трюка с уровнями окон до шейдеров и упаковки в .app. Попутно расскажу про баги, которые я поймал в процессе — растянутую плазму на Retina, крэш при первом же запуске упакованного приложения, анимацию, которая сбрасывалась при каждом переключении Space, и фризы на втором мониторе при смене Space на основном.
Главная идея статьи не в том, чтобы сделать ещё один wallpaper app, а в том, чтобы показать как на macOS можно аккуратно совместить AppKit window management, Metal render loop и SwiftUI-настройки без приватных API — и где именно этот подход начинает трещать по швам.
Видео → текст → саммари. Ставим транскрибацию на Mac

Транскрибируем любое видео локально, прямо на Mac. Бесплатно, приватно, с качеством на уровне платных сервисов. Полный гайд: настройка, скрипт и промпт для саммари
Обновление macOS для инженеров поддержки

В этой статье разберём, как правильно подходить к обновлению macOS в корпоративной среде. Материал будет особенно полезен инженерам поддержки: рассмотрим ключевые моменты, на которые стоит обратить внимание до обновления, как грамотно организовать сам процесс и что необходимо проверить после установки новой версии системы.
На первый взгляд обновление Mac — задача довольно простая. Однако в корпоративной инфраструктуре всегда есть нюансы, игнорирование которых может привести к серьёзным последствиям: от дополнительного времени на траблшутинг до необходимости отката системы из резервной копии. В худшем случае устройство можно превратить в «кирпич», например, если начать обновление MacBook...
