Если вам интересна тема персональных систем управления знаниями и задачами — переходите в мой тг‑канал. Там я разбираю инструменты, публикую кейсы и делюсь тем, что работает на практике, а не только выглядит красиво на скриншотах.
В начале сентября я провёл в канале интерактив: предложил подписчикам написать в комментариях свою профессию и пообещал каждому прислать эскиз системы в Obsidian под его работу. Эскиз — это буклет на 3 страницы: какие разделы нужны хранилищу юриста, психолога или инженера, как между ними ходит информация и какими плагинами это собирается. Профессию назвали 20 человек. Каждому ушёл буклет в личку, дальше пошли переписки и записи на консультации. Я понял, что через неделю уже забуду, кому что отправил и кому обещал ответить — надо строить CRM. До этого лидов я не вёл никак, их было мало и все помещались в голове. Отдельный сервис заводить не хотелось: задачи, клиентские проекты и заметки по встречам у меня и так в Obsidian. В этой статье расскажу, как я собрал CRM на плагине Operon и что в нём допилил. Следующие раунды интерактива буду объявлять в канале.

Почему Operon
Operon — плагин для задач и проектов. Задача в нём бывает строкой с чекбоксом или отдельной заметкой, и одной командой одна форма превращается в другую. Над всеми задачами хранилища плагин строит сводные виды: таблицу, канбан, календарь, диаграмму Ганта.
Главное, за что я его выбрал, — он настраивается под свою работу. Воронки и их стадии задаются в настройках, и у каждой воронки свой канбан. Свои поля заводятся там же, с русскими именами и иконками, и показываются в редакторе задачи, на карточках канбана и в колонках таблиц. Фильтры и таблицы сохраняются пресетами и встраиваются в любую заметку.
Карточка человека
На каждого, кто мне написал, заводится заметка в папке Люди/. Для Operon это задача‑файл: во фронтматтере у неё operonId и status, а значит, она появляется на канбане и в таблицах.
--- operonId: z6s17jf status: Консультация.Проведена профессия: демо-кейс: links: - https://t.me/username источник: Рекомендация ---
Под фронтматтером идут разделы.
«Что известно» — ссылки на заметки по человеку: исходные данные, план консультации, конспект, маршрут сборки системы;
«Задачи» — задачи по этому лиду или клиенту;
«Переписка» — выдержки из диалога, если к ним придётся вернуться.

Стадия подсказывает следующий шаг
Статус в Operon состоит из двух частей: имя воронки (в плагине она называется пайплайном) и стадия. У меня 3 воронки:
Воронка |
Стадии |
|---|---|
Лид |
Новый, Буклет отправлен, Диалог, Отпал |
Консультация |
Запрос, Назначена, Проведена, Думает, Отвалилась |
Проект |
Диагностика, Проектирование, Смета, Сборка, Передача, Сопровождение, Закрыт, Завершён, Отвалился |
Под каждую воронку свой канбан, колонки на нём совпадают со стадиями.
Лид становится клиентом, когда я меняю ему статус с Лид.Диалог на Консультация.Запрос. Карточка пропадает с канбана «Лиды» и появляется на канбане «Консультации». Отдельной операции переноса нет, файл остаётся на месте.
Типовые задачи вида «отправить буклет», «ответить», «напомнить о себе» я на людей не завожу: канбан их уже показывает. Карточка в колонке «Новый» значит, что буклет не отправлен. Карточка в колонке «Диалог» — ход за мной или пора написать. Поэтому в разделе «Задачи» живёт только то, что из стадии не следует. Например, собрать схему под профессию, которой нет в наборе буклетов.
Канбаны и таблицы
Канбаны: «Лиды», «Консультации», «Проекты». Открываю «Лиды», вижу, у кого какая стадия, и перетаскиваю карточку, когда что‑то сдвинулось.
Для общего обзора есть заметка CRM.md с тремя таблицами Operon: клиенты в работе, лиды, архив. Таблица вставляется в заметку блоком кода со ссылкой на сохранённый пресет:
# ? Клиенты ```operon-table presetId: "tp_clients" ``` # ? Лиды ```operon-table presetId: "tp_leads" ``` # ? Архив ```operon-table presetId: "tp_archive" ```
У каждого пресета свой фильтр по статусу. В «Лидах» статус содержит Лид. и не содержит Отпал. В «Клиентах» собраны статусы Проект. и Консультация. без финальных стадий. Финальные и отпавшие собраны в «Архиве». Архив вынесен в отдельную таблицу, потому что в одной таблице группы сортируются по порядку воронок, и закрытые проекты оказываются выше активных. CRM.md встроена в главную заметку бизнес‑раздела, так что все люди видны с первого экрана.

