Back to the talks Previous by track: Making Org-Babel reactive Next by track: org-gmail: A deep integration of Gmail into your Org Mode Track: General

Emacs as a fully-fledged reference manager

Vidianos Giannitsis (he/him) - IRC: vidianos, https://github.com/Vidianos-Giannitsis. Vidianos Giannitsis on LinkedIn vidianosgiannitsis@gmail.com

Format: 21-min talk ; Q&A: BigBlueButton conference room Etherpad: https://pad.emacsconf.org/2025-reference
Etherpad: https://pad.emacsconf.org/2025-reference
Status: TO_REVIEW_QA

00:00.820 Introduction 01:43.600 Capture 04:00.920 Organizing 05:03.479 Ebib 07:55.480 Filters 09:36.179 Dependent databases 12:50.540 Reading lists 15:02.440 Special org-roam-node-find 18:05.640 Annotations 19:21.820 Wrapping up

Duration: 20:14 minutes

Description

Even though all of my note-taking and literature organization infrastructure has been in Emacs for a few years, I haven't been able to make myself independent from a literature manager (Zotero in my case) until recently. Zotero was just too convenient. You can capture articles seamlessly (although downloading attachments didn't always work as intended), organize them in directories and take a quick look at your lists to determine what to read next, before you move on to actually reading them and taking notes.

This year, I finally decided that I am tired of this and I will find a way to do this fully in Emacs. This talk will be discussing my findings in this regard. A lot of this was built in Ebib. It turns out that a lot of what I considered useful for this workflow was already available through this excellent software, built inside Emacs. Not everything worked as I wanted on installation, but naturally, this is Emacs, so I just hacked my way through getting the exact behaviour I wanted. This required integration with other tools and especially a closer interaction between Ebib and Org-roam. This came out incredible and I am now very happy with using it, so I thought I should also showcase it in EmacsConf!

With this integration ready, only capturing articles from the web remains. Zotra can capture articles in a way about as seamless as Zotero's (it actually uses Zotero's translators, but from Emacs). Attachments remain a problem sometimes, but that's publishers making attachments hard to get because third party software can't see that you have full access to them, so I have decided to do those mostly manually, I often did that with Zotero anyways.

Relevant links:

About the speaker:

I'm Vidianos and I'm currently doing my PhD in KU Leuven in Belgium. Working on research means I have a need for good tools to help me with my research. I have been using Emacs for roughly 5 years now and I can confidently say it is the number one tool that helps me with this research. This talk will be all about how it helps me and about finally being able to remove external reference managers from my workflow, something I have wanted for years, but that I haven't managed to do before this.

