Alessandro Vettorel2 downloadsYour personal library: catalog books, rate them with yes/no questions grouped by theme (ARL score from 0 to 10 with a configurable star rating), and keep notes, quotes and characters.
Your personal library inside Obsidian. Catalog every book as a note, rate it with a structured yes/no questionnaire, and get a transparent ARL score (0–10) with a configurable star rating. Keep your reading log, characters, quotes, covers and image galleries in the same place, see everything in a fast, sortable library list with progress bars and charts — and walk through your books in a virtual bookshelf where every book is a spine you can pick up and place wherever you like.

The virtual bookshelf: every book is a spine you can pick up and place wherever you like
Interface languages: English and Italian (switchable in the settings, live, no restart).

The library: sortable list, coloured ARL scores, stars and a sticky totals bar
isDesktopOnly: false).Settings → Community plugins → Browse → search "Books and Reviews" → Install → Enable.
main.js, manifest.json and styles.css from the latest release.<your-vault>/.obsidian/plugins/books-and-reviews/ and copy the three files into it.On first start the plugin creates the evaluation-set notes (in the language you selected) and the folders it needs.
Requires Obsidian 1.13.0 or later.

The book detail page: ARL score, stars and one coloured bar per theme
The heart of the plugin is a questionnaire that turns your impressions into a number you can compare across books.
Yes answers × 10 / number of questions → a value from 0 to 10.Example: Plot 9/10, Characters 9/10, Writing style 6/10, Setting 7/10, Emotions 4/10, equal weights → ARL 7,0.
The questions are shown a few at a time (1, 2, 5 or 10 per screen, configurable). You can go back, change answers, and re-open a review later with Review again.