Ещё одна таблица живёт в заметке раунда интерактива. Её фильтр — поле «Источник» со значением Интерактив 2026-09-04. Она показывает всех, кто пришёл из раунда, с их стадиями, и заодно служит счётчиком: сколько получили буклет, сколько дошли до консультации.
Что я допиливал в Operon
Из коробки Operon закрыл канбаны, таблицы и воронки. Остальное пришлось настраивать и дописывать.
Свои поля
Для лида мне нужны профессия, буклет, который я ему отправил, и откуда он пришёл. Я завёл 3 поля: «Профессия», «Демо‑кейс» и «Источник», и для каждого включил показ в редакторе задачи, в окне создания и на чипах. Ещё нужна ссылка на телеграм, но под неё своё поле не понадобилось. Кликабельной внешняя ссылка бывает только в системном поле Operon links, поэтому телеграм лежит там.
Ключ у поля «Источник» — leadSource. Слово source занято системной колонкой Operon, и под этим ключом своё поле не заводится. Во фронтматтере поле всё равно называется «источник»: видимое имя задаётся отдельно от ключа.
Чипы
Чип — это плашка с иконкой и значением поля. Панель свойств Obsidian я скрываю, внешне она мне не нравится, поэтому данные о человеке видны только чипами. С ними пришлось разбираться дольше всего.
Набор чипов в Operon настраивается отдельно для каждого места, где показывается задача: для карточки канбана, для строки задачи в заметке, для списков фильтров. Наверху заметки‑задачи плагин выводит блок со списком её подзадач, и чипы там берутся из настроек списков фильтров.
Сначала на странице человека чипов было много. Читать их там незачем, всё то же самое есть в шапке ниже. Я оставил на странице один чип links со ссылкой на телеграм: по нему удобно кликнуть и сразу открыть переписку. На карточке канбана, наоборот, профессия видна текстом, а ссылка, демо‑кейс и источник — иконками. Чип статуса там выключен: статус и так понятен по колонке.


