Если вам интересна тема персональных систем управления знаниями и задачами — переходите в мой тг-канал. Там я разбираю инструменты, публикую кейсы и делюсь тем, что работает на практике, а не только выглядит красиво на скриншотах.
Список «хочу прочитать» давно перевалил за сотню. Когда наконец добираешься до книги — появляется другая проблема: хочется зафиксировать цитату или мысль, но непонятно куда. Заметки в телефоне, вкладка в браузере, стикер на полях — через месяц это всё теряется. Обычный подход «одна заметка на книгу» не работал: либо файл разрастался до неприличия, либо я просто забывал его открывать. Тогда я перестал искать «правильный» плагин и спроектировал систему с нуля в Obsidian. В этой статье я покажу архитектуру, реальные шаблоны и конфигурацию баз данных — так, чтобы это можно было повторить.
Архитектура: три уровня, не один файл
Главная ошибка большинства читательских систем — складывать всё в одну заметку. Пересказ сюжета, цитаты, собственные мысли, ссылки на другие книги — всё это разная информация с разным сроком годности и разной частотой обращения.
В моей системе три типа объектов:
-
Книга — карточка с метаданными (автор, статус, жанр, темы, обложка). Без текста.
-
Цитата — отдельная заметка с дословным фрагментом, привязанная к книге.
-
Мысль — отдельная заметка с моим личным соображением, возникшим при чтении.
Цитата и мысль — не разделы внутри книги, а самостоятельные заметки. Это принципиально: они живут в своих папках, попадают в свои базы данных и могут ссылаться на другие заметки в vault независимо от источника.

Заметка о книге: YAML + живая карточка
Каждая книга создаётся через шаблон Templater. Шаблон задаёт вопросы интерактивно: автор, статус, жанр, темы, страна происхождения, URL обложки.
<%*const title = tp.file.title;const author = await tp.system.prompt("Автор") || "";const statusOptions = ["Буду читать", "Читаю", "Прочитано"];const status = await tp.system.suggester(statusOptions, statusOptions) || "";const cover = await tp.system.prompt("URL обложки (Enter если нет)", "") || "";const genreOptions = ["Fiction", "Non-Fiction"];const genre = await tp.system.suggester(genreOptions, genreOptions) || "";const direction = await tp.system.prompt("Темы (Enter если нет)", "") || "";const countryOptions = ["Иностранное", "Отечественное"];const country = await tp.system.suggester(countryOptions, countryOptions) || "";-%>
На выходе — frontmatter со всеми полями и callout-карточка с inline-полями Meta Bind:
---author: Клаус Швабtags: - литератураstatus: Прочитаноcover: https://...Жанр: Non-FictionТемы: технологии, обществоСтрана: Иностранное---> [!book]+ 📖 Четвёртая промышленная революция> >> | | |> |---|---|> | **Автор** | `INPUT[text:author]` |> | **Жанр** | `INPUT[inlineSelect(option(Fiction),option(Non-Fiction)):Жанр]` |> | **Темы** | `INPUT[inlineList:Темы]` |> | **Страна** | `INPUT[inlineSelect(option(Иностранное),option(Отечественное)):Страна]` |> | **Статус** | `INPUT[inlineSelect(option(Буду читать),option(Читаю),option(Прочитано)):status]` |
INPUT[] — это синтаксис Meta Bind. Поля в таблице кликабельны прямо в режиме чтения: можно поменять статус с «Читаю» на «Прочитано» не открывая frontmatter. Это мелочь, но она убирает «трение».