The questionnaire: Yes / No questions with progress bar and Back / Next buttons, live ARL and stars at the top right, and the current question highlighted
While you answer, two optional aids keep you oriented:
Live ARL and stars — with Settings → General → Live ARL and stars on, the current ARL score and the stars appear at the top right of the questionnaire and update at every answer, coloured with the band colour of the score.
Highlight the question — a coloured bar marks the current question: the first one on the screen that is still unanswered. It moves down as you answer, the page scrolls to keep it in view, and it disappears when every question of the screen is answered (the Next button then becomes available). If you go back and change an earlier answer, the bar stays on the first unanswered question.
The highlight is on by default and is fully configurable in Settings → General → Highlight the question: switch it off, or choose the background colour (default green #2e9e5b) and the text colour (default white), each with a restore default button. A live preview shows the result and a note warns you when the two colours are too similar to be readable.
The ARL score is converted to stars with four thresholds: the maximum ARL that earns 1, 2, 3 and 4 stars (the fifth star runs from the 4-star limit up to 10).
| Preset | Thresholds | Character |
|---|---|---|
| ARL scale (default) | 3 / 5 / 7 / 9 | the original spreadsheet scale |
| Linear | 2 / 4 / 6 / 8 | evenly spaced |
| Strict | 5 / 7 / 8.5 / 9.5 | stars are hard to get |
Thresholds are stored per set, so a demanding set can be stricter than an easy one. The number of stars (1–10, default 5) is a global setting; with a total other than 5 the thresholds are redistributed proportionally. The ARL score always stays in the 0–10 range.
Each set shows a level: Easy · Accessible · Demanding · Hard · Very hard. It answers the question "how hard is it to get high stars with this set?" and is computed exactly (not by simulation) from:
The bundled Novels and Essays sets are calibrated at the reference level. The editor shows the level live while you change questions, weights or thresholds, together with a table of the probability of reaching each star count.
For books you don't want to go through the questionnaire (old reads, quick ratings), use Manual rating: type an ARL score from 0 to 10 and pick a set; stars, colours and statistics work as usual. Manually rated books are marked with ✎ in the list.

Manual rating: type an ARL score and choose the set; the preview shows stars and colour
The plugin ships no books: your library starts empty and you add every book yourself. On first start it only creates the two ready-made sets below, in the language of the plugin. An empty library shows a short welcome with the first steps, and the ? Guide button on the Evaluation sets screen opens a bilingual help on how to build your own sets.
| Language | Sets | Themes |
|---|---|---|
| English | Novels | Plot · Characters · Writing style · Setting · Emotions |
| English | Essays | Content and originality · Rigour and sources · Structure and clarity · Style and quality of the text · Usefulness and impact |
| Italian | Romanzi / Saggi | the same structure, in Italian |
Each bundled set has 5 themes × 10 questions and equal weights. They live in the plugin source (sets/en, sets/it) and are written to your vault as notes the first time the plugin runs, in the language you chose. After that they are yours: edit them freely. "Restore default Novels and Essays sets" recreates them.
Open → Evaluation sets:

The evaluation sets screen: every set with its difficulty level and the Edit / Duplicate / Open file buttons
A set is a Markdown note in the sets folder (default Libri/ARL/Set). You can write it by hand:
---
tipo: set-domande-arl
nome: My thrillers
soglie: 3 / 5 / 7 / 9
colori: #e5484d / #f08c3a / #f5d142 / #8bc34a / #2e9e5b
---
## Plot
peso: 30
descrizione: Twists, pacing, coherence
- Did the twists surprise me without feeling arbitrary?
- Did the pacing keep me turning pages?
## Characters
peso: 20
id: characters
- Did I care what happened to the protagonist?
| Key | Meaning |
|---|---|
tipo: set-domande-arl |
marks the note as a set (required) |
nome |
name of the set (required, unique) |
soglie |
four increasing values between 0 and 10 (default 3 / 5 / 7 / 9) |
colori |
five hex colours, one per score band (optional, see below) |
## Title |
starts a theme |
peso |
weight of the theme (relative) |
descrizione |
short description shown under the theme title |
id |
optional stable identifier of the theme (defaults to a slug of the name) |
- question |
a yes/no question (* and 1. list styles also work) |
The keys keep their original (Italian) names regardless of the interface language, so sets and notes stay compatible between languages.
Every set defines five score bands, delimited by its star thresholds, and a colour for each:
Band 1 0 – 3 ■ red
Band 2 3 – 5 ■ orange
Band 3 5 – 7 ■ yellow
Band 4 7 – 9 ■ light green
Band 5 9 – 10 ■ dark green
(with thresholds 3 / 5 / 7 / 9 and the default palette). In the set editor, Score band colours lets you choose each colour with a colour picker, shows the live range of each band (it follows the thresholds), offers a Try with score slider with a live preview bar, and a Restore default colours button.
The colour of the band in which a score falls is used for:
Two global options in Settings → Score colours:
Existing sets without a colori line keep working with the default palette; the line is added only when you save the set from the editor.
Open → Library shows all your books in a table.

The Library information window: statistics on the whole library on two columns

Library toolbar: live search, status filter and sortable column headers
The library list is perfect for searching, sorting and counting. The Virtual library answers a different need: to give your books a material place.
On a real shelf a book is not a row in a table — it is an object with a body: a thick spine or a thin one, a colour you recognise at a glance, a precise position next to other books. Where you put a book says something about you: the ones you love at eye level, the ones you read in the same season side by side, a saga kept together, the newest on the left. That spatial memory ("it's on the third shelf, between the green and the red ones") is something a list cannot give.
The virtual library recreates that experience inside Obsidian:

The virtual library: shelves with coloured spines and codes, the one-row toolbar (arrangement and sorting) and the optional background image
Open it with the Virtual library button (right after Library in the toolbar) or the command Virtual library.
01, 02, … 75, 120); books without a code show nothing.A wall behind the bookcase. You can place an image behind the shelves — a wall, a room, a landscape — to give the bookcase a setting. The picture fills the area around the shelves (it is not visible through them, so the spines stay readable) and works together with the shelf background (wood or solid colour). Choose it in the settings (from the vault or from your computer), then tune how it is fitted (Cover, Fit, Repeat), how much it is darkened (0–70 %) and how blurred it is (0–20 px). Large photos use memory: keep them under about 2000 px wide.
Drag a spine and drop it between two books: a coloured bar shows exactly where it will go (left or right of the book you are over). Drop it on the empty part of a shelf to put it at the end of that shelf.
Your arrangement is saved (as a list of notes in the plugin's data.json) and restored every time you open the virtual library; you can also keep several named layouts, see Saved arrangements. Moving a book never touches your notes or codes.
Starting point: with no saved arrangement the books are ordered by code, from the highest to the lowest — the same default order as the list. Books without a code go last.
New books (or notes you rename) are not placed yet, so they appear at the beginning, ordered by code, until you move them.
Changing Books per shelf simply re-flows the same order across the new shelves.
Drag and drop is designed for the mouse; on touch screens it is less comfortable.
Sorting and dragging are great for experimenting, but you may want to keep an arrangement you like and always be able to come back to it. That is what arrangements are: named layouts of the whole bookcase (for example My library, Sagas together, Favourites on top).
Arrangement: [ My library ▾ ] ● modified [Save] [Save as…] [Restore] [⋯]
data.json, never in your notes.Above the shelves a toolbar lets you arrange the whole bookcase with one click:
Code: [ ↓ ] [ ↑ ] │ Reading: [ ↓ ] [ ↑ ] │ Pages: [ ↓ ] [ ↑ ]
| Group | ↓ | ↑ |
|---|---|---|
| Code | from the highest to the lowest (the starting order) | from the lowest to the highest |
| Reading (end-of-reading date) | from the most recent to the oldest | from the oldest to the most recent |
| Pages | from the book with the most pages to the one with the fewest | from the fewest to the most |
Settings → Virtual library:
| Option | What it does |
|---|---|
| Books per shelf | 5–40 books on each shelf |
| Use the full width | the bookcase takes the whole window width |
| Bookshelf width | width in pixels (500–2400) when Use the full width is off |
| Text on the spine | Title and author or Title only |
| Image behind the bookshelf | Choose… (vault) / From computer… / None; then Image fit (Cover · Fit · Repeat), Darken the image (0–70 %) and Blur (0–20 px) |
| Bookshelf background | wood by default, or any solid colour you pick (with a button to go back to wood) |
| Colours by genre | one colour picker for every genre found in your library, each with a use the automatic tint button |
| Book order | Restore the order by code (clears the working order; saved arrangements are kept): clears your saved positions and goes back to code, highest to lowest (asks for a second click to confirm) |
Every screen reached from the library has a clearly visible ← Back button in the top left corner (detail page, image gallery, choice of the set). On the questionnaire the Back and Next buttons sit at the bottom. Esc goes back or closes dialogs without leaving the plugin.

The ← Back button in the top left of a book's detail page
Opening a book shows:
n / 10);Under Reading progress you log each session: date + first page + last page. The plugin derives:

