T.mkv

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

What this is

A personal portfolio + app landing-page site (tyh94.github.io), served as a static Jekyll site on GitHub Pages. It hosts the developer bio and per-app marketing/legal pages (support, privacy, terms) for iOS apps. No build step beyond Jekyll; all pages are hand-written static HTML.

Commands

bundle install              # install gems (jekyll, webrick, jekyll-sitemap)
bundle exec jekyll serve    # local dev server with live rebuild at http://localhost:4000

Deployment is automatic: GitHub Pages builds main on push. There are no tests or linters.

Architecture

Text lives in _data/translations.json

Every page is bilingual (RU, EN) and all user-visible text lives in _data/translations.json ({ "ru": {...}, "en": {...} }). assets/js/main.js has empty front matter, so Jekyll processes it and inlines that file as the translations object ({"ru":{"nav.about":"Обо мне","nav.apps":"Приложения","nav.contact":"Контакт","nav.home":"← На главную","nav.title":"Татьяна — iOS Разработчик","hero.eyebrow":"Senior iOS Developer","hero.role":"8+ лет в iOS разработке","hero.desc":"Разрабатываю нативные iOS-приложения с 2016 года. Работала в Movavi, Новотелеком, Improve Digital и Сбере. Сейчас строю собственные продукты.","hero.btn.apps":"Мои приложения","hero.btn.contact":"Написать","hero.name":"Татьяна Макеева","about.label":"Обо мне","about.title":"iOS-инженер<br>из Новосибирска","about.p1":"Начала карьеру в 2016-м в Movavi — делала мобильный видеоредактор на Objective-C. Постепенно переходила от рядового разработчика к тимлиду: в Improve Digital руководила ревью четырёх iOS-разработчиков.","about.p2":"С 2020 года в Сбере, в команде SberDevices — разрабатываю голосовой помощник. Пишу unit- и snapshot-тесты, профилирую retain-циклы, настраиваю AVAudioSession.","about.p3":"Параллельно делаю собственные приложения: «Пеку по шагам» и «Дневник питания семьи» уже в App Store, а «Дневник питания семьи» есть ещё и в RuStore.","apps.label":"Продукты","apps.title":"Мои приложения","page.screens.h":"Скриншоты","soon":"Скоро","sc.name":"Пеку по шагам","sc.cat":"Кулинария · iOS","sc.desc":"Умный помощник для домашней выпечки на закваске и на дрожжах. Live Activity и Dynamic Island таймеры, пошаговые рецепты, уведомления.","sc.page.title":"Пеку по шагам — помощник пекаря","sc.page.sub":"Умный помощник для домашней выпечки: хлеб на закваске и на дрожжах, выпечка на остатках закваски. Управляйте этапами, таймерами и рецептами — не пропустите ни одного шага.","sc.page.about.h":"О приложении","sc.page.about.p":"«Пеку по шагам» помогает домашним пекарям пройти каждый этап выпечки — на закваске, на дрожжах или на остатках закваски.","sc.page.f1":"Пошаговые сценарии выпечки","sc.page.f2":"Таймеры ферментации и расстойки","sc.page.f3":"Live Activities и Dynamic Island","sc.page.f4":"Управление рецептами","sc.page.f5":"Локальные уведомления","sc.page.links.h":"Ссылки","sc.page.support":"Поддержка","sc.page.privacy":"Политика конфиденциальности","sc.page.perms.h":"Разрешения","sc.page.perms.p":"Приложение запрашивает разрешение на уведомления — только чтобы напомнить об окончании таймера выпечки. Рецепты по желанию можно хранить в Google Drive или на Яндекс Диске: файл рецептов лежит в выбранной вами папке вашего аккаунта, разработчик доступа к нему не имеет. Подробнее — в <a href=\"privacy/\">политике конфиденциальности</a>.","sc.page.terms":"Условия использования","contact.label":"Контакт","contact.title":"Давайте<br><span>поговорим</span>","contact.sub":"Открыта к вопросам, коллаборациям и разговорам о Swift, архитектуре или хлебе на закваске.","footer.copy":"© 2026 Татьяна Макеева","sc.tos.s8.p":"Есть вопросы? Свяжитесь с нами через <a href=\"../support/\">страницу поддержки</a>.","sc.support.nav.title":"Поддержка","sc.support.back":"← Пеку по шагам","sc.support.page.title":"Поддержка — Пеку по шагам","sc.support.label":"Помощь","sc.support.title":"Поддержка","sc.support.sub":"Ответы на частые вопросы о приложении «Пеку по шагам». Если не нашли нужного — напишите мне напрямую.","sc.support.q1":"Таймер не отображается на Dynamic Island — что делать?","sc.support.a1":"Убедитесь, что уведомления разрешены для приложения: Настройки → Уведомления → Пеку по шагам. Live Activity работает только на iPhone 14 Pro и новее.","sc.support.q2":"Можно ли изменить длительность таймера?","sc.support.a2":"Да! Нажмите на иконку карандаша рядом с таймером, чтобы задать нужные часы и минуты.","sc.support.q3":"Приложение не присылает уведомление по окончании таймера","sc.support.a3":"Проверьте, что уведомления для приложения включены. Если телефон в режиме «Не беспокоить», уведомления могут быть заблокированы системой.","sc.support.q4":"Мои данные в безопасности?","sc.support.a4":"Полностью. Все данные хранятся только на вашем устройстве. Мы не собираем никакую информацию о вас.","sc.support.contact.h":"Остались вопросы?","sc.support.contact.p":"Напишите мне — постараюсь ответить в течение 24 часов.","sc.support.contact.btn":"Написать письмо","sc.privacy.nav.title":"Политика конфиденциальности","sc.privacy.back":"← Пеку по шагам","sc.privacy.page.title":"Политика конфиденциальности — Пеку по шагам","sc.privacy.label":"Юридическое","sc.privacy.title":"Политика конфиденциальности","sc.privacy.updated":"Последнее обновление: 1 октября 2026 г.","sc.privacy.h1":"Какие данные хранятся","sc.privacy.p1":"Рецепты, ход выпечки, таймеры и настройки. Всё это хранится на вашем устройстве. Разработчик не собирает эти данные и не получает к ним доступа.","sc.privacy.h2":"Облачное хранилище","sc.privacy.p2":"По желанию рецепты можно хранить в Google Drive или на Яндекс Диске — например, чтобы пользоваться ими на нескольких устройствах или вести общую книгу рецептов с близкими. Приложение хранит там файл <code>recipes.json</code> в выбранной вами папке. Файл лежит в вашем личном аккаунте, разработчик доступа к нему не имеет и копий у себя не хранит.","sc.privacy.h3":"Данные из Google","sc.privacy.p3":"Если вы выбрали хранилищем Google Drive, приложение запрашивает доступ к вашему Google Диску (разрешение <code>https://www.googleapis.com/auth/drive</code>). Полный доступ нужен, чтобы вы могли выбрать для рецептов существующую папку — в том числе папку, которой с вами поделился другой человек.<br><br>Приложение использует этот доступ только для того, чтобы: показать список папок для выбора; создать папку и файл рецептов в ней; читать и обновлять этот файл. Другие файлы на вашем Диске приложение не читает, не изменяет и не удаляет.<br><br>Данные с Google Диска обрабатываются только на вашем устройстве. Они не передаются разработчику или третьим лицам, не продаются, не используются для рекламы и для обучения моделей ИИ. Токен доступа хранится в защищённом хранилище устройства. Отозвать доступ можно в любой момент на странице <a href=\"https://myaccount.google.com/permissions\">myaccount.google.com/permissions</a>.<br><br>Использование и передача приложением Sourdough Cooker информации, полученной от Google API, соответствует <a href=\"https://developers.google.com/terms/api-services-user-data-policy\">Google API Services User Data Policy</a>, включая требования Limited Use.","sc.privacy.h4":"Импорт рецептов","sc.privacy.p4":"Текст рецепта, который вы вставляете для импорта, разбирается прямо на устройстве — встроенной моделью Apple или локальным разборщиком. На серверы разработчика или сторонним сервисам ИИ он не отправляется. Если разбор не удался, вы можете сами отправить разработчику отчёт по электронной почте: в письмо попадут вставленный текст и версия приложения, и вы увидите его перед отправкой.","sc.privacy.h5":"Каталог рецептов","sc.privacy.p5":"Приложение скачивает общедоступный каталог рецептов с GitHub. При этом никакие ваши данные не передаются — это обычная загрузка файла.","sc.privacy.h6":"Уведомления","sc.privacy.p6":"Приложение запрашивает разрешение на отправку локальных уведомлений для напоминания о таймерах. Эти уведомления создаются на устройстве и не передаются на сервер.","sc.privacy.h7":"Аналитика","sc.privacy.p7":"Мы не используем сторонние сервисы аналитики и отчётов о сбоях. Никакие данные о вашем поведении в приложении не отслеживаются.","sc.privacy.h8":"Дети","sc.privacy.p8":"Разработчик не собирает персональные данные — ни у взрослых, ни у детей. Приложение не относится к категории App Store «Дети» и не предназначено для сбора данных пользователей младше 13 лет. Возрастной рейтинг 4+ означает, что содержимое подходит для любого возраста.","sc.privacy.h9":"Изменения в политике","sc.privacy.p9":"Если политика изменится, новая версия будет опубликована на этой странице с обновлённой датой.","sc.privacy.h10":"Контакт","sc.privacy.p10":"По любым вопросам о конфиденциальности пишите на:","sc.tos.title":"Условия использования","sc.tos.updated":"Последнее обновление: 1 октября 2026","sc.tos.back":"← Пеку по шагам","sc.terms.title":"Условия использования — Пеку по шагам","sc.tos.s1.h":"1. Принятие условий","sc.tos.s1.p":"Загружая или используя приложение «Пеку по шагам», вы соглашаетесь с настоящими Условиями использования. Если вы не согласны, пожалуйста, не используйте приложение.","sc.tos.s2.h":"2. Описание сервиса","sc.tos.s2.p":"«Пеку по шагам» — помощник по домашней выпечке для iPhone. Приложение помогает управлять рецептами, отслеживать таймеры ферментации и следовать пошаговым инструкциям.","sc.tos.s3.h":"3. Облачное хранилище","sc.tos.s3.p":"Приложение предлагает опциональное хранение рецептов в Google Drive или на Яндекс Диске. Для этого нужен вход в соответствующий аккаунт. Для Google Drive приложение запрашивает доступ к Диску, чтобы вы могли выбрать папку, в том числе папку, которой с вами поделились; работает приложение только с файлом рецептов в этой папке. Подробнее — в <a href=\"../privacy/\">политике конфиденциальности</a>. Отозвать доступ можно в любой момент в настройках аккаунта.","sc.tos.s4.h":"4. Пользовательский контент","sc.tos.s4.p":"Рецепты и данные о выпечке, созданные вами в приложении, принадлежат вам. Данные хранятся локально на устройстве. Резервное копирование в облако — опционально и под вашим контролем.","sc.tos.s5.h":"5. Ограничения использования","sc.tos.s5.p":"Вы соглашаетесь не злоупотреблять приложением, не пытаться осуществить его реверс-инжиниринг и не использовать его способами, нарушающими применимое законодательство.","sc.tos.s6.h":"6. Отказ от ответственности","sc.tos.s6.p":"Приложение предоставляется «как есть», без каких-либо гарантий. Мы не несём ответственности за потерю данных или ущерб, возникший в результате использования приложения.","sc.tos.s7.h":"7. Изменения","sc.tos.s7.p":"Мы можем периодически обновлять настоящие условия. Продолжение использования приложения после внесения изменений означает принятие новых условий.","sc.tos.s8.h":"8. Контакты","ffd.name":"Дневник питания семьи","ffd.cat":"Питание и здоровье","ffd.desc":"Дневник питания для всей семьи с анализом калорий, витаминов, минералов и других нутриентов.","ffd.page.title":"Дневник питания семьи — калории, витамины и нутриенты","ffd.page.sub":"Следите за рационом всей семьи. Контролируйте калории, БЖУ, железо, магний, витамины и другие нутриенты.","ffd.page.about.h":"Возможности","ffd.page.about.p":"Удобный способ вести дневник питания для всей семьи и анализировать качество рациона.","ffd.page.f1":"Добавляйте записи для нескольких членов семьи","ffd.page.f2":"Отслеживайте калории, белки, жиры и углеводы","ffd.page.f3":"Контролируйте железо, магний, кальций, витамины и другие нутриенты","ffd.page.f4":"Находите продукты-лидеры по содержанию полезных веществ","ffd.page.f5":"Изучайте статистику и историю питания","ffd.page.why.h":"Почему Дневник питания семьи?","ffd.page.why.f1":"Для всей семьи — ведите записи для себя, детей и близких","ffd.page.why.f2":"Не только калории — анализируйте десятки витаминов и минералов","ffd.page.why.f3":"Ваши данные остаются у вас — хранение на Google Drive или Яндекс Диске","ffd.page.privacy.h":"Ваши данные","ffd.page.privacy.p":"Приложение не использует собственные серверы для хранения данных. Вы сами выбираете, где хранить свой дневник питания — на устройстве, в Google Drive или на Яндекс Диске. Google Drive используется только для того, чтобы хранить файлы дневника в выбранной вами папке и вести общий дневник с семьёй. Сервер разработчика нужен только «Помощнику приложения»: он передаёт сводку за период языковой модели и ничего не сохраняет. Подробнее — в <a href=\"privacy/\">политике конфиденциальности</a>.","ffd.page.links.h":"Полезные ссылки","ffd.page.support":"Поддержка","ffd.page.privacy":"Политика конфиденциальности","ffd.page.terms":"Условия использования","ffd.privacy.page.title":"Политика конфиденциальности — Дневник питания семьи","ffd.privacy.nav.title":"Политика конфиденциальности","ffd.privacy.back":"← Назад","ffd.privacy.label":"Дневник питания семьи","ffd.privacy.title":"Политика конфиденциальности","ffd.privacy.updated":"Последнее обновление: 24 октября 2026 г.","ffd.privacy.h1":"1. Общие положения","ffd.privacy.p1":"Дневник питания семьи уважает вашу конфиденциальность. Приложение предназначено для ведения дневника питания и не собирает персональные данные для передачи третьим лицам.","ffd.privacy.h2":"2. Какие данные хранятся","ffd.privacy.p2":"Всё, что вы вносите сами: приёмы пищи, продукты и блюда с их составом, статистику питания, а также профили членов семьи — имя, дату рождения и личные нормы по нутриентам.","ffd.privacy.h3":"3. Данные о здоровье","ffd.privacy.p3":"Приложение хранит историю замеров веса и роста для каждого профиля и дату рождения — по ней подбираются возрастные нормы питания. Эти данные хранятся там же, где остальные, и никуда не отправляются, кроме выбранного вами облачного хранилища.","ffd.privacy.h4":"4. Где хранятся данные","ffd.privacy.p4":"Локально на вашем устройстве и, если вы это включили, в выбранном вами облаке — Google Drive или Яндекс Диск. Файлы лежат в вашем личном аккаунте, разработчик доступа к ним не имеет и копий у себя не хранит.","ffd.privacy.h5":"5. Данные из Google","ffd.privacy.p5":"Если вы выбрали хранилищем Google Drive, приложение запрашивает доступ к вашему Google Диску (разрешение <code>https://www.googleapis.com/auth/drive</code>). Полный доступ нужен, чтобы вы могли выбрать для дневника существующую папку — в том числе папку, которой с вами поделился другой член семьи, — и вести в ней общий дневник.<br><br>Приложение использует этот доступ только для того, чтобы: показать список папок для выбора; создать папку дневника и файлы в ней; читать и обновлять эти файлы. Другие файлы на вашем Диске приложение не читает, не изменяет и не удаляет.<br><br>Данные с Google Диска обрабатываются на вашем устройстве. Они не продаются, не используются для рекламы и для обучения моделей ИИ, и разработчик их не хранит. Наружу они уходят только если вы сами запросили разбор рациона у помощника на языковой модели (раздел 7): тогда сводка о питании за период уходит выбранному вами сервису — напрямую или, у «Помощника приложения», через сервер разработчика, который её не сохраняет. Токен доступа хранится в защищённом хранилище устройства. Отозвать доступ можно в любой момент на странице <a href=\"https://myaccount.google.com/permissions\">myaccount.google.com/permissions</a>.<br><br>Использование и передача приложением Family Food Diary информации, полученной от Google API, соответствует <a href=\"https://developers.google.com/terms/api-services-user-data-policy\">Google API Services User Data Policy</a>, включая требования Limited Use.","ffd.privacy.h6":"6. Apple Health","ffd.privacy.p6":"На iPhone синхронизацию веса и роста с приложением «Здоровье» можно включить по желанию — по умолчанию она выключена. Чтение и запись происходят только по вашему действию, доступ выдаётся отдельно на чтение и на запись и отзывается в настройках iOS. Данные из Health остаются на устройстве и в вашем облаке: разработчику они не передаются и в аналитику не попадают.","ffd.privacy.h7":"7. Помощник на основе языковой модели","ffd.privacy.p7":"Разбор рациона можно запросить у языковой модели. Запрос уходит, только когда вы сами выбрали помощника и нажали «Разобрать рацион». Перед отправкой его можно посмотреть кнопкой «Показать запрос» — уходит ровно этот текст: имя профиля, вес, цель (если вы её написали), нормы по нутриентам, приёмы пищи по дням со временем и весом, состав блюд и продуктов за выбранный период.<br><br><strong>Помощник приложения.</strong> Запрос уходит на сервер разработчика, а с него — сервису языковых моделей Ollama, который и формирует ответ. Сервер только передаёт запрос и ответ: их текст не сохраняется, не записывается в журналы и не используется для обучения моделей. В журнале сервера остаются только технические данные: время, адрес запроса и код ответа. Обработка на стороне Ollama регулируется её собственной политикой. Серверы могут находиться за пределами вашей страны. Количество разборов ограничено, счётчик хранится на устройстве.<br><br>Тот же помощник может заполнить состав продукта по названию. Тогда на сервер уходит только название продукта и уточнение, если вы его написали, — без дневника и профиля. Ответы по названию сервер на время запоминает, чтобы не спрашивать модель повторно об одном и том же продукте; с вами они не связаны. Количество заполнений тоже ограничено.<br><br><strong>Свой сервис.</strong> Если вы подключили сервис сами (например, OpenAI, DeepSeek или другой из списка) и указали свой ключ доступа, запрос уходит напрямую этому сервису, минуя разработчика. Обработка на его стороне регулируется его собственной политикой. Ключ доступа хранится в защищённом хранилище устройства и разработчику не передаётся.<br><br>Разбор «Без нейросети» считается на устройстве и никуда данные не отправляет. Не пользуйтесь помощником на языковой модели, если не хотите передавать данные о питании третьей стороне.","ffd.privacy.h8":"8. Аналитика и отчёты о сбоях","ffd.privacy.p8":"Приложение использует Firebase Analytics и Firebase Crashlytics (Google) — обезличенную статистику использования и отчёты об аварийных завершениях: модель устройства, версию ОС и приложения, техническое описание сбоя. Дневник питания, замеры и содержимое профилей в эти отчёты не попадают.","ffd.privacy.h9":"9. Передача данных третьим лицам","ffd.privacy.p9":"Разработчик не продаёт ваши данные и не хранит их у себя. Наружу данные уходят только в трёх случаях, каждый из которых включаете вы сами: облачное хранилище, помощник на языковой модели и Apple Health. Получатель — сервис, которым пользуетесь вы. Исключение — «Помощник приложения»: запрос проходит через сервер разработчика к сервису Ollama и нигде не сохраняется (раздел 7).","ffd.privacy.h10":"10. Разрешения","ffd.privacy.p10":"Камера — только для сканирования штрихкода на упаковке, снимки не сохраняются и никуда не отправляются. Уведомления — напоминания о приёмах пищи. Запуск после перезагрузки — чтобы уже назначенные напоминания не пропали. Доступ к Apple Health — только при включённой синхронизации. Каждое разрешение спрашивается в момент, когда функция действительно нужна, и приложение работает без любого из них.","ffd.privacy.h11":"11. Данные детей","ffd.privacy.p11":"Приложение семейное: профили детей заводит взрослый, и он же отвечает за внесённые данные. Профиль ребёнка ничем не отличается от других — те же локальное хранение и то же облако. Отдельных учётных записей у детей нет, и приложение не собирает их данные самостоятельно.","ffd.privacy.h12":"12. Контакты","ffd.privacy.p12":"Если у вас есть вопросы о политике конфиденциальности, свяжитесь с разработчиком:","ffd.support.page.title":"Поддержка — Дневник питания семьи","ffd.support.nav.title":"Поддержка","ffd.support.back":"← Назад","ffd.support.label":"Дневник питания семьи","ffd.support.title":"Поддержка","ffd.support.sub":"Ответы на часто задаваемые вопросы.","ffd.support.q1":"Можно ли вести дневник для нескольких членов семьи?","ffd.support.a1":"Да. Приложение позволяет хранить данные о питании нескольких членов семьи и быстро переключаться между ними.","ffd.support.q2":"Где хранятся мои данные?","ffd.support.a2":"Данные могут храниться локально на устройстве и в выбранном вами облачном хранилище — Google Drive или Яндекс Диске. Разработчик ваши данные не хранит. Если вы пользуетесь «Помощником приложения», сводка за выбранный период проходит через сервер разработчика к языковой модели и не сохраняется.","ffd.support.q3":"Какие нутриенты поддерживаются?","ffd.support.a3":"Помимо калорий, белков, жиров и углеводов приложение поддерживает витамины, минералы и другие показатели пищевой ценности продуктов.","ffd.support.q4":"Можно ли посмотреть статистику по рациону?","ffd.support.a4":"Да. Приложение показывает статистику питания, помогает отслеживать потребление нутриентов и находить продукты с наибольшим содержанием полезных веществ.","ffd.support.contact.h":"Связаться с разработчиком","ffd.support.contact.p":"Если вы столкнулись с проблемой или хотите предложить улучшение приложения, напишите мне.","ffd.support.contact.btn":"Написать письмо","ffd.tos.back":"← Назад","ffd.terms.title":"Условия использования — Дневник питания семьи","ffd.tos.title":"Условия использования","ffd.tos.updated":"Последнее обновление: 25 июня 2026 г.","ffd.tos.s1.h":"1. Принятие условий","ffd.tos.s1.p":"Используя приложение Дневник питания семьи, вы соглашаетесь с настоящими условиями использования. Если вы не согласны с ними, пожалуйста, не используйте приложение.","ffd.tos.s2.h":"2. Описание сервиса","ffd.tos.s2.p":"Дневник питания семьи — приложение для учёта питания, которое помогает вести дневник приёмов пищи, отслеживать нутриенты и анализировать рацион нескольких членов семьи.","ffd.tos.s3.h":"3. Интеграция с облачными хранилищами","ffd.tos.s3.p":"Приложение поддерживает резервное копирование и синхронизацию через Google Drive и Яндекс Диск. Доступ ограничен файлами, необходимыми для работы приложения. Разработчик не получает доступ к вашим данным и не передаёт их третьим лицам.","ffd.tos.s4.h":"4. Пользовательские данные","ffd.tos.s4.p":"Записи о питании, фотографии блюд, статистика и другие данные, созданные в приложении, принадлежат вам. Информация хранится локально на устройстве и/или в выбранном вами облачном хранилище.","ffd.tos.s5.h":"5. Допустимое использование","ffd.tos.s5.p":"Запрещается использовать приложение с нарушением законодательства, пытаться модифицировать его работу, обходить ограничения или выполнять обратную разработку.","ffd.tos.s6.h":"6. Ограничение ответственности","ffd.tos.s6.p":"Приложение предоставляется «как есть» без каких-либо гарантий. Разработчик не несёт ответственности за потерю данных, неточности в пищевой информации или любой ущерб, связанный с использованием приложения.","ffd.tos.s7.h":"7. Изменение условий","ffd.tos.s7.p":"Условия использования могут периодически обновляться. Продолжение использования приложения после публикации изменений означает согласие с новой редакцией условий.","ffd.tos.s8.h":"8. Контакты","ffd.tos.s8.p":"Если у вас есть вопросы относительно условий использования, свяжитесь с разработчиком через страницу поддержки."},"en":{"nav.about":"About","nav.apps":"Apps","nav.contact":"Contact","nav.home":"← Home","nav.title":"Tatiana — iOS Developer","hero.eyebrow":"Senior iOS Developer","hero.role":"8+ years in iOS development","hero.desc":"Building native iOS apps since 2016. Worked at Movavi, Novotelecom, Improve Digital and Sber. Currently building my own products.","hero.btn.apps":"My apps","hero.btn.contact":"Contact me","hero.name":"Tatiana Makeeva","about.label":"About","about.title":"iOS Engineer<br>from Novosibirsk","about.p1":"Started my career in 2016 at Movavi building a mobile video editor in Objective-C. Grew from individual contributor to team lead: at Improve Digital I ran code reviews for a team of four iOS developers.","about.p2":"Since 2020 at Sber, on the SberDevices team — working on the voice assistant. I write unit and snapshot tests, profile retain cycles, and configure AVAudioSession.","about.p3":"In parallel, I build my own apps: Bake Step by Step and Family Food Diary are on the App Store, and Family Food Diary is also on RuStore.","apps.label":"Products","apps.title":"My apps","page.screens.h":"Screenshots","soon":"Coming Soon","sc.name":"Bake Step by Step","sc.cat":"Food & Baking · iOS","sc.desc":"Smart home baking companion for sourdough and yeast breads. Live Activity and Dynamic Island timers, step-by-step recipes, notifications.","sc.page.title":"Bake Step by Step — Baking Assistant","sc.page.sub":"Home baking assistant for iPhone: sourdough and yeast breads, plus sourdough discard recipes. Track every stage, manage timers, follow recipes and never miss an important step.","sc.page.about.h":"About","sc.page.about.p":"Bake Step by Step helps home bakers through every stage of baking — with sourdough, yeast or sourdough discard.","sc.page.f1":"Step-by-step baking workflows","sc.page.f2":"Fermentation and proofing timers","sc.page.f3":"Live Activities and Dynamic Island support","sc.page.f4":"Recipe management","sc.page.f5":"Local notifications","sc.page.links.h":"Links","sc.page.support":"Support","sc.page.privacy":"Privacy Policy","sc.page.perms.h":"Permissions","sc.page.perms.p":"The app requests notification permission solely to alert you when a baking timer ends. Optionally, recipes can be stored in Google Drive or Yandex Disk: the recipes file lives in the folder you choose in your own account, and the developer has no access to it. See the <a href=\"privacy/\">Privacy Policy</a> for details.","sc.page.terms":"Terms of Service","contact.label":"Contact","contact.title":"Let's<br><span>talk</span>","contact.sub":"Open to questions, collaborations, and conversations about Swift, architecture, or sourdough.","footer.copy":"© 2026 Tatiana Makeeva","sc.support.nav.title":"Support","sc.support.page.title":"Support — Bake Step by Step","sc.tos.s8.p":"Questions? Reach us via the <a href=\"../support/\">support page</a>.","sc.support.back":"← Bake Step by Step","sc.support.label":"Help","sc.support.title":"Support","sc.support.sub":"Answers to common questions about Bake Step by Step. If you can't find what you're looking for, reach out directly.","sc.support.q1":"The timer isn't showing on the Dynamic Island — what should I do?","sc.support.a1":"Make sure notifications are enabled in Settings → Notifications → Bake Steps. Live Activities only work on iPhone 14 Pro and later.","sc.support.q2":"Can I edit the timer duration?","sc.support.a2":"Yes! Tap the pencil icon next to the timer to set your own hours and minutes.","sc.support.q3":"The app doesn't send a notification when the timer ends","sc.support.a3":"Check that notifications are enabled for the app. If your phone is in Do Not Disturb mode, notifications may be suppressed by the system.","sc.support.q4":"Is my data safe?","sc.support.a4":"Absolutely. All data is stored only on your device. We collect no information about you.","sc.support.contact.h":"Still need help?","sc.support.contact.p":"Send me a message — I usually reply within 24 hours.","sc.support.contact.btn":"Send an email","sc.privacy.nav.title":"Privacy Policy","sc.privacy.back":"← Bake Step by Step","sc.privacy.page.title":"Privacy Policy — Bake Step by Step","sc.privacy.label":"Legal","sc.privacy.title":"Privacy Policy","sc.privacy.updated":"Last updated: October 1, 2026","sc.privacy.h1":"Information Stored","sc.privacy.p1":"Recipes, baking progress, timers and settings. All of it is stored on your device. The developer does not collect this data and has no access to it.","sc.privacy.h2":"Cloud Storage","sc.privacy.p2":"Optionally, recipes can be kept in Google Drive or Yandex Disk — for example, to use them on several devices or to share a recipe book with people close to you. The app stores a <code>recipes.json</code> file in the folder you choose. The file lives in your own account; the developer has no access to it and keeps no copies.","sc.privacy.h3":"Google User Data","sc.privacy.p3":"If you choose Google Drive as storage, the app requests access to your Google Drive (scope <code>https://www.googleapis.com/auth/drive</code>). Full Drive access is needed so you can pick an existing folder for your recipes — including a folder someone else has shared with you.<br><br>The app uses this access only to: list folders so you can choose one; create the folder and the recipes file in it; read and update that file. The app does not read, modify or delete any other files in your Drive.<br><br>Data from Google Drive is processed only on your device. It is not sent to the developer or any third party, is not sold, and is not used for advertising or to train AI models. The access token is kept in the device secure storage. You can revoke access at any time at <a href=\"https://myaccount.google.com/permissions\">myaccount.google.com/permissions</a>.<br><br>Sourdough Cooker's use and transfer of information received from Google APIs will adhere to the <a href=\"https://developers.google.com/terms/api-services-user-data-policy\">Google API Services User Data Policy</a>, including the Limited Use requirements.","sc.privacy.h4":"Recipe Import","sc.privacy.p4":"Recipe text you paste for import is parsed on the device — by Apple's on-device model or a built-in parser. It is not sent to the developer's servers or to third-party AI services. If parsing fails, you may choose to email the developer a report: it contains the text you pasted and the app version, and you see the email before sending it.","sc.privacy.h5":"Recipe Catalog","sc.privacy.p5":"The app downloads a public recipe catalog from GitHub. None of your data is sent — it is an ordinary file download.","sc.privacy.h6":"Notifications","sc.privacy.p6":"The app requests permission to send local notifications to remind you about timers. These notifications are generated on the device and are not transmitted to any server.","sc.privacy.h7":"Analytics","sc.privacy.p7":"We do not use any third-party analytics or crash reporting services. No data about your in-app behaviour is tracked.","sc.privacy.h8":"Children","sc.privacy.p8":"The developer collects no personal data — from adults or children. The app is not part of the App Store Kids Category and is not intended to collect data from users under 13. The 4+ age rating means the content is suitable for all ages.","sc.privacy.h9":"Changes to This Policy","sc.privacy.p9":"If the policy changes, the new version will be published on this page with an updated date.","sc.privacy.h10":"Contact","sc.privacy.p10":"For any privacy questions, please contact:","sc.tos.title":"Terms of Service","sc.tos.updated":"Last updated: October 1, 2026","sc.tos.back":"← Bake Step by Step","sc.terms.title":"Terms of Service — Bake Step by Step","sc.tos.s1.h":"1. Acceptance","sc.tos.s1.p":"By downloading or using Bake Step by Step, you agree to these Terms of Service. If you do not agree, please do not use the app.","sc.tos.s2.h":"2. Description of Service","sc.tos.s2.p":"Bake Step by Step is a home baking assistant app for iPhone that helps you manage recipes, track fermentation timers, and follow step-by-step baking instructions.","sc.tos.s3.h":"3. Cloud Storage","sc.tos.s3.p":"The app offers optional recipe storage in Google Drive or Yandex Disk, which requires signing in to that account. For Google Drive the app requests access to your Drive so you can choose a folder, including one shared with you; the app works only with the recipes file in that folder. See the <a href=\"../privacy/\">Privacy Policy</a> for details. You can revoke access at any time in your account settings.","sc.tos.s4.h":"4. User Content","sc.tos.s4.p":"Recipes and baking data you create in the app belong to you. The app stores this data locally on your device. Cloud backup is optional and under your control.","sc.tos.s5.h":"5. Prohibited Use","sc.tos.s5.p":"You agree not to misuse the app, attempt to reverse-engineer it, or use it in any way that violates applicable laws.","sc.tos.s6.h":"6. Disclaimer","sc.tos.s6.p":"The app is provided \"as is\" without warranties of any kind. We are not responsible for any loss of data or damages arising from use of the app.","sc.tos.s7.h":"7. Changes","sc.tos.s7.p":"We may update these terms from time to time. Continued use of the app after changes constitutes acceptance of the new terms.","sc.tos.s8.h":"8. Contact","ffd.name":"Family Food Diary","ffd.cat":"Nutrition & Health","ffd.desc":"Nutrition tracker for the whole family with calorie, vitamin, mineral and nutrient analysis.","ffd.page.title":"Family Food Diary — Family Nutrition Tracker","ffd.page.sub":"Track nutrition for the whole family. Monitor calories, macronutrients, iron, magnesium, vitamins and other essential nutrients.","ffd.page.about.h":"Features","ffd.page.about.p":"An easy way to keep nutrition records for your entire family and gain insights into eating habits.","ffd.page.f1":"Track meals for multiple family members","ffd.page.f2":"Monitor calories, protein, fat and carbohydrates","ffd.page.f3":"Track iron, magnesium, calcium, vitamins and other nutrients","ffd.page.f4":"Discover your top foods by nutrient content","ffd.page.f5":"View nutrition history and statistics","ffd.page.why.h":"Why Family Food Diary?","ffd.page.why.f1":"Built for families — track nutrition for yourself, your children and loved ones","ffd.page.why.f2":"More than calories — analyze dozens of vitamins and minerals","ffd.page.why.f3":"Your data stays yours — stored in your Google Drive or Yandex Disk","ffd.page.privacy.h":"Your Data","ffd.page.privacy.p":"The app does not use its own servers to store data. You choose where your nutrition diary lives — on the device, in Google Drive or in Yandex Disk. Google Drive is used only to keep the diary files in the folder you choose and to share the diary with your family. The developer’s server is used only by the App assistant: it passes a summary for the period to a language model and stores nothing. See the <a href=\"privacy/\">Privacy Policy</a> for details.","ffd.page.links.h":"Useful Links","ffd.page.support":"Support","ffd.page.privacy":"Privacy Policy","ffd.page.terms":"Terms of Use","ffd.privacy.page.title":"Privacy Policy — Family Food Diary","ffd.privacy.nav.title":"Privacy Policy","ffd.privacy.back":"← Back","ffd.privacy.label":"Family Food Diary","ffd.privacy.title":"Privacy Policy","ffd.privacy.updated":"Last updated: October 24, 2026","ffd.privacy.h1":"1. General","ffd.privacy.p1":"Family Food Diary respects your privacy. The app is designed for nutrition tracking and does not collect personal information for sharing with third parties.","ffd.privacy.h2":"2. Information Stored","ffd.privacy.p2":"Everything you enter yourself: meals, foods and dishes with their nutrients, nutrition statistics, and family member profiles — name, date of birth and personal nutrient targets.","ffd.privacy.h3":"3. Health Data","ffd.privacy.p3":"The app keeps a history of weight and height measurements for each profile, and the date of birth used to pick age-appropriate nutrition targets. This data is kept alongside the rest and is never sent anywhere except the cloud storage you choose.","ffd.privacy.h4":"4. Data Storage","ffd.privacy.p4":"Locally on your device and, if you enable it, in the cloud storage you select — Google Drive or Yandex Disk. The files live in your own account; the developer has no access to them and keeps no copies.","ffd.privacy.h5":"5. Google User Data","ffd.privacy.p5":"If you choose Google Drive as storage, the app requests access to your Google Drive (scope <code>https://www.googleapis.com/auth/drive</code>). Full Drive access is needed so you can pick an existing folder for the diary — including a folder another family member has shared with you — and keep a shared family diary in it.<br><br>The app uses this access only to: list folders so you can choose one; create the diary folder and the diary files in it; read and update those files. The app does not read, modify or delete any other files in your Drive.<br><br>Data from Google Drive is processed on your device. It is not sold, is not used for advertising or to train AI models, and the developer does not store it. It leaves the device only if you yourself ask a language model assistant for a diet review (section 7): a nutrition summary for the period then goes to the service you chose — directly, or for the App assistant through the developer’s server, which does not store it. The access token is kept in the device secure storage. You can revoke access at any time at <a href=\"https://myaccount.google.com/permissions\">myaccount.google.com/permissions</a>.<br><br>Family Food Diary's use and transfer of information received from Google APIs will adhere to the <a href=\"https://developers.google.com/terms/api-services-user-data-policy\">Google API Services User Data Policy</a>, including the Limited Use requirements.","ffd.privacy.h6":"6. Apple Health","ffd.privacy.p6":"On iPhone you may optionally sync weight and height with the Health app — it is off by default. Reading and writing happen only when you act, read and write access are granted separately, and both can be revoked in iOS settings. Health data stays on your device and in your cloud: it is not sent to the developer and never enters analytics.","ffd.privacy.h7":"7. AI Assistant","ffd.privacy.p7":"You can ask a language model to review your diet. A request is sent only when you have chosen an assistant and tapped “Analyse my diet”. You can see it beforehand with “Show the request” — exactly that text is sent: profile name, weight, your goal (if you wrote one), nutrient targets, meals by day with times and weights, and what the dishes and foods of the period contain.<br><br><strong>App assistant.</strong> The request goes to the developer’s server and from there to Ollama, a language model service that produces the answer. The server only passes the request and the answer through: their text is not stored, not written to logs and not used to train models. The server log keeps technical data only: time, request path and response code. Processing on Ollama’s side is governed by its own policy. Servers may be located outside your country. The number of reviews is limited; the counter is kept on your device.<br><br>The same assistant can fill in a product’s nutrients by its name. Only the product name and your extra details, if any, are sent — no diary or profile. The server temporarily remembers answers by product name so it does not ask the model about the same product twice; they are not linked to you. The number of fills is limited too.<br><br><strong>Your own service.</strong> If you connected a service yourself (for example OpenAI, DeepSeek or another from the list) and supplied your own API key, the request goes straight to that service, bypassing the developer. Processing on that side is governed by that service’s own policy. Your API key is kept in the device secure storage and is never sent to the developer.<br><br>The “No neural network” review is calculated on your device and sends nothing. Do not use a language model assistant if you would rather not share nutrition data with a third party.","ffd.privacy.h8":"8. Analytics and Crash Reports","ffd.privacy.p8":"The app uses Firebase Analytics and Firebase Crashlytics (Google) — anonymous usage statistics and crash reports: device model, OS and app version, and technical crash details. Your diary, measurements and profile contents are not included in these reports.","ffd.privacy.h9":"9. Third-Party Sharing","ffd.privacy.p9":"The developer does not sell your data and does not store it. It leaves the device in three cases only, each of which you enable yourself: cloud storage, a language model assistant and Apple Health. The recipient is a service you use. The exception is the App assistant: the request passes through the developer’s server to Ollama and is not stored anywhere (section 7).","ffd.privacy.h10":"10. Permissions","ffd.privacy.p10":"Camera — only to scan a barcode on packaging; no images are stored or transmitted. Notifications — meal reminders. Start after reboot — so reminders already scheduled are not lost. Apple Health access — only when sync is enabled. Each permission is requested at the moment the feature needs it, and the app works without any of them.","ffd.privacy.h11":"11. Children’s Data","ffd.privacy.p11":"This is a family app: children’s profiles are created by an adult, who is responsible for the data entered. A child profile is no different from any other — same local storage, same cloud. Children have no separate accounts, and the app does not collect their data on its own.","ffd.privacy.h12":"12. Contact","ffd.privacy.p12":"If you have any questions regarding this Privacy Policy, please contact:","ffd.support.page.title":"Support — Family Food Diary","ffd.support.nav.title":"Support","ffd.support.back":"← Back","ffd.support.label":"Family Food Diary","ffd.support.title":"Support","ffd.support.sub":"Frequently asked questions.","ffd.support.q1":"Can I track nutrition for multiple family members?","ffd.support.a1":"Yes. The app allows you to keep nutrition records for multiple family members and quickly switch between them.","ffd.support.q2":"Where is my data stored?","ffd.support.a2":"Your data can be stored locally on your device and in cloud storage selected by you, such as Google Drive or Yandex Disk. The developer does not store your data. If you use the App assistant, a summary for the chosen period passes through the developer’s server to a language model and is not stored.","ffd.support.q3":"Which nutrients are supported?","ffd.support.a3":"In addition to calories, protein, fat and carbohydrates, the app supports vitamins, minerals and many other nutritional values.","ffd.support.q4":"Can I view nutrition statistics?","ffd.support.a4":"Yes. The app provides nutrition statistics, helps you track nutrient intake and identify foods that contribute the most beneficial nutrients to your diet.","ffd.support.contact.h":"Contact the Developer","ffd.support.contact.p":"If you have a question, found a bug, or would like to suggest an improvement, feel free to contact me.","ffd.support.contact.btn":"Send Email","ffd.tos.back":"← Back","ffd.terms.title":"Terms of Service — Family Food Diary","ffd.tos.title":"Terms of Service","ffd.tos.updated":"Last updated: June 25 2026","ffd.tos.s1.h":"1. Acceptance","ffd.tos.s1.p":"By downloading or using Family Food Diary, you agree to these Terms of Service. If you do not agree, please do not use the app.","ffd.tos.s2.h":"2. Description of Service","ffd.tos.s2.p":"Family Food Diary is a nutrition tracking application that helps users record meals, monitor nutrient intake, and analyze nutrition statistics for multiple family members.","ffd.tos.s3.h":"3. Cloud Storage Integration","ffd.tos.s3.p":"The app offers optional synchronization and backup through cloud storage services such as Google Drive and Yandex Disk. Access is limited to files required by the app. The developer does not access, store, or share your cloud files.","ffd.tos.s4.h":"4. User Data","ffd.tos.s4.p":"Nutrition records, meal photos, statistics, and other content created in the app belong to you. The app stores this information locally on your device and/or in cloud storage chosen by you.","ffd.tos.s5.h":"5. Acceptable Use","ffd.tos.s5.p":"You agree not to misuse the app, attempt to reverse-engineer it, interfere with its operation, or use it in violation of applicable laws.","ffd.tos.s6.h":"6. Disclaimer","ffd.tos.s6.p":"The app is provided \"as is\" without warranties of any kind. The developer is not responsible for data loss, inaccurate nutritional information, or damages arising from use of the app.","ffd.tos.s7.h":"7. Changes to Terms","ffd.tos.s7.p":"These Terms may be updated from time to time. Continued use of the app after changes become effective constitutes acceptance of the updated Terms.","ffd.tos.s8.h":"8. Contact","ffd.tos.s8.p":"If you have questions regarding these Terms, please contact the developer through the support page."}}). HTML elements carry a data-i18n="key" attribute; applyTranslations() fills them via innerHTML on DOMContentLoaded. Language is persisted in localStorage under lang (default: browser language, ru → RU, anything else → EN) and toggled by the setLang() RU/EN buttons in every nav.

