Zettlr 3.0.0 Released

Zettlr 3.0.0 Released

After 14 months of intensive development and testing, we are proud to present you the biggest update in the history of Zettlr. Read everything you need to know about this all-new version!

Zettlr 3.0.0 Released

Zettlr 3.0.0 Released

Today we are extraordinarily happy to announce to you the release of the next iteration of your favorite text editor: Zettlr version 3.0.0. As is customary, we accompany this launch with a blog post introducing the various new features that have made it into the app and guide you towards working with this all-new release.

Because of the long time since the last stable release — 2.3.0 is more than a year old —, be prepared for a somewhat lengthy post. Zettlr 3.0 really is a giant leap forward in terms of functionality, ease of use, and quality of life features.

We celebrate this release not just with the app itself, but also with a facelift of the surrounding ecosystem: The documentation has been completely reworked to match the new feature set, we have created an entirely new landing page for the app, and we are proud to present an entirely new icon for Windows and Linux. In addition, there have been many other small changes so that everything Zettlr is now up-to-date.

As this post is longer than usual, use this table of contents to navigate directly to the sections of interest to you:

Introduction: The Road Behind Us

When 2.3 has been released, we already had a vague vision of where the journey should go. Shortly before 2.3, the main component of the app – the CodeMirror editor – has released an all-new version that radically changed everything. So we decided that this is the best time to fully re-work the editor. Additionally, there is one feature that we really wanted to make and that has been on our to-do list for several years: split views.

So after 2.3 had been released, we decided to tackle those issues first. Due to the extensive changes that we were able to incorporate into the app after those two features, we knew relatively soon that the next release would not be 2.4, but rather 3.0 — too much has changed for the better.

After this decision to prepare for a new major release, we decided to open up many more construction sites where some legacy code prevented us from improving existing features or incorporating entirely new features. So we agreed that we would take our time to make everything right with Zettlr 3.0.

(Spoiler alert: Of course not everything is right; there’s always something else to do ;)

In the end, we cramped in everything that had been on our to-do list for sometimes several years, and afterwards ensured that we fixed as many bugs as possible.

The end result is quite impressive:

Over the past 14 months, 13 contributors have made almost 1,300 commits to the main repository, changing over 700 different files and the changelog for 3.0 contains more than 400 lines.

At this point we really want to give a huge shoutout to the Zettlr community: Many users have diligently tested the beta releases, downloaded nightlies to test if some bugs have been fixed short-notice and gave an incredible amount of feedback so that Zettlr 3.0 is not just a quantum leap forward, but also the most stable release we’ve ever had.

So let’s dig in to all the shiny new things!

At a Glance

First, a bird’s eye overview over the new app. The major features we’ve introduced are a split view and the ability to create multiple main windows, pinned tabs, a status bar, and a LanguageTool integration for much, much better grammar and spell checking. Furthermore, we have massively increased the power of the importing/exporting system. This allows you for the first time to create custom profiles for exporting any format you can dream of, including Beamer slides and reveal.js presentations that are tailored to your own needs. Lastly, the tag manager and graph view have received updates, and many things have changed “behind the curtain” — things you probably will only notice in a more stable experience.

Migrating from 2.3

For this release, one thing is really important: how to properly migrate from Zettlr 2.3 to 3.0. While we aim to make any migration zero-effort for our users, for Zettlr 3.0 we decided to fix a large amount of sometimes questionable decisions in how the configuration is stored and how things work. So here’s the quick rundown of what you need to know before you update from 2.3:

  1. All your open files will be closed. So if you have a specific set of files that you need to keep open because you’re in the mid of a project, note down their names so that you can immediately reopen them after updating.
  2. If you relied on the “in-memory” file feature, you need to know that there are no more unsaved files in Zettlr 3.0. The code we had to provide in order not to mess something up was too brittle, and the trade-off between comfort for the users versus maintenance costs was not worth it anymore.
  3. Two settings have changed their defaults for this release: “Avoid new tabs” is now false by default (because too many tabs are less of a problem thanks to the new split view) and “Load remote changes” is now true to allow for a frictionless experience.
  4. If you’ve gotten used to using the Quicklook windows: we have removed this functionality completely. Now, we recommend you either use split views (because, let’s be fair: Quicklook windows were only a crutch for the missing split views) or several main windows.
  5. We have reworked the profile system. Instead of having a fixed set of profiles you can now create as many profiles as you want. This means two things: First, Zettlr only ships with a small set of initial profiles that allow exports into the most commonly used formats, because you can create new profiles on the fly. Second, your old profiles will remain, but we recommend you either rename them properly (because they will have the old, less informative names of the format import.format.yaml and export.format.yaml) or remove them.
  6. We have removed the reveal.js exporter. Therefore, if you have reveal.js presentations, you’ll need to adapt them. Pandoc can export reveal.js directly, but requires a somewhat different format. Please look in the release notes of Zettlr 3.0 for a quick how-to.

