Личная библиотека в Obsidian: книги, цитаты и мысли в одной базе данных
Если вам интересна тема персональных систем управления знаниями и задачами — переходите в мой тг-канал. Там я разбираю инструменты, публикую кейсы и делюсь тем, что работает на практике, а не только выглядит красиво на скриншотах.
Список «хочу прочитать» давно перевалил за сотню. Когда наконец добираешься до книги — появляется другая проблема: хочется зафиксировать цитату или мысль, но непонятно куда. Заметки в телефоне, вкладка в браузере, стикер на полях — через месяц это всё теряется. Обычный подход «одна заметка на книгу» не работал: либо файл разрастался до неприличия, либо я просто забывал его открывать. Тогда я перестал искать «правильный» плагин и спроектировал систему с нуля в 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() + 'nn# Цитаты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 — в моём тг-канале.
Автор: psheno322