Templater: цитаты создаются в два клика
Вот где начинается автоматизация. Когда я хочу сохранить цитату, я создаю новую заметку в папке Цитаты/ — Templater подхватывает шаблон автоматически.
Шаблон делает четыре вещи:
-
Показывает список всех книг из папки
литература/(кроме самих баз данных — файлы, начинающиеся с00, отфильтрованы). -
Вытаскивает автора из frontmatter выбранной книги — вводить вручную не нужно.
-
Просит ввести название цитаты (первые слова или тема) и переименовывает файл.
-
Открывает книгу и добавляет обратную ссылку в раздел
# Цитаты.
<%*const litFolder = 'ЖИЗНЬ/литература/';const books = app.vault.getMarkdownFiles() .filter(f => f.path.startsWith(litFolder) && !f.path.includes('/Цитаты') && !f.name.startsWith('00')) .map(f => f.basename) .sort((a, b) => a.localeCompare(b, 'ru'));const book = await tp.system.suggester(books, books, false, 'Из какой книги?');if (!book) return;const bookFile = app.vault.getFileByPath(litFolder + book + '.md');const bookMeta = app.metadataCache.getFileCache(bookFile);const author = bookMeta?.frontmatter?.author || '';const title = await tp.system.prompt('Название / первые слова цитаты');if (!title) return;await tp.file.rename(title);const bookContent = await app.vault.read(bookFile);let newBookContent;if (bookContent.includes('# Цитаты')) { newBookContent = bookContent.replace('# Цитаты\n', '# Цитаты\n- [[' + title + ']]\n');} else { newBookContent = bookContent.trimEnd() + '\n\n# Цитаты\n- [[' + title + ']]\n';}await app.vault.modify(bookFile, newBookContent);-%>
Шаблон для мыслей (Мысль.md) идентичен — только фильтрует ещё и папку /Мысли и пишет в раздел # Мысли книги.

Двусторонние связи без ручной работы
После выполнения шаблона происходит следующее. В заметке цитаты:
---tags: - цитатаbook: "[[Четвёртая промышленная революция]]"author: Клаус Шваб---Бенефициарами инноваций четвёртой промышленной революции в основномявляются те, кто обеспечивает интеллектуальный и физический капитал...
В заметке книги автоматически появляется:
# Цитаты- [[Бенефициарами инноваций четвёртой промышленной революции]]
Связь двусторонняя: из книги видно все цитаты, из цитаты — источник через поле book. Никакого ручного труда — шаблон делает всё сам в момент создания.
[скриншот: заметка о книге с заполненными разделами Цитаты и Мысли — списки вики-ссылок]
Obsidian Bases: три базы, пять видов
Bases — встроенный плагин базы данных в Obsidian. Файлы .base лежат прямо в папке литература/ рядом с заметками.
00 Литература.base
Пять видов одной базы:
Карточки — визуальная галерея книг с обложками, автором и статусом. Сортировка по имени.

Представление — полная таблица, сгруппированная по жанрам. Колонки: название, жанр, статус, автор, страна, темы. Сортировка многоуровневая: статус → жанр → автор.
📚 Буду читать — таблица только с нечитанными книгами, по автору.
📖 Читаю — только текущее чтение.
✅ Прочитано — архив прочитанного.

00 Цитаты.base и 00 Мысли.base
Оба устроены одинаково: таблица с колонками «название», «книга», «автор». Сортировка по автору, потом по книге. Это позволяет быстро найти все цитаты конкретного автора — даже если они из разных его книг.

Что в итоге
Сейчас в системе 98 книг, больше 20 цитат и несколько десятков мыслей. Самое ценное — не количество, а то, что каждая сохранённая цитата немедленно связана с источником и попадает в базу. Я не трачу время на организацию после факта — шаблон делает всё в момент захвата.
Три вещи, которые сделали систему рабочей:
-
Разделение на типы заметок — книга, цитата и мысль не смешиваются в одном файле.
-
Templater с JS — автоматизация на уровне создания, а не сортировки.
-
Bases с несколькими видами — одни данные, разные способы смотреть.
Если узнали себя в этой проблеме — напишите в комментариях, как сейчас фиксируете цитаты и мысли по прочитанному. Расскажу, что можно докрутить под ваш контекст. Больше про системы в Obsidian — в моём тг-канале.
ссылка на оригинал статьи https://habr.com/ru/articles/1032228/