June 16, 2012

Hey folks, we’ve got a big update for you today.

Redesigned Artwork

First and foremost, we have redesigned all of the artwork to include full retina display support for the new iPad. Here’s a peek at what it looks like:

Recipes Screen (Paprika for iPad v1.6.0)

As you can see, we have made a few subtle tweaks to the user interface to make the iPad app more consistent with the other versions of Paprika. In particular, we have extended the recipe rows all the way to the sides like we do in the Mac and iPhone versions.

Also, notice the new Top Rated category, which sorts your recipes by their star rating.

For users with many recipes, you can now enable an alphabetical index bar to help you quickly scroll through the recipes list. This can be turned on in the Settings panel.

Finally, we have also added a condensed recipe listing which you can access by pinching the recipe rows to shrink them. Prefer the old look? Just zoom back out to restore their normal size.

Recipe Screen

We have also made several user interface tweaks to the recipe screen, here’s a look at the new version:

Recipe Screen (Paprika for iPad v1.6.0)

Notice that we got rid of the old ugly actions bar, and moved the primary recipe actions into the toolbar.

Also introduced in this update are ingredient marking and direction highlighting. Simply tap one of your ingredients to cross it off, so you can easily keep track of what ingredients you have already used. Same for directions, tap to highlight your current paragraph, so you can more easily keep your place while cooking.

In the previous version of Paprika, the buttons for editing notes and nutrition were in a bit of an awkward location. We have moved them to the same editing panel as the directions - a more intuitive location that better matches how they are displayed.

Unified Ingredients/Directions/Notes/Nutrition (Paprika for iPad v1.6.0)

Tools

The recipe toolbar now contains a tools button, which replaces the previous timer button. The tools button allows you to start multiple timers, access a simple unit converter, and scale your recipe’s ingredients.

Tools Button (Paprika for iPad v1.6.0)

Meal Planner

To make the meal planner easier to use, we have added support for a new gesture that allows you to change the currently selected week by swiping left and right between weeks.

Additionally, you can now customize the start day of the week in the Settings panel.

Finally, when you open a recipe from the meal planner, closing the recipe returns you directly to the meal planner, instead of navigating you back to the recipe screen.

Accessibility

In order to make sure Paprika is accessible to vision-impaired users, we have gone through the app and made sure every screen is compatible with VoiceOver.

Internationalization

We have updated Paprika with translations for 15 different languages, so users can now natively run the app in the following languages: English, French, Spanish, German, Chinese, Czech, Danish, Dutch, Finnish, Hungarian, Italian, Japanese, Norwegian, Portuguese, Swedish.

Other Improvements

  • You can now export your entire recipe collection to HTML.
  • Bookmarks will now sync via Paprika Cloud Sync.
  • We have improved the email and print formatting for recipes, grocery lists, and meal plans.
  • Added a Clear Purchased button to the grocery list.
  • You can now remove a recipe’s existing photo.

Bug Fixes

  • Fixed issues scrolling the text box when you are editing the ingredients or directions.
  • Fixed problems some users were having when upgrading from earlier versions of the app.
  • The ingredient scaling and grocery list now correctly understand fraction characters.

There are numerous additional bug fixes and memory management enhancements that are too obscure to be mentioned here, but suffice to say that the changes should make the app more stable and run more smoothly than before.

Thanks for all of your support, and stay tuned for more!

November 16, 2011

For the Thanksgiving Cook, a Recipe Manager to Celebrate The New York Times

October 15, 2011

We’ve got a really cool new update for you guys!

With past versions of Paprika, in order to capture a recipe from a website, you needed to be using Paprika’s built in web browser. That works alright, but if you’re like me, you’re often using your regular web browser when you come across a recipe you want to save for later.

Well, we’ve just released a new bookmarklet that allows users to capture recipes from any web browser, instead of having to use Paprika’s browser. Simply install the bookmarklet in your regular browser, and use it to capture recipes instead.

The bookmarklet can be set up here: https://www.paprikaapp.com/bookmarklet/.

It just requires a Paprika Cloud Sync account to know where to save the recipes to.

When you use the bookmarklet, recipes will be automatically saved to your Paprika Cloud Sync account, which will then be synced with your iPhone/iPad/Mac versions of Paprika the next time you open the app.

Try it out and let us know what you think!

August 27, 2011

Ever since we launched Paprika Cloud Sync last December (a service that automatically keeps your recipes, grocery lists, and meals synced between the iPhone, iPad, and Mac versions of Paprika), people have been asking us why we decided to build our own sync solution instead of simply using Dropbox1. We actually did initially consider basing our sync on Dropbox, but quickly realized that it was not a feasible solution for the type of data we needed to sync, and ended up deciding to roll our own solution.

In this post I want to explain the motivations behind our decision. There are many other apps out there that could benefit from implementing a cloud sync solution, so hopefully this will be of interest to other developers out there as well.

Database driven apps vs File driven apps

Paprika is a database driven app that utilizes Apple’s Core Data framework to store its data. Core Data is very useful for storing large amounts of data, storing relationships between different types of data, and presenting it in an efficient manner. It is a great tool for the type of data that Paprika needs to store (albeit a bit quirky in some places). However, using a database driven approach does have certain implications when it comes to syncing.

In a database driven app, all of the data needs to be maintained in a coherent state in order for the app to be fully usable. In Paprika, recipes can be organized into categories, added to the grocery list, and added to meal plans. This means that there is a large web of relationships (between recipes, categories, groceries, and meals) that needs to be synced simultaneously.

