How I Read Research Papers with Obsidian and Zotero

19 August, 2021 | 7 min read

UPDATE: Zotero v6 broke the previous workflow. On 2023-03-12, I updated this article with my new workflow. Previously, the Citations plugin was used to import the paper into Obsidian. Now, I use QuickAdd to do the same thing.

How do we manage the complexity and depth from research papers in our note systems? How do we minimize the friction of taking notes in a PDF document and turning those into evergreen, permanent notes?

Those were the exact questions I was asking myself a few days ago. Reading research papers was a mess. I had no good way to import my highlighted notes to my note system, and the only good way didn’t do everything I needed it to.

So I created my own system for reading research papers; a combination of Zotero and Obsidian. Let me show you what I made, and how it can help you.

Process outline

  1. Add paper to Zotero inbox
  2. Read the paper when I have time — and take notes
  3. Automatically ingest it into Obsidian with the desired template and metadata
  4. Processing the notes; thinking through the ideas and turning them into separate notes if desired

In this article, I’ll show you 1-3.

Let’s get to it.

Setting up Zotero

The process always starts with me adding a paper to my Zotero inbox. Learn how to maintain your Inbox and keep it clutter-free.

I use the Zotero Connector extension to save papers directly to Zotero from my browser. You can also use the magic wand button in Zotero to add papers by their DOI.

To read the papers, I use the new built-in PDF reader for Zotero; a powerful PDF reader & annotation tool. As I read, I simply annotate the passages that I find relevate. This includes asking questions regarding the presented information, summarizing, comparing to other literature, or explaining things in my own words.

Setting up Obsidian

To enable the workflow on Obsidian, you’ll need the QuickAdd plugin. Check out my video here for how it works.

As an aside, there exist other good plugins that can help you import into Obsidian. Some of them are unfortunately outdated and no longer maintained. The best alternative I have found is the Zotero Integration plugin by the great Matthew Meyers. It is very powerful, and has a ton of great features, but also has some weaknesses that I think this workflow addresses. For example, it does not work on mobile.

The method I present here works on any device. The only requirement is that you use Zotero's Sync feature, such that your data is synchronized to the Zotero online database. This is where the script will pull the data from.

Now, let’s set up the template used for paper notes.

My research paper template

The following is the template I use for papers. I use Dataview, so my metadata looks a bit different from the conventional YAML.

tags: in/paper state/process
    - '{{VALUE:title}}'
cssclass: null
abstract: >

# {{VALUE:title}}


Type:: [[&]]
Title:: {{VALUE:title}}
Author:: {{VALUE:authors}}
Year:: {{VALUE:date}}
DOI:: {{VALUE:doi}}
Reviewed Date:: ==UPDATE THIS==
Rating:: ==Give a rating==


## Abstract


## Summary of key points


## Other Comments


## Interesting Cited References

-   ***


Every metadata property will be filled out by QuickAdd, except the tags and rating. The ReviewedDate property will link to my daily note. The remaining properties will just contain data about the paper itself.

What makes the script powerful is that it allows you to customize both the template & how annotations and authors are formatted to your liking. I'll show you how in a moment.

Setting up QuickAdd

We’ll need to install a QuickAdd user script for this to work. The video shows you how to do so here. You can grab the script here.

At this point, we need to create a macro — if you haven’t already. In QuickAdd, go to Manage Macros, and add a new macro. Once the macro has been added, go ahead and click Configure.

First, you’ll want to add the user script to the macro — I called it zotero.js, so that's what I'm adding.

To use the script, you need generate an API key for Zotero. You can do so here. Generate one by clicking Create new private key and then giving it library and notes access. Once you have the key, add it to the script by clicking the ⚙️ button next to it. You also need your Zotero user ID, which you can find on the same page as the API keys.

My setup looks like this: Script settings

This settings panel is also where you customize how annotations and authors are formatted. I use the settings shown in the image. {{VALUE:formattedAnnotations}} is what will be used to import the annotations into the note and {{VALUE:authors}} to import the authors into the note, given the settings you set here.

Now add a Template to the macro by clicking the Template button. My Template Choice looks like this:

Template choice

Here’s an explanation of the settings:

  • Template Path is the path to my template. This is the path to the note that you’ve created from the template I shared above. Your will vary from mine, unless you have the exact same naming and folder structure.
  • File Name Format is the format of my file names. I use & in front of papers for my file convention. The {{VALUE:fileName}} is necessary, as it grabs the paper’s title and uses that — which happens through the script.
  • I use create in folder because I put my source notes in an inputs folder.
  • And lastly, open. This is used to open the created file.

This is what your macro should look like.


Having created the macro, all you need is a QuickAdd choice to activate it. Back in the main QuickAdd menu, add a Choice of the Macro type. Click ⚙ settings for it and select your newly created macro.

Creating notes in Obsidian from papers in Zotero

Now that we’re all set up, it’s time to use the script!

Having read a paper, I’ll go into Obsidian and activate the 📜 Add Paper choice. A menu like this will open:

Suggestor showing all papers in my Zotero collection

Selecting a paper will create a new note, which looks like this:

Created note

So there it is. This is how I import papers into my vault; notes, metadata, and all.

How you can use it

Any of the following variables can be accessed with {{VALUE:variable}}, where variable is the name of the variable. Most of these are from the Citations plugin, but I’ve added a few extra ones for convenience.

These can be used in your Template Choice as well as your markdown template.

  • fileName — paper title with all the special, illegal characters removed.
  • author — all authors in the format you defined. You can use any of the variables here, except formattedAnnotations and author to define the format.
  • formattedAnnotations — all annotations in the format you defined. You can use any of the variables here, except formattedAnnotations and author to define the format.
  • key
  • version
  • itemType
  • title
  • creators
  • abstractNote or abstract
  • publicationTitle
  • volume
  • issue
  • pages
  • date
  • series
  • seriesTitle
  • seriesText
  • journalAbbreviation
  • language
  • DOI or doi
  • ISSN or issn
  • shortTitle
  • url
  • year
  • accessDate
  • archive
  • archiveLocation
  • libraryCatalog
  • callNumber
  • rights
  • extra
  • tags
  • collections
  • relations
  • dateAdded
  • dateModified
  • shortAuthor - e.g. Silver et al.

I hope you enjoy it.

Any questions, requests, or otherwise? Feel free to reach out (Twitter).

Sign up for my newsletter below 👇 to get updates and be the first to hear when I release new posts like this.

Liked this post? Join the newsletter.