Reading progress: the log of sessions (date, first and last page) with summary, pages remaining and progress bar

The pages-per-day chart with gradient curve and tooltip

The chart with its totals line: pages read, total, pages remaining, reading days and average
personaggi, as Name | description) and in a ## Personaggi section of the note body.
Characters and quotes: the editing screens for a book
Three ways to attach a cover:
Libri/ARL/Copertine);[[Covers/dune.jpg]].The maximum cover height in the detail page is configurable (80–600 px) with a reset button to the default size.

Edit data: the cover field with "Choose…" and "From computer…" and the loan fields
The Image gallery button (next to Reading progress) opens a dedicated page with the themed images of a book — for example illustrations created with AI.
galleria: "[[image.jpg]] | caption") and as an italic line under the embedded image.galleria property and a ## Galleria section with the embedded images), so the pictures are also visible in the normal Obsidian editor.
The image gallery page: large thumbnails, optional captions under some images and the ✎ edit button
Set a return date and the plugin tracks it: the list and the detail show time remaining (months, days and hours), Overdue by n days in red, or Returned when you tick Returned / press Mark as returned. The deadline is the end of the chosen day.

Return column: time remaining until the return date
| Section | Options |
|---|---|
| General | Interface language (English / Italian) · Save folder for books · Evaluation sets folder · Covers folder · Questions per screen (1/2/5/10) · Live ARL and stars (shows the score and stars at the top right while you answer, updating at every answer) · Highlight the question (on/off, background colour, text colour, preview) · Open full screen (hides the Obsidian sidebars while the plugin is open, restores them on exit) · Interface width (600–2400 px, or full width) |
| List totals bar | Toggle each item: books and total €, books per star rating, most pages, fewest pages, genres read |
| List columns | Show/hide and drag-to-reorder every column |
| Text | Font family (theme default or a list of fonts) · Font size · Text colour |
| Cover | Cover height (80–600 px) with reset |
| Image gallery | Thumbnail size (120–600 px) with reset |
| Reading bar | Thickness · Gradient on/off · start/end colours · live preview |
| Reading chart | Line thickness (1–10) · Gradient on/off · start/end colours · live preview |
| Score colours | Colour by score · Theme bar thickness (4–30 px) · Gradient bars across bands |
| Stars | Total stars (1–10) |
| Virtual library | Books per shelf (5–40) · Use the full width / width (500–2400 px) · Text on the spine (title and author / title only) · Background (wood or solid colour) · Colours by genre · Restore the order by code |
Star thresholds, band colours, weights and questions are configured per set in Evaluation sets → Edit.
Each book is a note with this frontmatter (all fields optional except the type):
---
tipo: recensione-arl
codice: 42
titolo: Dune
autore: Frank Herbert
editore_anno: Ace, 1965
genere: Science fiction
premio: Hugo Award
pagine: 612
prezzo: 9.90
restituzione: 2026-11-30
restituito: false
inizio_lettura: 2026-09-01
fine_lettura: 2026-09-14
giorni: 14
copertina: "[[Covers/dune.jpg]]"
personaggi: # "Name | description"
- "Paul Atreides | the young duke's son"
- "Duncan Idaho"
letture: # "date | first page | last page"
- "2026-09-01 | 1 | 40"
- "2026-09-02 | 41 | 95"
galleria: # image link, optional " | caption"
- "[[Covers/dune-1.png]] | Arrakis at dawn"
- "[[Covers/dune-2.png]]"
set: Novels
arl: 8.2
valutazione_tipo: domande # or: manuale
risposte_<theme>: SSNSSSNSSS # S = yes, N = no
punteggio_<theme>: 8
---
The body of the note contains readable copies of this data in sections whose headings keep their original (Italian) names so notes stay compatible between interface languages: ## Personaggi (characters), ## Estratti e annotazioni (quotes and annotations), ## Letture (reading table with Date · From page · To page · Pages), ## Galleria (embedded images, with the optional caption in italics). The frontmatter is the source of truth: the plugin reads the reading log from letture, the characters from personaggi and the gallery from galleria, and regenerates the body sections when you save from the plugin.
The arrangement of the virtual library and the other preferences are not stored in your notes but in the plugin's data.json.
Everything lives in your vault as Markdown, so you can query it with Dataview, Bases, or any tool — and nothing is locked into the plugin. Plugin preferences are stored in data.json inside the plugin folder.

