Umai, an offline-first Recipes Manager

Umai

Homepage | Source Code | Report Issues

License: GPLv3
Author: Noel De Martin

Umai is a simple Recipes Manager to collect all your precious recipes.

  • :green_book: Create your own cookbook.
  • :sparkles: Import recipes from any website.
  • :mage: Adjust ingredient quantities automatically.
  • :man_cook: Share recipes with your friends.
  • :iphone: Use it completely offline (it’s an offline first PWA!).
  • :closed_lock_with_key: Keep data safe in your Solid POD.
Screenshots

7 Likes

Impressive. Thanks

1 Like

It’s great to see it’s announced here. Very elegant interface. Though unfortunately it has some i18n issue :joy: (Doesn’t work with Chinese content.)

I noticed “offline-first” this time, which triggers my alarm about CRDTs (I see you mentioned this elsewhere) – I’m trying to understand how CRDTs work and how to work with Linked Data for a synchronization mechanism like CRDTs (thus enabling the possibility, though maybe not very useful, to use Solid Pod as a backend/peer).
How is offline-first implemented for Umai? Is it storing data inside browser storage, and send/sync that with the Solid Pod; or is it using CRDTs, with one peer storing to Solid Pod (thus having the ability to connect with more peers)?

That’s unfortunate :confused: Can you share more details about this opening an issue in GitHub? (and maybe share an example url as well, so that I can reproduce it).

Also, if you’re interested in seeing the app in Chinese this time I’ve prepared it so that it can be translated :D. Check out the translation guidelines.

I talked about this in this other thread: Request for Comments: CRDTish approach to Solid.

TLDR: The data is stored locally in IndexedDB, and when it’s synchronized with the POD other than the recipe data, a list of operations are sent. That way, when other devices get data from the POD they’ll get the operations and merge changes instead of overriding. But yeah, it’s CRDT mediated by the POD, not peer to peer (although technically the architecture allows it to work that way, but I haven’t implemented it).

Sure. I’ll open one. Unfortunately I can’t share an example URL because… it didn’t allow me to save the recipe.

Good to know it’s there. Will take a look.

Whoops. Missed that thread. I’ll check it out.

Won’t that be a significant storage overhead if the CRDT operation history is very long?
(Maybe I should check out the other post first.)

Ok, I was assuming you meant that it didn’t work using the “Import from the web” functionality. If it doesn’t work by creating a new recipe from scratch that’s even worse :sweat_smile:. I guess you can write the Chinese text in the GitHub issue (like recipe name, description, etc.) and I can reproduce the problem by copy-pasting the content.

Yes, that’s one of the concerns I raise in that thread :/. I don’t have any solution for now, so I’ll see how it goes and find some solutions when and if it becomes a real problem. Some ideas I have for example is squashing history and such, but I figured it’ll probably take a long time until I need to tackle that.