The home page (index.html) renders the Russian text server-side (``), so link previews and search engines see it.

Family Food Diary pages (apps/family-food-diary/*) additionally render the English text server-side: at the top, and every `data-i18n` element contains. Google OAuth verification reads the raw HTML without running JS and rejected the app when these pages were empty — keep it that way for any page Google (or another store) reviews.

Consequences when editing content:

Translation key namespacing

Keys are dot-namespaced by app and page: nav.*, hero.*, about.* (home page); sc.* = SourdoughCooker; ffd.* = Family Food Diary. Within an app, sub-namespaces mirror the page: sc.page.* (landing), sc.support.*, sc.privacy.*, sc.tos.*. Follow this scheme when adding a new app or page.

App Store badge locale

applyTranslations() special-cases .appstore-badge, swapping its src to the ru-ru or en-us Apple badge endpoint by language. Give a badge class="appstore-badge" to get automatic localization.

Page layout & paths

Shared <head>

Every page builds its <head> with `

` (_includes/head.html): title, meta description, Open Graph preview, favicon (favicon.svg, favicon-32.png, apple-touch-icon.png in the root) and, for /apps/* pages, hreflang links between the /…, /ru/… and /en/… variants. It expects lang and t to be assigned by the page.

Screenshots

_includes/screenshots.html renders assets/screenshots/<app>/<ru|en>/1..5.webp (framed iPhone shots from each app’s fastlane/screenshots, converted with cwebp -q 80 -resize 600 0). Images with data-lang-src="…/{lang}/…" are swapped by applyTranslations() when the language changes.

Shared assets

assets/css/main.css and assets/js/main.js are shared across all pages — a change affects the entire site. App icons live in assets/ (e.g. assets/sourdoughcooker-icon.png).

Adding a new app

  1. Create apps/<app-slug>/ with index.html, support.html, privacy.html, terms.html (copy an existing app’s folder as the template).
  2. Add all its data-i18n keys under a new namespace to both ru and en in _data/translations.json.
  3. Add a card to the apps grid in the root index.html.
  4. Google site-verification and App Store links are hard-coded per file — update them.