Шапка карточки на Meta Bind
Менять данные через чипы неудобно в двух местах. Клик по чипу стадии листает стадии только внутри текущей воронки, и перевести лида в консультацию так нельзя, только через полный редактор задачи. А ссылку в чипе links нельзя поправить, только удалить и добавить заново.
Поэтому для правки у карточки есть шапка: строки с полями ввода плагина Meta Bind, которые пишут прямо во фронтматтер:
? Стадия: `INPUT[inlineSelect(option(Лид.Новый), option(Лид.Буклет отправлен), option(Лид.Диалог), option(Лид.Отпал), option(Консультация.Запрос), option(Консультация.Назначена), option(Консультация.Проведена), option(Консультация.Думает), option(Консультация.Отвалилась), option(Проект.Диагностика), option(Проект.Проектирование), option(Проект.Смета), option(Проект.Сборка), option(Проект.Передача), option(Проект.Сопровождение), option(Проект.Закрыт), option(Проект.Завершён), option(Проект.Отвалился)):status]` ? Профессия: `INPUT[text:профессия]` ? Демо-кейс: `INPUT[inlineListSuggester(option([[Юрист]]), option([[Психолог]]), option([[Инженер]])):демо-кейс]` ? Источник: `INPUT[inlineSelect(option(Интерактив 2026-09-04), option(Входящий), option(Хабр), option(Telegram), option(Рекомендация)):источник]` ✈️ Телеграм: `INPUT[text:links[0]]`
В выпадающем списке «Стадия» лежат стадии всех трёх воронок, им я и перевожу человека из одной в другую. «Демо‑кейс» — ссылка на буклет, который я ему отправил (в примере список сокращён, у меня там 24 профессии). «Телеграм» правит ссылку в links как обычный текст.
Шаблон новой карточки
Новую заметку в Люди/ создаёт Templater по шаблону папки:
<%* const name = await tp.system.prompt("Имя человека"); if (name) await tp.file.rename(name); -%> --- operonId: <% Math.random().toString(36).slice(2,9) %> status: Лид.Новый профессия: демо-кейс: links: - https://t.me/ источник: ---
Ниже в шаблоне та же шапка на Meta Bind и пустые разделы.
В шаблоне 2 решения, до которых я дошёл не сразу.
Имя спрашивается до отрисовки заметки. Если создать файл «Без названия» и переименовать его потом, виджеты Meta Bind перестают работать до переоткрытия вкладки. Поэтому шаблон сначала спрашивает имя и переименовывает файл, а потом выводит содержимое.
operonIdгенерируется самим шаблоном. В документации Operon есть заглушка{{operonId}}, но плагин подставляет её только в своих командах. В шаблоне Templater она остаётся текстом, и заметка для Operon задачей не становится. СтрокаMath.random().toString(36).slice(2,9)выдаёт 7 случайных символов из цифр и латиницы, того же вида, что у плагина.
Редактор задачи в узком окне
Карточку человека удобно править в редакторе задачи Operon: слева поля, справа текст заметки. Когда окно Obsidian уже 980 пикселей, текст заметки ложится поверх панели полей и закрывает её шапку вместе с кнопкой, которая переключает поля и текст. Вернуться к полям становится нечем. Это чинит CSS‑сниппет: он закрепляет шапку панели полей и опускает текст заметки ниже неё.
@media (max-width: 979px) { .operon-task-editor-shell.has-file-body .operon-task-editor-title-row { position: sticky; top: 0; z-index: 6; background: var(--background-primary); } .operon-task-editor-shell.has-file-body.is-file-body-visible .operon-task-editor-file-panel, .operon-task-editor-shell.has-file-body .operon-task-editor-file-panel-backdrop.is-visible { top: 46px; } }
Для желающих: напоминания Operon в iPhone
Схема работает только в связке Mac и iPhone. Если у вас другие устройства, блок можно пропустить.
У Operon есть напоминания: к задаче можно привязать время или правило вроде «за день до срока». Так я ставлю себе пинг лиду, которому пора написать. Чтобы напоминание пришло на iPhone, когда Obsidian закрыт, Operon записывает список ближайших напоминаний в файл, а быстрая команда iOS переносит их в стандартные Напоминания. Но этот файл плагин обновляет только на самом телефоне и только пока там открыт Obsidian. Поэтому файл вместо плагина пишет скрипт на Mac. Ограничение у схемы одно: пока Mac выключен или спит, файл не обновляется, и новые напоминания на iPhone не появляются.
Как это устроено.
На Mac каждые 5 минут через launchd запускается скрипт на Python. Он обходит заметки хранилища и собирает открытые задачи с полями
reminderDatetimesиreminderRules— и строки с чекбоксом, и задачи‑файлы.Правила вида
dateDue.1dскрипт пересчитывает в конкретное время: дата срока минус 1 день. В выдачу попадает окно от 3 дней назад до 7 дней вперёд.Результат пишется в файл
.operon-mirror.jsonв корне хранилища в формате, который повторяет собственный файл Operon. Хранилище лежит в iCloud, и файл синхронизируется на iPhone.Утром автоматизация iOS запускает быструю команду. Она читает файл и добавляет задачи в список «Obsidian» в Напоминаниях.
Грабли плагина
Статус всегда выводится целиком:
Лид.Диалог. Все воронки пишут стадию в одно полеstatus, и чтобы стадии разных воронок не путались, Operon добавляет к ним имя воронки. Так статус выглядит везде: на чипе карточки, в колонке таблицы, в выпадающем списке. В таблице колонка статуса из‑за этого получается широкой, аКонсультация.Отвалиласьчитается хуже, чем просто «Отвалилась». Настройки, которая прятала бы имя воронки, нет: я искал и в настройках, и в коде плагина. Оставил как есть. Одно поле на все воронки и даёт перевод лида в клиенты одной сменой статуса, и за это я готов терпеть длинные подписи.Meta Bind не узнаёт значения с точками. Источник
Интерактив 04.09.2026виджет не сопоставлял с вариантом из списка: показывал пустое поле, а по клику подставлял первый вариант. С датой через дефисы,2026-09-04, работает.
Что получилось
До сентября лиды у меня не велись никак. Теперь у каждого человека есть карточка, все они видны на одном канбане, и ни один не потерялся. По колонке «Диалог» видно, кому я должен ответ.
Если узнали себя — напишите в комментариях, как вы сейчас ведёте клиентов и в каком месте теряете. Расскажу, что можно докрутить под ваш контекст.
Больше разборов и кейсов — в моём тг‑канале.