A book note in Obsidian's normal editor: the frontmatter and the sections
All available from the command palette:
(and the ribbon book icon).
The plugin keeps keyboard focus inside its own view: Esc closes dialogs, the actual-size image viewer or a caption being edited, or goes back inside the plugin without jumping to another note, and the focus is restored when you return to the tab.
npm install
npm run dev # watch mode
npm run build # type-check + production bundle (main.js)
The bundled sets in sets/ are embedded into main.js at build time (esbuild text loader).
The plugin follows semantic versioning: major.minor.patch. Every version is a GitHub release with main.js, manifest.json and styles.css. The same notes are in RELEASE_NOTES.md.
| Version | Requires Obsidian | What changed |
|---|---|---|
| 1.0.3 | 1.13.0 | Minimum Obsidian version raised to 1.13.0, required by the settings API introduced in 1.0.2 (declared-API check of the Obsidian review). The old pre-1.13 settings fallback is no longer needed. No change to your notes or settings. |
| 1.0.2 | 1.7.2 | Settings are now declared with Obsidian 1.13's settings API: from 1.13 the plugin options appear in Obsidian's settings search, one page per section (Virtual library, Reading bar, Stars…). Older versions keep the previous single settings page. The slider value is shown by Obsidian itself on 1.13+. |
| 1.0.1 | 1.7.2 | Maintenance release after the Obsidian code review: CSS classes instead of inline styles for showing/hiding and static styling; default-language detection through Obsidian's own locale (moment.locale()); stricter typing of frontmatter updates, instanceof TFile checks and Obsidian DOM helpers (createEl, createDiv); unused code removed; builtin-modules replaced by Node's module.builtinModules; two CSS lint fixes. No change to your notes or settings. |
| 1.0.0 | 1.7.2 | First public release. See below. |
MIT © Alessandro Vettorel