Discussion / notes

  • Check out the ebib manual for an explanation of the features I showed and more! https://joostkremers.github.io/ebib/ebib-manual.html.
  • My 2022 talk if you're interested in the rest of my workflow regarding scientific literature https://emacsconf.org/2022/talks/science/
  • Use link to directly download bib info to the library is cool. I always did that manually.
  • The reading list, for me every download item will directly inside a manuscript.

  • Q: Which version of `org-ref` you are using? I am so dependent on org-ref and org-mode, so that I had huge resistant to update `org-mode`, `org-ref`, `ivy-bibtex.el`, etc

    • A: I'm not sure how recently I updated, so it may not be master, but I generally try to keep up to date with the packages I use. I generally haven't had many problems, unless when there is a new major version, which may need an afternoon to confirm everything works.
      • Thanks for sharing this.
  • Q: Have you try ivy-bibtex/bibtex-completion.el, how it compares to ebib?
    • A: I think they are not mutually exclusive. I typically use ivy-bibtex to find an article quickly, to initialize a literature note (integration with org-roam-bibtex) or to add a pdf to the entry, where it will automatically rename it as it should. ebib is more of a tool to manage the .bib file more, find an entry with full text search (instead of just Author/Title search) and reading list management. There may be some overlap, but I use both a lot.
      • Got it, quick check with ivy-bibtex etc.
      • ebib is for heavy lifting for academics
  • Q: Do you find showing abstract on your navigation panel helpful? I always delete all the abstract info in my bib to make things little concise. Just want to know you thoughts on this.
    • A: I like showing the abstract. It can be long and reduce visibility, but the whole point of searching with the navigation panel inside ebib is that I cannot easily find it through an Author/Title search. Therefore, the abstract is often the next line of search where you will find what you were looking for, so for me it is helpful. I sometimes also use the small comments I leave on the annote entry for this purpose.
      • Try to find relevent info using search. Abstract helps you search better.
      • annotation entry also help
  • Q: it seems that there's a meta problem here:  too much information.   Do your tools reduce cognitive load?
    • A: There is definitely too much information, but that is an innate problem of handling a lot of literature. I think these tools can reduce cognitive load, because things don't stay in my mind. They can be moved to the computer, which can handle more overload than my brain. So it is to a large extent the externalization that reduces the load, because too much information is a reality with literature.
    • thanks.  Sounds like externalizing the problem is the point.
  • Q: When you download a new article, how do you integrate its file to your database? For example, do you move and rename the file manually?
    • A:Find the file in ivy-bibtex, run M-o, select l (add PDF to library), find from file (f), find where you saved it and it will be renamed automatically. It is not moved automatically, but the rest of my packages know to find it in the folder I save initially. You may look at the README of the package for more details, it is one of the more well written ones in my opinion (https://github.com/tmalsburg/helm-bibtex).
    • Ok, I see, Ivy-bibtex has a function for this, thanks!
  • Q: What about annotations with ereaders. veiwng and taking on emacs or erader touchscreen highlighting and notes, org-noter I think would be an alternative out of ebook anotation alternative?
    • A: I do not use an ereader. For touchscreen, I have a tablet, which runs Emacs natively and I can work with org-noter with touch, but in that case, nothing in the general workflow changes. For books, I know org-noter also works with epub files, so you can also directly take the notes there. If you use an ereader for annotating that doesn't run Emacs, this is obviously more complex.
  • Q: How well do you feel about making notes an web sites, pdf, videos, I know pdf is ussaly good but others I am less sure about?
    • (Not the author) i always try to convert it to pdf, so only one file format to worry about. Video is another story.
    • I agree with the above comment. PDF is just the easiest to deal with in general, so I try to go for it. For taking notes on web sites, there is org-roam-protocol (https://www.orgroam.com/manual.html#org_002droam_002dprotocol although I personally don't use it a lot. Video is much more complex, but in practice, I tend to not annotate videos directly, with a timestamp, but rather to take crude notes on paper during the video and organize them online at a later point.
  • Q: how do you add a new article from scratch, a pdf that you did not have in your bib file? How do you generate the 'bib' entry with metadata and abstract?
  • Q: When you fact check every details for a bib entry? The author names, published journal, doi stuff. Always painful for me when I need to upload a final version of a manuscript. Tons of work. Maybe I can do it at the download step.

  • Comment: I just use Org headings for all the metadata. Why bother with bib files. https://0x0.st/Kvbi.txt With Org, you can search through notes and title and metadata together. I use org-ql, but you can use anything that can search Org headings. And use attachments. can also directly export to .bib from org. with headings, reading list is just natural - assign todo to heading

    • A: You can move this all to org, yes, but I think .bib is very ubiquitous and a lot of tools work well with it, so I haven't really felt the need to move away from it. It is an interesting approach though. I have seen some others use it as well
    • A: Making a reading list is easy indeed. The primary goal of my additions were to be able to manipulate it without ever worrying about the file itself. I find it works better/faster for me if I can always access the content I want without opening the file. Which is mostly what the code I wrote for this does.
  • I noticed that his command searches are automatically prefixed with "^" to prevent more generalized matching (e.g. all comands that have "copy")
    • A: I believe that is done automatically by counsel-M-x. It served for something, but I don't remember exactly why.
  • Q: for viewing pdfs, do you use pdf-tools? I always found it clunky imo.
    • A: Yes, its pdf-tools With org-noter to take notes side by side. And I haven't had any problems with it. It generally works well.
    • (audience): I tend to always call out to the external PDF viewers.
    • (audience): maybe I didn't try it well enough, but I just prefer external viewers. pdf-tools feels like an image viewer to me
    • A: Some external viewers can have more features, but again, the problem comes down to it not being Emacs :D Being in Emacs is better than not being in Emacs.
    • A: Are you sure you are talking about pdf-tools and not doc-view? Because those problems are very much in doc-view, but I wouldn't say for pdf-tools.
  • It's always interesting to watch other people work in their emacs environment.
  • Thanks for the talk! There was a lot to digest, I'll have to rewatch it.

Transcript

[00:00:00.820] Introduction
So, hello everyone, welcome to EmacsConf. My name is Vidianos, and I'm a PhD student in KU Leuven, and today I'm going to be showing you how I managed to use Emacs as a reference manager, replacing what was for me Zotero, to a fully fledged approach inside Emacs. So, what is my typical reference workflow? First I need to find literature, then I need to collect and organize it, which I originally did with Zotero, but now with Emacs centered tools such as zotra and ebib. Then I create a reading list. This is a new addition to my workflow I started doing after moving this approach to Emacs because now everything is well integrated. I have made a very nice reading list implementation inside org-roam which I am going to be showing today. Then obviously I need to read the literature, take notes, organize the notes, and ensure I am actually learning from what I am reading. This is then done through packages such as org-noter and org-roam and is not going to be the focus of this talk. I already gave a talk about this part of my workflow, which I've been doing for many years now. You can find that or you can find many other people's approaches to reading literature and taking notes as it is quite a popular topic in the Emacs community. Lastly, I will have a short section about how I ensure that I can recall the knowledge from this literature very easily through this reference management system. So, how can we capture an article in Emacs? One of the most commonly known packages is doi-utils where doi-utils has a lot of useful things to do and one of them is to capture a paper, but you need a DOI, and for me, that is a bit inconvenient, because what I want to do is that I have a URL here of a paper, I want to just copy this URL, not copy the DOI, and be able to save it immediately to my bib file. And that can now be done through this function zotra-add-entry. And as you can see here, there is also a zotra-download-attachment that sometimes works, but not always. I don't personally recommend it. But the problem is that due to articles being locked behind paywalls in many cases, downloading attachments doesn't work through Emacs. Sometimes it doesn't work through Zotero. Sometimes you just need to go to the browser, say download PDF, and that's the only solution that will properly work. So how do I then add this to the paper? I need to find this paper that is here through ivy-bibtex. This is the bib file manager I use. There is also others like citar. I think citar has much better coding and integration with other packages, but I haven't really bothered to move from ivy-bibtex because it does basically everything I want perfectly. So I go here, say add pdf to library. I find where I saved it, and it will suggest to automatically name it something which is in full integration with the rest of my Emacs packages, and all the literature management stuff knows to find it with this exact name. So it iss saved and now when I try to create a file from this, which I will show later, you will see that the file will already appear there.
[00:04:00.920] Organizing
So now let's go to organizing. Organizing in Zotero is typically done through a hierarchical folder structure. This is very familiar to most people and generally works, but being someone that takes notes using the Zettelkasten method, which has a fully flat hierarchy, nothing goes in folders, everything is in the same folder, and you find everything because it's connected to other things. We have some basic indexes, from where you can jump to different points. I love this structure, so I also wanted to include it in my bibliography management, because with folders you have problems like, this article can go in that folder, can go in that folder, can go in that folder. Where do I actually put it? Do I put copies of it in different folders? It's just confusing and not really practical in my opinion. So I tried to do this approach inside Emacs. And how? With Ebib. Ebib is an amazing software built inside Emacs. It's a reference manager and it works absolutely amazing if you configure it to your liking. So let's open ebib first. This is the interface you will see when opening. Actually, by default you will not see anything, but I have open three bib files. These are opened by default on boot of ebib for me. These are my three main master bib files. This is the Zotero master bib file, which only Zotero can touch. If I change it, it will be overwritten. This is my new master bib, where I save all the files that I have now started using after switching to this approach. And then this is the master bib file for literature related to my PhD and things that I have already read. It's a very convenient interface. There is also search. There is one searching tool, the jump to entry, ebib-jump-to-entry, which searches through all open bib files for the title. So for example, I can search for membrane fabrication, because that's something I am currently doing, and go to this. There is another searching tool, the ebib-search, which searches through the database that you're on right now and it does a full text search, not only in the titles, but everywhere. So, for example, I see that in this paper if I go to the abstract and search for the word FTIR, which is a chemical analysis, it will tell me that it's here. Can it find it anywhere else? It cannot. That's okay. Let's search for something that we'll be able to find more easily, like, for example, membrane crystallization which is a main focus of my PhD. Then it will be able to find it many times, many, many times. I can also search on the next database or on this database and see where is everything that I want. So this is different searching tools which are very useful. Then there's also another tool, that is, filters. So I can filter on any field. Like, for example, let's say on any field, and let's say I'm looking now again for membrane crystallization. This will now filter to all entries. You can see right now there's 18 entries here that mention these two words together in any field. Sometimes this is easier, because this is permanent. It's not like the search that we find one and then if you move, you've lost it, and you need to find it again. This is permanent until I say, okay, cancel the filter. I mostly work with filters, I think they're the most convenient. Then there's also the ebib-list-recent which is another very useful command. It asks you for a number of days and it will show you the files that were added in the most recent. So for example, show me the literature files that were added to this bib file in the last month. I will see five files in this case, because in this bib file, I have mostly entries that I have read, these are the files I have most recently read and added here. While if I go for example here and say that, these are files that maybe I haven't read yet, but I was planning to read. So this is something useful. Although for things I'm planning to read, I mostly use the reading list that I'm going to show next.
[00:09:36.179] Dependent databases
But before that, a few more neat things that you can do in Ebib. So I have a list of dependent databases. For ease, I have already opened them here. These, as you can see, have two brackets here, indicating that they're dependent on phd_literature_1.bib, and these, in my case, act as the sort of index file, where I am tagging things based on the structure that I wanted to have for the organization. So all the organization is flat, all the literature is in phd_literature_1, however, I have this file that has 14 entries. I have another file here that has 20 entries. And these are smaller indexes where I can find things easier, but things are not limited to one of these. Things can be in all of these, or probably not all of these, but can be in three or four of these very easily. And how you add things is that I go here, and I say not r, it's... M for the dependent databases, and I add entry, and it will tell me "Where do you want to add this?" So when I read a new paper, I can say okay, this is related to these three tags, and this is sort of like, again, it's tagging it and it's putting it there, there, and there. And then this creates a flat structure that however has a great organization, similar to how Zettelkasten works and I really like working with something like this, with dependent databases. Another feature that I really like, another feature that exists by default... But if I tag, this tagging is done through "m", and then I can tag different files here, and this is to do different actions with these together, such as, for example, copy them to a different file, with "x" I can export the entries somewhere else, there are many things that you can do when you mark them. By the way, one of them is this function, which sees everything that I have marked and shows me an org-roam-node-find entry that is filtered to just these files. I can select one and it will take me to my notes on this specific paper. I find this very useful, because I can be looking for something and I can say, okay I remember, or I did some filtering, and I know it's in one of these files and now I want to see my in-depth notes on each one to remember where exactly I found it. So I find this kind of filtering, this org-roam related filtering, to be also very effective.
[00:12:50.540] Reading lists
So now let's finally move to reading list. The reading list in ebib reminds me a lot of the philosophy that Emacs uses. By default, it is extremely bare bones, not very usable, but it is so customizable, to where you can do anything that you can imagine through it because the limit truly is your imagination. It's how much you can code into this that actually makes sense and you can actually imagine it working. Besides that, you can do anything really. So we can open ebib and try to find this paper that I just added here. Then we can create a reading list entry from it. Here, my reading list prompts me for a priority for this. How urgent it is for me to read this. It adds a TO-READ, which is a todo entry, which helps with organizing my reading list, because as you may also be able to see, this has an ID, because this is an org-roam node, so the TO-READ allows me to organize it inside org-roam. It saves the citekey, the link to the paper, and also tags it with the parent file node because I don't like having orphan nodes in my Zettelkasten. I like everything to be linked to at least one thing. So everything in the reading list is linked to the parent file. And now I can find this in the org-roam-node-find menu, here. However, that's not very interesting. In practice, my typical org-roam-node-find does not even include these reading list files because I don't really care to have them there.
[00:15:02.440] Special org-roam-node-find
I have a special org-roam-node-find that is designed to find these in particular. And here these have 22. These are the amount of files that are currently in my reading list. So for example, let's try and press here. And magically, this prompts me to select a capture template, because what it's doing is that I selected this, and because of the citekey, it knows that it wants to create a new node for that. So I select the capture template. It knows that it wants to create this new node for this. And now, if I for a second close the reading list, now I can already go ahead and take notes on this. This is org-noter, in particular, and it makes it all very easy because it's all integrated in one place. If I then close this and open a new Emacs, we have this, and the reading list allows me to very quickly go from this being reading this item to initializing it. Another thing that is very useful is that everything is sorted by priority. So I need to increase the font size again because I closed the previous Emacs. So here, I can select what is high priority, what is low priority. I can also change the priority without needing to be in this file. Let's leave this file. I can say, okay, I decided that this file is priority B. It needs to be A, which is more urgent. In my system, there's five different priority levels. You can get away with less but I like to have the very much low ones as this is not urgent at all but I want to keep it somewhere. A is very urgent and B is urgent but just below A. And then the C in the middle is just I will eventually read this but not something I want to focus my attention on right now. So this is mostly about reading list. I can also show, for example, I have this if I finalize something, if I read it. For example, I created a note for this new thing. Let's say I finished reading it. I want to remove from my reading list. It's also just one command and it's done.
[00:18:05.640] Annotations
If we now return to the presentation, the last thing I want to show is annotations. So for annotations, it's the idea that sometimes you just need to find something in Ebib quickly. So I'm here and I'm looking for something. I said I'm here and I'm looking for something. And as you can see, there's the annote file everywhere, the annote entry, which is a very very small description of things that I want to remember for this paper. So I can be scrolling here or scrolling in one of the smaller files and saying this was in this subsection, and which paper was it, and I can scroll, read all these annotes. Each annote takes like 15 seconds to read, and really decide, okay, it was this paper that I wanted, good. Now I can open the note for it, go there, and it's very easy.
[00:19:21.820] Wrapping up
So I think that's all. I would like to thank you for your time. I would love to see your questions either in IRC, I will be, maybe I've already answered some of your questions there in the Etherpad, or right now, we're going to the live Q&A where I'd love to interact with everyone and have a discussion. However, if you don't have any questions right now, but you have a question later on, feel free to send me an email. My mail is also on the site. And if you're curious how all this "magic" worked, feel free to go to my Github and see the ebib section here that will also be linked in the doc page, where you can see all the configuration that I have done in Ebib for everything to work. Thank you again and have a wonderful EmacsConf!

Questions or comments? Please e-mail vidianosgiannitsis@gmail.com

Back to the talks Previous by track: Making Org-Babel reactive Next by track: org-gmail: A deep integration of Gmail into your Org Mode Track: General