Три потока данных сходятся в одном личном журнале
Три потока данных сходятся в одном личном журнале

Apple Watch знали, что я сделал. Obsidian знал, что я планировал. Но перед следующей тренировкой я всё равно открывал два разных места, смотрел на один красивый график и принимал решение почти вслепую.

Несколько лет я пробовал оцифровывать здоровье кусками. Выгружал сон и параллельно записывал настроение, чтобы найти корреляции. Вручную вёл тренировки в Obsidian. Складывал анализы в отдельную папку. Каждый подход работал пару недель, затем превращался в очередную заброшенную таблицу.

Проблема была не в нехватке данных. У меня не было места, где план, факт и контекст можно посмотреть вместе.

За месяц новая система не сделала меня здоровее и не нашла сенсационной закономерности. Польза получилась скучнее. Я вижу нагрузку в контексте и понимаю, когда не нужно добавлять ещё один километр или подход ради растущего графика. Иногда «ничего не менять» и есть результат анализа.

Ниже расскажу, как устроена система, какие данные я храню, как не плодить дубли при импорте Apple Health и почему агент здесь отвечает за ввод и хронологию, а не за диагнозы.

Почему прошлые попытки не работали

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

Через две‑три недели я переставал это делать. Не потому, что таблица была плохой. Её ведение отнимало больше сил, чем экономило.

Отсюда появилось первое требование:

Ввод должен быть дешевле пропущенной записи.

В моей текущей системе ручной вход выглядит как короткое сообщение: «Пробежал 3, колено ноет» или «Спал плохо, подтягивания дались тяжелее». Агент сам находит нужный файл, раскладывает сообщение по полям и оставляет исходный текст рядом.

Второе требование появилось, когда я вернулся к бегу. За пять дней беговая часть прогулок выросла примерно с 1,2 до 3,2 км, а средний пульс поднялся со 129 до 152. Эти числа ничего не доказывают сами по себе. Менялись темп, погода, накопленная нагрузка и восстановление.

Мне нужно было видеть рядом:

  1. Что я собирался сделать.

  2. Что записали часы.

  3. Как я сам описал тренировку.

  4. Что решил изменить на следующей неделе.

Так появилась архитектура из четырёх слоёв.

Четыре слоя системы

1. Ручная запись

В Obsidian я храню план, подходы, технику, боль и самочувствие. Это контекст, которого нет у часов.

2. Apple Watch

Во время занятия я включаю тренировку. В записи остаются длительность, дистанция, активная энергия и пульс. Точный набор зависит от типа тренировки.

3. Импорт

Раз в неделю или две я выгружаю Apple Health. Парсер выбирает нужные тренировки, нормализует поля и дополняет существующие заметки. Он не должен создавать второй файл, если тренировка уже была запланирована вручную.

4. Агент

Агент читает Markdown, сравнивает план с фактом, собирает недельную сводку и помогает подготовить следующее решение. Он не увеличивает нагрузку автоматически и не пытается заменить врача.

Граница простая. Часы измеряют. Obsidian хранит контекст. Импорт связывает записи. Агент поддерживает хронологию и готовит данные к пересмотру.

Что лежит в Obsidian

Для первой версии хватает такой структуры:

Health/
├── Dashboard.md
├── Workouts.base
├── Schema.md
├── Workouts/
├── Plans/
├── Labs/
├── Metrics/
└── _templates/
    ├── Workout.md
    ├── Training Plan.md
    └── Lab Result.md

Одна физическая тренировка хранится в одном Markdown‑файле. YAML даёт структуру Obsidian Bases и агенту, обычный текст остаётся человеку.

---
type: workout
workout_type: кардио
workout_date: 2026-07-15
workout_time: "13:36"
duration_min: 61
status: выполнено
data_source: apple_health
source_record_id: "..."
distance_km: 5.29
active_kcal:
avg_hr: 129
max_hr: 173
rpe:
pain_level: 0
---

## План
- Лёгкий бег 2 км внутри прогулки.

## Факт
- Бег 2,05 км. Без боли.

## После
- Нагрузку пока не повышать.

План и факт не смешиваются. Импорт заполняет измеренные поля, но не перезаписывает ручные заметки о боли, технике и самочувствии.

Пустое значение тоже важно. Для лекарства, боли или симптома я различаю три состояния: не записано, нет и да. Если превратить пропуск в ноль, через месяц нельзя будет понять, человек не принял лекарство или просто не открыл заметку.

Для минимальной версии community‑плагины не нужны. Properties, Bases, Templates и Daily Notes входят в Obsidian. Dataview, Tracker и QuickAdd можно добавить позже, но Obsidian предупреждает, что community‑плагины выполняют сторонний код с правами приложения.

Когда таблица лучше Obsidian

