The paper you saved. The passage that changed your mind. The note that became a talk, a thesis, or your next project. Bring them together in Obsidian.
Stacks is building a complete research workflow inside your vault: collect sources, read deeply, connect ideas, and write with confidence.
If Obsidian is where you think, it should be enough to manage the sources behind that thinking, too. That is the ambition: one app for your library and the knowledge you make from it.
Get started · Available today · Try it and tell us · The road ahead
Early release. Stacks is in Obsidian's community plugin directory. Capture, metadata lookup, citekeys, PDF filing, library views, annotation extraction, imports, bibliography export, formatted citations, and library maintenance are all available. It is young software, tested on its author's own vault so far, so keep a backup of your vault and tell us what you find.
References, References/attachments and Inbox, work fine if you have no preference..base file with views for each reading status, so you can browse your library right away. (Already have a Base? Pick it in the Base field instead.) Bases must be enabled in Obsidian.That's it. Your library is a set of ordinary notes in your vault, ready to link, read, and cite.
A source deserves a place beside the ideas it inspires. Link an article to a project. Connect an author to a person note. Follow a book into a question, an experiment, or a draft. Use Obsidian's links, properties, search, and Bases to work with your references alongside the rest of your vault.
Each source is an ordinary Markdown note. Its metadata lives in properties; its PDFs live in ordinary folders. Your reading notes stay yours. The library remains useful if you remove the plugin.
Zotero has helped researchers collect, organize, and cite their work for years. Stacks shares that respect for careful research and takes an Obsidian-first approach: bring those essential workflows into the place where your knowledge already lives. The goal is to make a separate reference manager optional for Obsidian users.
PMID: 12345678) and COinS on catalog and repository pages are read too.published), year, abstract, and, where the source has them, publisher, ISBN, or DOI. Book pages on Amazon, Goodreads, and Kobo, GitHub repositories, and news and blog articles are read the way Zotero's translators read them.[@citekey], [[citekey]] or both, with an optional page. Copy formatted citation and Copy formatted bibliography put a citation or reference list on the clipboard in Chicago author-date or any CSL style in your vault, italics included. A draft's bibliography covers the references it cites. See citing your sources, including the path from a note to a finished document with Pandoc or Quarto.auth.lower + shorttitle(3, 3) + year. Insert them as you write with Insert citation..base file, or create a starter Base. Match fields to your vault's property names and browse your collection with tables, filters, and reading-status views.reading sends the PDF there; when it comes back changed, Stacks files it, sets the status to reviewing, and extracts the annotations. If the PDF also changed in the vault, you choose which copy to keep, and the other is saved beside it.pdf links, PDFs no note links to, broken frontmatter, items stuck in a status, and records missing what their citation needs. Repairs, such as relinking a PDF named after the citekey or merging exact duplicates, are separate commands that show a preview first. See library health and duplicates.No separate library database to maintain. The notes and files in your vault are the library.
The destination is the whole journey: collect → read → understand → write → cite. Most of that path now exists in a first form. What comes next is making it dependable for more people and more kinds of libraries:
The feature backlog tracks proposals; it is a list to prioritize, not a promise. PLAN.md describes the design choices.
Obsidian already provides the workspace. Stacks builds on Web Clipper, Bases, the PDF viewer, and compatible plugins rather than recreating them. The aim is a coherent research workflow with your vault at its center.
Use a recent Obsidian version with Bases enabled for the library views.
Download main.js, manifest.json, and styles.css from the latest release. Put them in <vault>/.obsidian/plugins/stacks/, then enable Stacks in Community plugins.
Upgrading from 0.2.x? The plugin was renamed from Library to Stacks in 0.3.0, and its ID changed from library to stacks. Disable the old plugin and keep a backup of its folder. To retain your settings, copy .obsidian/plugins/library/data.json into the new stacks folder before enabling Stacks, then remove the old folder.
Upgrading from 0.1.x? The plugin ID changed from reference-library to library in 0.2.0. Disable the old plugin and keep a backup of its folder. To retain your settings, copy its data.json into the new library folder before enabling the new version.
Open the Stacks settings and choose your references, attachments, and inbox folders. Under Library base, pick an existing .base file or press Create base.
When a Base requires one folder, Stacks can use it as the references folder. Negated or ambiguous folder filters leave the configured destination unchanged. Review the field dropdowns so Stacks uses names such as author, source, or Citation Key the way your vault does. Web Clipper's published and description are recognized as the publication date and abstract. Create base preserves your mappings; Re-read refreshes the mapping from a selected Base.
This example assumes the default folder and property names. The settings command generates a Base using your own mappings.
filters:
and:
- file.inFolder("References")
- file.hasProperty("citekey")
formulas:
name: file.asLink(title)
properties:
formula.name:
displayName: Title
views:
- type: table
name: Library
groupBy:
property: status
direction: ASC
order: [formula.name, authors, year, type, pdf, status]
- type: table
name: Queue
filters: 'status == "queued"'
order: [formula.name, authors, year, added]
Stacks has been tested on one vault: its author's. Your library is different, and that is exactly why your experience helps. If you try it:
Please keep a backup of your vault while you try it. Stacks previews its bigger changes before making them, but a backup is the best safety net for any new tool.
Stacks uses Open Library and Google Books for ISBNs, Crossref and doi.org for DOIs, arXiv for arXiv IDs, NCBI E-utilities (PubMed) for PMIDs and PubMed links, GitHub's public API for repositories, and a web page's own metadata for other URLs. No API keys are required. Find PDF, only when you run it, asks Unpaywall (with your contact email) and the work's landing page for an open-access PDF.
For a web page, Stacks trusts the most specific source first:
workExample) and author references elsewhere in the page's data.citation_* (used by Google Scholar), Dublin Core, PRISM, and Open Graph.rel="author", author-page links) and the article's <time>.A page that names a DOI is looked up through Crossref; a PubMed record through E-utilities, then Crossref. A book page that names an ISBN gets a missing date, publisher, or description from Open Library and Google Books; the page's own values win. A bot check served in place of the page (Kobo, Cloudflare, an Amazon captcha) is recognized and ignored.
Note bodies, PDF text, and annotations are processed locally. The optional pre-extraction command runs on your computer, and the tablet round trip only copies files between your vault and a folder you choose. Lookups send the identifier or URL to the relevant service or website; identifiers discovered in a PDF may also be looked up. An optional contact email is sent to Crossref, and to Unpaywall when you run Find PDF, only when you configure it. Stacks has no telemetry or required cloud account.
git clone https://github.com/jag3773/obsidian-stacks.git
cd obsidian-stacks
npm ci
npm run build
Copy the three plugin files into your vault as described above. For development:
npm run dev # watch build
npm test # pure-module and vault/settings tests
npm run lint:scanner # lint the way the Obsidian community directory scans a release
npm run bbt-accuracy -- path/to/BetterBibTeX.json 2025
npm test runs the unit tests against an in-memory Obsidian stand-in, in seconds. End-to-end tests run Stacks in real Obsidian, downloaded on first use, with lookups answered from fixtures instead of the network:
npm run build
npm run test:e2e # desktop (oldest supported and latest Obsidian) and the emulated mobile UI
npm run test:e2e:mobile # emulated mobile only
They run on every pull request; the Android app runs nightly. See test/e2e/README.md for Android, Linux without a display, and how sync and offline capture are simulated. iOS, real sync services and touch use aren't covered automatically (what is tested), so testing in a real vault is still the most valuable help, especially on phones and tablets and with your sync setup.
Have a workflow that still sends you back to a separate reference manager? Describe it in an issue. Concrete examples help shape what Stacks builds next.
Set the same new version in manifest.json and package.json, add it to versions.json, and merge that change to main. When main has a version with no tag yet, the Release workflow creates the tag, runs tests, builds, and publishes a release containing main.js, manifest.json, and styles.css, which Obsidian's community plugin directory picks up. Pushing a matching, unused version tag yourself also works. A version with a hyphen (0.4.0-beta.1) is published as a pre-release instead.
MIT. See LICENSE. Bundled third-party components (the citation processor, citation style, and locale) keep their own licences; see NOTICE.md.