2023/08/21

Future-proofing Evernote’s foundations

Before diving into some of the recent developments at Evernote, let’s quickly address the elephant in the room (well, the other one).

The past seven months or so have been full of change, leading some users to express their uncertainty about our long-term intentions for Evernote. To be clear: Bending Spoons took the reins to help Evernote thrive once again, not as a way to make a quick buck. Our long-term vision required some short-term pain, and that’s regrettable. But it was also necessary—Evernote wouldn’t have survived, let alone thrived, otherwise. Ultimately, Evernote will be a lot stronger for it. Indeed, while a few short months ago Evernote’s prospects were rather gloomy, we can now look to the long-term future with genuine optimism.

Our focus is on making Evernote your secure and reliable second brain. A fast, infallible database of your most precious information, which you can easily retrieve whenever and wherever you want. This idea isn’t new—in fact, it’s the foundation on which Evernote was built nearly 20 years ago. But as the company’s stewards our immediate priority is to make the fundamentals far more solid than has been the case, and deliver upon this decades-long shared vision.

So, the question facing us is this: How can we deliver the unwaveringly reliable, unerringly fast product that you need? The answer is long and it isn’t straightforward, but I’ll do my best to express it in this blog post and other communications going forward.

A final word before I begin: What follows is by no means exhaustive. I’ve limited the post to three key areas, but there’s plenty more going on that you’ll learn about in due course.

An important first step: Speed and synchronization

Every journey begins with a first step. Ours took place in May 2023 when we introduced the new sync process that powers Real-Time Editing (RTE). Our goal was to bring you the fastest note synchronization to date with seamless simultaneous note editing on multiple devices. At the same time, we aspired to end same-note conflicts.

This ambitious project required that we introduce a brand new data structure (Conflict-free Replicated Data Types, or CRDT) powered by a strong implementation (Yjs), which allow us to sync the content of your notes instantly across all devices—something that wasn’t possible with the previous HTML-style note format.

I’m happy to share that the roll-out of this important new structure and system is complete. The transition period had its challenges, but implementing something as foundational as RTE inevitably brings with it the possibility of disruption, even after extensive preparation and pre-emptive troubleshooting. We were prepared to encounter a few bumps along the way, and confident in our ability to overcome them. We’ve learned a lot through this effort. And the Evernote user experience is now considerably smoother and more reliable for the overwhelming majority.

Speed: Ironing out the final wrinkles

Despite being a net positive, the introduction of the new sync powering RTE did see some Evernote users experience a slowdown in note-loading speeds. Part of this was to be expected: The first time a note is opened with the new RTE note system, it needs to pass through a conversion process and takes a couple of seconds to load. After this first time, notes should open and sync instantly.

However, some users reported significantly slower note-loading times, even after notes were converted to RTE. The issue was caused by the system’s note processing in some very particular cases, which led to the abnormal generation of huge histories. Aside from slow note-loading times, we observed that this was increasing the probability of other issues, like missing content and task syncing.

Once we identified the cause, we quickly implemented the necessary solutions. This involved fixing three performance-related bugs within the backend (fixes released on June 15, June 27, and July 20—we’ve since contributed these fixes to the open-source community in the Yjs library). Almost immediately, we saw the return of healthy note loading times on affected accounts. We encourage anyone still experiencing an issue to make sure they’re using the most recent version of Evernote, then contact support if it persists.

Navigation: Important changes under the hood

Some of the improvements we’ve been making take place deep within the product, far from the user’s day-to-day experience in the Editor. The most important of these is the complete rewrite of the Evernote Desktop and Web navigation system, which took place at the end of July (version 10.59). On mobile the navigation system was also heavily updated in the same period (version 10.52). Essentially, the navigation system determines how all the different components of the app relate to one another. On mobile the change is close to invisible, even though navigation now uses native APIs, which will help improve performance. The only hint is in the new URL structure on desktop:

www.evernote.com?b=<notebookID>&n=<noteID> → 

www.evernote.com/notebook/<notebookID>/note/<noteID>

What looks like a small cosmetic change is actually the key that unlocks our ability to easily expand the navigation system as the product evolves in the future.

Monolith migration

Another invisible-but-critical change that’s taking a lot of work from multiple teams is the migration of the Monolith. I’ll need to nerd out for a minute, bear with me.

The status quo

The Monolith is an old Java Enterprise Edition (JEE) application that runs the bulk of Evernote’s business logic on the backend. As such, it powers the storage and synchronization of multiple entities, including notes.

Before we started our work, the database was running on the same machine as the application layer (JEE for application, MySQL for the database). This made the machines extremely heavy and difficult to manage. Both the codebase and the underlying infrastructure had accumulated significant technical debt. Thankfully, microservices like RTE are helping us move away from this approach.

What’s next

Our approach is to focus on cleaning up the codebase and paying off technical debt. We’re already making significant progress with the infrastructure—indeed, we recently rewrote the entire production infrastructure using modern technologies.

In rewriting it, we also separated the application and database. The database is now being migrated to a new and much more modern infrastructure, which substantially improves security and reliability. Before, configuration was managed by Puppet. Now, everything is packaged as a Docker container. This new production environment is much more similar to the development one, which is helpful for developers and means it’s much easier to verify that changes we implement have the desired effect. In short, fewer errors, and quicker fixing of those that do occur.

The work doesn’t stop here

In the next few months, we’re doubling down on solving bugs to ensure a completely smooth experience across all platforms. Beyond that, we also plan to improve the reliability of Tasks synching and significantly boost speed in the Evernote client (I have some early tests that are giving great results on the Web client, which I hope to share with you soon).

And while the core features and experience are our number one priority today, this doesn’t mean that we’re overlooking the importance of innovation. A small group of users (employees and Evernote Experts) is already testing AI-Powered Search, and the feedback has been enthusiastic and encouraging. But our ambitious plans start with making sure the foundations are rock solid. After that, the sky’s the limit.

Until next time,

Federico