Слева таблица с графиком, справа связанная стопка заметок
Слева таблица с графиком, справа связанная стопка заметок

Если нужны только числа и графики, я бы выбрал Google Sheets или приложение вроде Daylio. Obsidian оправдывает себя, когда рядом с показателем нужно хранить обстоятельства и принятое решение.

Задача

Таблица или приложение

Obsidian и агент

Ввод с телефона

Готовая форма, несколько секунд

Нужен короткий шаблон или автоматизация

Графики

Формулы и диаграммы доступны сразу

Bases показывает таблицу, сложные графики требуют настройки

Контекст

Длинный текст неудобен в ячейке

План, факт и заметка лежат рядом

Работа агента

Компактные и предсказуемые строки

История решений доступна вместе с цифрами

Переносимость

Выгрузка в CSV или XLSX

Файлы уже лежат в Markdown и YAML

Моё правило такое: цифры без контекста остаются в приложении, решения живут в Obsidian. Не нужно переносить в Markdown каждый образец пульса. Для высокочастотных данных достаточно агрегатов и ссылки на сырой источник.

Три других применения той же схемы

Дневник состояния, архив анализов и справочная вики
Дневник состояния, архив анализов и справочная вики

Моя система выросла из бега и подтягиваний. Ниже не мои готовые кейсы, а три варианта той же конструкции. Они помогают сначала выбрать вопрос, затем поля и автоматизацию.

Дневник при хронической болезни. Сон, еда, лекарства и самочувствие попадают в ежедневную заметку и раз в неделю собираются в таблицу. Задача не в том, чтобы самостоятельно найти причину обострения. Такая хронология помогает заметить совпадения и принести их врачу.

Восстановление после лечения. В одной истории лежат анализы, данные трекеров и назначения. Если врач назначил повторный анализ через три месяца, система напомнит о дате. Агент не решает сам, когда и что нужно пересдавать.

Справочная вики. Учебник или клиническое руководство разбирается на короткие связанные страницы. Под конкретный вопрос агент получает нужный фрагмент, а не весь PDF. Так проще проверить, на какой материал он опирался.

Из этих вариантов я забрал четыре правила. Заметки после приёма лежат на странице специалиста. Пропуск не равен нулю. Ввод с телефона занимает секунды. Гипотеза агента остаётся гипотезой, пока её не подтвердил врач.

Три способа забрать данные из Apple Health

У Apple нет готовой кнопки «синхронизировать Health в Obsidian». Встроенная функция создаёт полный XML‑экспорт. Это хороший способ загрузить историю, но не постоянный поток.

Полный XML‑экспорт

На iPhone откройте Health, профиль и Export All Health Data. Apple документирует экспорт всех данных в XML.

Я храню исходный ZIP отдельно от Obsidian и Git. GPX‑файлы тренировок могут содержать точный маршрут. Агенту нужен нормализованный итог, а не весь архив.

Shortcuts

Shortcuts умеет искать отдельные образцы Health. Из этих действий можно собрать дневную сводку или короткий сценарий после тренировки. Это не готовый коннектор Apple и Obsidian. Логику сохранения и формат заметки всё равно нужно определить самому.

Приложение с HealthKit

Если нужен выборочный инкрементальный импорт, придётся делать приложение с HealthKit. Оно запрашивает разрешение отдельно для каждого типа данных. Пользователь может дать доступ только к недавнему периоду, а приложение не всегда может отличить отказ в чтении от отсутствия записей. Это ещё одна причина не превращать пропуск в ноль. Ограничения описаны в документации HealthKit.

Для личной системы я начал с XML и собственного потокового парсера. Строить iOS‑приложение ради первой версии не стал.

Как импорт не плодит дубли

Повторный импорт обязан быть идемпотентным. Один и тот же архив можно обработать второй раз, не получив копии каждой тренировки.

Мой контракт импорта выглядит так:

  1. Спросить период и нужные типы данных.

  2. Разобрать ZIP вне Obsidian.

  3. Сохранить источник и доступный идентификатор записи.

  4. Сначала искать совпадение по идентификатору, затем по дате, типу и ближайшему времени.

  5. Обновить измеренные поля существующего файла.

  6. Не трогать ручные разделы «План», «Факт» и «После».

  7. Сообщить, сколько записей найдено, обновлено, создано и осталось неоднозначными.

  8. Проверить несколько случайных тренировок по исходному приложению.

Отдельная проблема появляется, когда шаги пишут и iPhone, и Apple Watch. Их интервалы пересекаются. Складывать оба числа нельзя, пока импорт не учитывает источник и приоритет данных.

Анализы, снимки и граница агента

Человек приносит врачу подготовленную папку
Человек приносит врачу подготовленную папку