We recommend to back up your settings first before updating, just to be on the safe side, but we’ve ensured that the update process should work smoothly.

Now after this is out of the way, let’s talk features!

The New Split View

The probably most exciting new feature is the split view. It has taken a long time to properly implement, but we are absolutely stoked about the new possibilities this enables. By default, Zettlr will still open new files in the same, main editor area. However, now you can move files to other panes so that you have two or more files side-by-side. You can edit all those files, view them, and become much more productive this way.

The split view works just as you would expect it. To create a new pane, take a file from the tab bar and move it around. As soon as you move it towards any of the four edges of the editor area, a blue shimmer will appear, indicating that you can split the editor into that direction. Drop the file there to make the split and move the file into the newly created editor split.

With a bit of training you can create entire mosaics of files. For example, to show one file to the left, and two files vertically to the right, first create a split of the main editor area to the right. Then create another split of the right editor pane to the bottom.

Of course, you can resize those areas as you see fit to make one area larger than the others. If you want to close one of the editor panes, simply move all files away, or close them. As soon as the last file in a pane is gone, the pane will close automatically.

As soon as you have multiple panes, you can also move files around without creating new splits by dragging and dropping their tabs onto either the center of the editor area, or the tab bar.

If multiple files within one window aren’t sufficient (for example, because you have multiple displays and want to distribute your open files between those two), you can also create more windows. And, inside each window, you can create as many splits as you want. The sky really is the limit.

Pinned Tabs

We all have those one or two “meta files” that contain, for example, a TODO list, that have to be open all the time. However, closing a file accidentally is easier than one sometimes thinks, and having to reopen those files every time is tenuous.

In Zettlr 3.0, you can pin tabs from their context menu. When a tab is pinned, two things change: First, those tabs will always be sorted to the left of the tab bar, before any other file. And second, Zettlr will prevent closing them at any time: whether you accidentally hit the “Close Tab” shortcut, click with the middle mouse button, or else. To make the tab closable again, unpin it first.

Automatically Update Wikilinks/Internal Links

One feature that especially the power users have continuously demanded is the automatic renaming of wikilinks upon renaming a file. When you use a Zettelkasten system and link between files using their filenames, you sometimes face the situation that you have to rename a well-connected file. What happens when you rename a file? Until 2.3 the answer was: nothing; and all the links to that file will break.

For 3.0, we finally implemented a feature that will take care of that. As soon as a file is renamed, Zettlr will check if any other file links to the one you just renamed, and offer you to replace all the old links with links to the new filename. This way, even if you have extremely interconnected webs of notes, you won’t break any connection.

The Redesigned Profile System

Another big change that increases your freedom by a large margin is the redesigned profile system. This is something we’ve had on our plates for some time, but only managed to implement for Zettlr 3.0.

Specifically, Zettlr is now much smarter when it comes to profiles: Instead of having to use a fixed set of profiles, Zettlr now opens all profiles that it finds in its profile folder and looks at the “reader” and “writer” properties to determine if the profile can be used to import files or export them.

This now means that you can create multiple profiles that perform the same export (e.g., to HTML), but with different settings. One thing that is now possible, for example, is to create one profile per journal or conference where you would like to submit to.

For example, if you want to submit one paper to the FaCCT conference, and one to an IEEE conference, you can now download the corresponding LaTeX templates and create special profiles that allow you to export using those. The process is a bit involved, which is why we have created an extensive guide that shows you how it’s done!

And that’s not even it: with the new profile system, we hope that you folks will come up with some great templates and profiles and share them so that we can create an entire ecosystem of templates that simply work! You can drop any profile into the corresponding folder and start using it.

The Status Bar

Another feature that Zettlr 3.0 ships with is actually a relatively old idea: the new status bar. Active by default, it shows you some specific information for the file that is currently shown in the editor. Its contents depend a little on what file is loaded, but for Markdown files, it includes a small control to quickly switch the Magic Quotes setting. This comes in handy especially if you’re writing bilingually, since you can easily change between English and French quotation marks, for example.

Also, the “Readability Mode” toggle has moved there. Indicated by an eye-icon, you can now toggle the readability mode for each Markdown file separately. Since the status bar has more space than the toolbar, both word and character counts are shown side-by-side in the status bar, giving you more insights into your text as you write.

If you have activated the LanguageTool integration, another control shows you the status of LanguageTool, for example if the last spellcheck was successful, and what language the spellcheck is being performed in.

Lastly, the status bar gives you access to all warnings and errors that Zettlr has found in your document: By clicking on the info, warning, and error indicators to the right of the status bar, you can open a panel that shows every issue detected in a comfortable list.

