In internet years, Bear 2 is said to have taken “forever” to build. In reality, it was just over three years; five if you want to get technical. We understand that might feel like a long time to many people, so we wanted to share some details of our development journey, why Bear 2 took as long as it did, and how we plan to move faster (at least a little) with future updates.
Caught by surprise
As indie developers, we were simply unprepared for the immense success of Bear’s initial launch in 2016—we received an App of the Year award, multiple Editor’s Choice awards, and millions of enthusiastic users around the world in quite a short time.
It took three years to build the first version we shipped to the world. But after listening to all of the feedback and requests after launch, we gradually realized that our initial foundation for Bear couldn’t handle everything we (and you) wanted it to become.
Our vision for Bear 2 grew to include things like:
- Instant performance even with incredibly long texts (fun fact: some people have written entire books in Bear)
- Support the CommonMark implementation of Markdown as close as possible, while still allowing for extensions to support new features like Backlinks
- Work in all currently supported languages, including Chinese, as well as newly supported RTL languages like Arabic, Hebrew, and Persian
- Fully native, premium feeling apps across Mac, iPhone, iPad, and Apple Watch
- A new foundation to implement other big features coming down the road
Ultimately, this all led to the decision to completely rewrite Bear. It might not look like it to many users, but Bear 2 truly is a brand new app, from pixel to bit.
Indie development is hard
As anyone who has learned about building complex apps like Bear can tell you, this process can be… messy. For example, six months into building our own Markdown parser (more on that later), we realized we had to start over in order to better support our long-term plans and features.
Building Bear 2 actually took around the same amount of time as Bear 1. Although, during this messy and more public process, we were still doing occasional bug fixes and feature improvements to the original Bear.
A lot of the work we do is because we, as a company, place an immense priority on quality in our apps. You may have heard an old motto from a little company called Facebook: “Move fast and break things.” Our approach to software development and design is the antithesis of that idea. The safety of your notes in Bear is vitally important to us. We do an immense amount of work, testing, and re-work with the intention that we never “break things.”
Bear 2 needed to look and feel natural, like it belongs on the Mac, iPhone, iPad, and Apple Watch. This approach to designing unique interfaces and interactions for each platform simply takes time; more time than the ‘write once, run everywhere’ approach of some other apps. However, one major improvement with this new version is that we now share some under-the-hood engine code across all devices. This should be a big help towards implementing new features more quickly.
Destroy to create
A major foundation of this release was completely rebuilding the Editor, the tool we all interact with day in and out. We wanted people to be able to use Markdown without even knowing it, hence the default ability to hide Markdown syntax (though you can disable this in settings).
Bear 2 also needed to outperform its predecessor. It needed to open, parse, and display large notes—even with hundreds of thousands of characters—yet instantly process and render all their Markdown styling, URLs, and wiki links. To give you an idea: Moby Dick, a 206,052 word book by Herman Melville, opens in just 55 milliseconds.
Partway through building this new ‘Editor 2.0’ we realized that it, too, needed a do-over in order to be ready for features coming down the road.
Finally, as good of a Markdown citizen as CommonMark is, it still had a lot of edge cases we needed to account for, especially when building our own custom extensions. For example, Bear’s wiki links and new Backlinks feature are quite popular with our users, but those are entirely custom architecture that we built and made as compatible as possible with CommonMark.
Our own Markdown tools
The final challenge we’ll discuss today involves the previously mentioned Markdown parser. This is the engine that watches for styled content and renders it appropriately. It’s a tool most users interact with daily yet probably never think about, but it’s worth discussing why we decided to build our own from scratch.
Most Markdown apps, including Bear 1, use one of a handful of off-the-shelf Markdown parsers. There’s nothing wrong with that and it’s understandable—these ‘engines’ are difficult to write and there is often not much value in doing so, hence why developers go this route.
But once we stepped back and looked at the scope of our near-term and future goals for Bear, we realized we needed more control. We needed our own, home-grown Markdown parser.
It had to be a stellar Markdown citizen, but also be extensible to build unique Bear features our users love and requested like tables, footnotes, and YAML. It had to be flexible enough to work across all of Apple’s platforms, including Apple Watch, as well as the web.
Our parser became another significant project, taking up quite a bit of development time and resources. But based on the final product of Bear 2 and what we are working on next, it was worth it.
This post is a lot of insider baseball. Hopefully, it is also a useful peek into the process of (re)building an app that is known for its simplicity and natural feel, but is surprisingly complicated.
Thankfully, Bear 2 is here, and we are now in the process of listening to the many, many bits of feedback (thank you!) and squashing some straggling bugs. After a much needed upcoming vacation, we’ll be back to building even more great stuff for Bear.