Старый бумажный анализ можно отсканировать. Агент переносит дату, лабораторию, показатель, значение, единицу и референсный диапазон. Текстовое заключение УЗИ, ЭКГ или рентгена становится частью хронологии.

Сырые снимки остаются специалисту. Моя система умеет найти старый результат, показать изменение совместимых показателей и собрать вопросы к врачу. Она не диагностирует по изображению и не предлагает лечение.

Я отдельно проверяю три вещи:

  1. Единицы совпадают. Значения в разных единицах нельзя молча ставить в один ряд.

  2. Референс взят из того же документа. Диапазоны могут отличаться между лабораториями.

  3. Факт отделён от гипотезы. «Показатель выше указанного референса» зафиксирован в документе. Причину должен определять врач.

Приватность здесь приходится проектировать сразу. Исходные XML, GPX, лабораторные PDF и снимки лежат вне публичного vault. Obsidian не шифрует локальный vault, поэтому нужны FileVault, блокировка устройства и резервная копия. Перед отправкой данных в облачную модель я убираю ФИО, адреса, координаты и лишние идентификаторы.

Если использовать ChatGPT, в настройках можно отключить Improve the model for everyone. Для разовых запросов есть Temporary Chat. OpenAI описывает эти режимы в Data Controls.

Как агент получает постоянный вход

Сначала я работал с vault вручную. Открывал папку, запускал агента, передавал файл и просил обновить запись. Технически всё работало, но цена ввода снова росла.

Следующий шаг я сделал через Hermes Agent. У него есть отдельные профили, Telegram gateway и расписания. Для здоровья я выделил отдельный профиль со своими правилами, памятью и файлами.

Теперь вход выглядит так:

Пробежал 3, колено ноет. Пульс был выше обычного.

Или так:

Спал плохо. Подтягивания 5 × 6, последний подход тяжёлый.

Агент находит тренировку, заполняет доступные поля и сохраняет исходное сообщение. Если данных недостаточно, он задаёт уточняющий вопрос. Формат YAML мне помнить не нужно.

Важнее самого Hermes здесь контракт. Его можно применить в другом агенте с доступом к файлам.

Короткий контракт для агента

Ты поддерживаешь личную систему здоровья в Obsidian. Это система наблюдения и хронологии, а не медицинский прибор.

  1. Сначала найди существующий vault и изучи его схему.

  2. До изменений покажи, какие файлы собираешься создать или обновить.

  3. Одна физическая тренировка равна одному файлу.

  4. Не превращай пустое значение в ноль.

  5. Не перезаписывай ручные заметки импортом.

  6. Сохраняй источник и доступный идентификатор записи.

  7. Не копируй XML, GPX и оригиналы медицинских документов в публичный vault или Git.

  8. Отделяй факты документа от гипотез и вопросов.

  9. Не ставь диагнозы и не назначай лечение.

  10. После работы перечисли изменённые файлы и неоднозначные совпадения.

Что сломает систему

Я уже наступал на часть этих ошибок:

Ошибка

Что происходит

Что сделать

Собирать все доступные метрики

Дашборд растёт, решений больше не становится

Начать с одного вопроса на неделю

Требовать заполнить длинную форму

Через две недели записи заканчиваются

Оставить три ручных поля

Хранить сырой XML внутри vault

Агент получает лишние данные, Git легко уносит их наружу

Держать сырой архив отдельно

Считать пропуск нулём

«Не было» смешивается с «не записал»

Хранить три состояния значения

Создавать файл на каждый импорт

План и факт расходятся по дублям

Сначала искать существующую запись

Просить агента объяснить диагноз

Корреляция превращается в уверенный медицинский совет

Готовить хронологию и вопросы врачу

Система должна уменьшать количество ручных действий. Если для её обслуживания появляется отдельный вечер каждую неделю, я снова построил хобби, а не инструмент.

Что получилось в итоге

Сейчас система держится на нескольких ограничениях:

  • четыре слоя: ручная запись, часы, импорт и агент;

  • двадцать минут на папки, шаблон и первую ручную запись;

  • ноль обязательных community‑плагинов;

  • одна тренировка равна одному файлу;

  • три состояния значения: не записано, нет и да;

  • ноль диагнозов от агента.

Пустую структуру, шаблоны, Base и полный промпт я собрал в starter‑vault. Архив скачивается напрямую, без регистрации и почты.

Apple Watch и раньше записывали тренировки. Obsidian и раньше хранил планы. Разница появилась, когда план, нагрузка и самочувствие оказались в одной хронологии.

Я больше не пытаюсь оцифровать всю жизнь за вечер. Сначала создаю одну запись, провожу одну тренировку и проверяю, помогли ли данные принять следующее решение. Если нет, добавлять новые метрики пока незачем.