minseon9137 downloadsReading Tracker for importing books from Open Library, organizing your reading shelves, and analyzing your reading habits.
Every time you read, you leave a note. Find a book, record the sitting, keep the passage — all as plain Markdown in your own vault.
Obsidian's Daily notes gives you one note per day. This gives you one note per sitting with a book. Same shape, different unit: the record belongs to the reading, not to the date.
Reading Tracker/
├─ Books/
│ └─ 소년이 온다.md
├─ Sessions/
│ ├─ 2026-10-04 소년이 온다.md
│ └─ 2026-10-06 소년이 온다.md
└─ Views/
├─ shelf.base
├─ library.base
├─ sessions.base
└─ statistics.base
Two kinds of note, with one rule each:
## Reading History is an index of your sittings.![]()
Ctrl/Cmd+P → "Search book".base files in Reading Tracker/Views/The dialog asks for as much or as little as you want:
| Field | |
|---|---|
| From / To | How far you got |
| Minutes | How long you read. Optional. |
| Passages | Everything you copied out. Add passage adds another, each with its own page and line. |
| Thoughts | What you made of it |
| Rating | 1–5 for the book |
| Give up on this book | Record the sitting, then mark the book abandoned |
Three things then happen, each touching only its own file: the sitting gets its note, the book note's index gains a line pointing at it, and the book's properties catch up with where you now are.
---
book: "[[소년이 온다]]"
date: 2026-10-04
from: 140
to: 216
amount: 76
unit: pages
minutes: 90
quotes: 2
---
> [!quote] p.152 l.7
> 그녀는 어둠 속에서 오래 서 있었다.
> [!quote] p.168
> 아버지는 말이 없었다.
이 장면들 때문에 다시 읽기로 했다. 여기서부터는 마음껏 길게.
One sitting is rarely one passage, so copy out as many as you like — each becomes its own quote callout, titled with where it came from. quotes is a count, not a copy of the pages: the passages and their citations live in the body, and nothing in the properties duplicates them.
The properties are what the views read — never the body. Keep writing in it whenever you like; add headings, images, more passages, links to other notes. Nothing the plugin does will reformat it.
## Reading History
- 2026-10-04: 140-216 — [[2026-10-04 소년이 온다]]
- 2026-10-06: 216-260 — [[2026-10-06 소년이 온다]]
- 2026-10-07: 300
A line with a link points at that sitting's session note. A line without one is a sitting you logged by hand, and it counts just the same — handy when you only want to note how far you got. A line giving a single position means "read up to here", picking up where the previous one left off.
Lines are only ever added. Nothing already in the section is re-parsed or rewritten, so your edits always survive. The heading is configurable, so ## 독서 기록 works too.
Set reading_unit on a book note:
reading_unit |
Positions look like |
|---|---|
pages (default) |
140-216 |
percent |
20%-45% |
time (audiobooks) |
0:00-1:30 |
Ranges can be written with -, –, ~, →, or ->.
Four are generated in Reading Tracker/Views/:
---
title: 소년이 온다
author: [한강]
category: [소설]
publisher: 창비
publish: "2014"
isbn: "9788936434120"
cover: https://covers.openlibrary.org/...
series:
series_position:
total: 216 # total pages — or 100 for percent, total minutes for time
status: reading # unread / reading / finished / abandoned
reading_unit: pages
rating: 5 # 1-5, optional
read_page: 260
read_started: 2026-10-01 21:40:00
read_finished:
---
No created, no updated, no session index. Obsidian already tracks when a note was made and last changed, and the sittings are notes of their own — so there is nothing here to keep in step with anything else.
Two:
Everything else has one sensible answer and is simply done: a book is finished when you reach its last page, a sitting is always worth recording, and times are in your local timezone.
Search uses the Open Library API — the one book API that needs no account, no key, and no registration. Nothing you search for leaves the vault except the query itself.
Its catalogue is strongest for English-language books. Coverage of Korean and other non-English titles is thin, and page counts are often missing, so there is always a way through: Add "…" by hand appears under the results and in place of them when there are none. It creates the book note with the title you typed and opens it, so you can fill in the author and page count using Obsidian's own properties editor. total is the only one the tracker needs — it decides when a book counts as finished.
Obsidian 1.10.1 or later, on desktop. The views are built on Bases, which needs 1.10.1.
The plugin is not in the community directory yet, so install it from source:
npm install
npm run build
npm run deploy -- /path/to/your/vault
Then in Obsidian: Settings → Community plugins → turn off Restricted mode → Reload → enable Reading Tracker.
npm install
npm run test-vault # a throwaway vault with the plugin symlinked in
npm run dev # watch build; reload Obsidian to pick it up
npm run verify # build + lint + release checks + load smoke test
No runtime dependencies. Notes are read through Obsidian's metadata cache and written through processFrontMatter and Vault.process, so there is no YAML library and no private copy of your properties.
docs/RELEASING.md covers local verification — including a test vault and a manual checklist — and how to publish and submit to the community directory.
Your book notes keep working. Entries in the old ### date block form are still read and are left exactly where they are; new sittings are added below them as index lines.
These properties are no longer written, and can be deleted whenever you like:
created / updated — Obsidian's own file times replace themreading_history_summary — sittings are session notes nowisbn10 / isbn13 — merged into a single isbnThe folder default changed from Bookshelf to Reading Tracker. If you already have a Bookshelf folder, point Reading tracker folder back at it and nothing moves.