This brings us to the next new feature:


One new feature that the new CodeMirror version has introduced is a built-in linting functionality. Linting is the process of taking some piece of text and checking it for various things. For example, a Markdown linter could look at whether your document is properly formatted (e.g., did you leave an empty line before and after each heading?). A spellchecker is also a form of linter, because it checks words for spelling errors. Lastly, LanguageTool, which new integration we will introduce below, is also a linter as in that it checks your spelling, grammar, and style.

This has three decisive benefits for your own writing process: First, instead of just a spellchecker you now have plenty of different linters for different purposes. Second, if you have the status bar activated, you can open a comprehensive list of all issues that any of those linters has found in your text. And third, we have implemented this in a pluggable form, meaning that the integration of new linters is as easy as it can possibly get.

Do you have an idea for a new linter that might improve the writing experience with Zettlr? Let us know!

LanguageTool Integration

This is something we are incredibly excited about: The novel LanguageTool integration. Most of you will know Grammarly, the service that can check your text for errors. However, Grammarly is closed source, and additionally is removing the ability to write integrations. So we decided to add a LanguageTool integration instead.

LanguageTool is an Open Source service that can check your spelling, your grammar, and your writing style. Additionally, it automatically detects the language you use in your documents, so you don’t need to change it manually every time. Then, while you can use their official servers, we know that the Zettlr community is very privacy-conscious, and thus, if you prefer not to send your texts to a third-party service, you can run LanguageTool locally on your computer.

Since that process can be somewhat tricky, but we did not want you to miss out on a privacy first version of LanguageTool, we have written a guide to help you get started with your own, local LanguageTool!

Hunspell Integration

This is more of a feature for the old veterans of Zettlr. For the most part of the past six years, Zettlr shipped with a spellchecker that supported the common Hunspell format. Hunspell is a spellchecker that is used by, e.g., LibreOffice and OpenOffice, by Firefox and Thunderbird. However, the Zettlr implementation of Hunspell was not as powerful as the official version, and so large dictionaries such as the Italian or Portuguese ones made Zettlr crash.

For Zettlr 3.0 we have finally fixed this by integrating the proper Hunspell implementation. Now loading any dictionary – including complex ones – works without a flaw!

Updates to the Tag Manager

One thing that we have shamefully ignored for a long time was the tag manager. Meant to make working with entire tagging systems easy, the tag manager was sorely lacking in functionality.

For Zettlr 3.0, we gave it a facelift, and so now you can do much more with it. Instead of only allowing you to specify colors for certain tags, you can now assign colors to existing tags and, most importantly, rename tags. If you rename a tag, Zettlr will attempt to replace that tag across all your files, which allows you to consolidate your tags with ease.

Conclusion: The Road Ahead

As you can see, Zettlr 3.0 really is the largest update the app has ever received. Besides the major features we have introduced here in this post, there are countless bug fixes, small enhancements, and improvements across the board — too many to list them all here.

If you want a list of everything that has changed, please read the always up to date Changelog.

We would like to conclude with a look ahead. Zettlr 3.0 brings it up to speed with other competing apps that have been around less than Zettlr but have enjoyed much more support and thus could develop faster, but it is obviously not the end of the road.

There are a few short-term, mid-term, and long-term aims that we have for the app. While those are always in flux and will change as time goes by, the things that we would love to implement next are the following.

The first big construction site we are going to start is a revamp of the settings dialog. When we started developing the app, there were only a few settings, and thus we could just drop them on a single page. Later on, we sorted them into tabs as their number was growing. But today, there are so many settings that even the tabbed system is reaching its limits. Even for Zettlr 3.0 we would have needed more tabs, but had we done this, the settings window would have become cluttered and difficult to work with.

The past year we have spent with a UI/UX artist to work on a redesign of the settings that will make the entire window easier to navigate. In turn, this will give us the freedom to add as many new settings as we need. Zettlr always has been a completely customizable program, and we want to keep it that way.

Another issue that’s high up on our TODO list is the integration of a Quarto exporter. Since 2022, Quarto has become one of the most influential exporting systems for academic publishing pipelines, and while it hasn’t yet made its way into Zettlr, the groundwork is laid out: the app can already detect if Quarto is installed on your computer. The only thing left to do is allow you to export *.qmd-files with Quarto instead of Pandoc.

There are other things we really want to add to the app, but for now, we are happy that we are able to present you with such a big update and hope that it’ll greatly improve your experience while working.

Zettlr may be one of the oldest Markdown editors around, but it is only at the beginning of its journey. There’s still so much more to see. We appreciate your support and hope that Zettlr 3 brings you the joy in writing that you deserve!

Always remember: Publish, not perish!