In contrast, a file driven app treats each file as an individual unit: the file can be synced individually without affecting any other files, and the app can still be used even if not all of the files on the server have been properly synced down. If a sync gets interrupted on a certain file, none of the other files are affected, and you can simply re-sync the last file from where it previously left off.

As you can guess, Dropbox uses a file based approach to cloud storage, which means it works quite well for file driven apps, but is not so great for database driven apps like Paprika.

Goals

There were several major goals we wanted to achieve with the sync:

  1. Keep it fast.
  2. Allow multiple users to make simultaneous changes to the same data and intelligently resolve conflicts between users.
  3. Safely handle sync interruptions, and be able to resume the sync from where it left off.
  4. Allow the user to continue using the app while the sync runs in the background.
  5. Safely handle data migrations as users update to new versions of the app.

Keep it fast.

Obviously from a user experience perspective, the faster the sync runs, the better. But this is especially important for us because we expect our users to be syncing at the grocery store, and in other places where they might not be on a fast wifi connection. Because each recipe contains a decent amount of text (along with a photo), and recipe collections tend to grow rather large over time, there is potentially a large amount of data to be sent during each sync.

The basic strategy to keeping the sync fast is to minimize the amount of data that needs to be transferred during each sync. The first thing we need to do is compress all data that is being sent to and from the sync server. Additionally, to prevent unnecessary data transfer, we also need to keep track of which recipes have been modified between syncs, and only upload recipes that have actually changed. This ensures that we do not waste time uploading recipes or photos during the sync process unless we are absolutely sure that they need to be transferred.

The techniques necessary to implement this strategy are beyond the scope of what is provided by Dropbox’s file based API.

Allow multiple users to make simultaneous changes to the same data and intelligently resolve conflicts between users.

Because Paprika is a recipe and grocery list organizer, we expect that a single recipe database will be frequently shared between multiple users across multiple devices. For example: a husband and wife that share an iPad but have individual iPhones. This means that we need the ability to allow multiple users to make simultaneous changes to the same database, and these changes need to be successfully merged together when a sync occurs.

There are many different types of conflicts that can result from two users editing the same data on two separate devices, and each conflict needs to be resolved individually. For example: if one user modifies a recipe while another user deletes the same recipe, the deletion needs to be undone, and the sync should preserve the recipe modifications.

By building our own sync service, we were able to design it to intelligently handle merging these types of conflicts during the sync process.

Safely handle sync interruptions, and be able to resume the sync from where it left off.

Interruptions can definitely occur during the syncing process (say, due to disconnection). There are two main issues to address after an interruption occurs:

  1. The interruption needs to be safely handled to ensure that the database was not left in an incoherent state, where half of the data was synced but the other half was not. This needs to be ensured both with the data on the client device (iPhone/iPad), as well as the data on the cloud server. Otherwise, it could cause strange behaviors or even data loss.
  2. The next time a sync runs, it needs to be able to resume from where it left off. It would be massively inefficient if every time a sync was interrupted, it had to start over from the beginning.

Addressing these issues is difficult to impossible without fine grained control of both the client and server during the sync process.

Allow the user to use the app while the sync runs in the background.

Despite the optimizations described above to keep the sync fast, there are definitely cases where running a sync will take a long time. For example, if you are syncing a lot of recipes for the first time, or if your internet connection happens to be unbearably slow. In order to maintain the best user experience, we wanted to make sure the user could still interact with the app while the sync runs in the background. The consequence of this decision is that the sync process must be fully integrated into the app itself, and not tacked on as an afterthought.

Safely handle data migrations as users update to new versions of the app

As we continue to introduce new features to Paprika, database changes may occur between each version. Every time a user upgrades, their database must be safely migrated to the newest version. Even in absence of a cloud sync, this process is already quite tricky to implement.

But with a cloud sync, it’s even more complicated: what if a user upgrades Paprika on their iPhone but not the iPad? Both versions still have to be able to safely sync together despite having different database models. This is another scenario that requires fine grained control of both the client and server during the sync process.

Our Decision

All of these factors led us to decide that Dropbox was not a feasible solution for our cloud sync service, and that we should build our own solution that could properly minimize data transfer, intelligently handle merging conflicts between users, safely handle interruptions during the sync process, and safely handle data migrations during upgrades.

Don’t get me wrong, Dropbox works great if your app needs to sync individual files, and there are a lot of apps that work with that model: text editors, document editors, comic book readers, PDF readers, etc. With those types of apps, the user is mostly operating on one file at a time, and the files are completely independent from one another. You will rarely have conflicts during the syncing process, and each file can be synced individually without affecting any of the other files in the collection.

But for Paprika (and most other database driven apps2), building a Dropbox based sync is not a feasible solution.

  1. To be specific, this applies not only to Dropbox, but any file based sync solution.
  2. We’re not the only ones to have reached this conclusion. </sub>
August 25, 2011

It has been about two weeks since we released Paprika for Mac. We had a great launch week, and were featured by Apple in the New and Noteworthy section of the Mac App Store the following week.

During that time I am very happy to say that Paprika made it to the number one spot in the Lifestyle category in the Mac App Store!

Paprika for Mac Reaches No. 1 in Top Paid Lifestyle Paprika for Mac Reaches No. 1 in Top Grossing Lifestyle

Paprika for Mac also managed to climb up to No. 39 on the overall Top Paid chart.

Thank you all for your support, and happy cooking!