Making a Shows Tracker with Jazz
I have been following the local-first ecosystem for a while, and Jazz has piqued my interest. I'm taking a further look by making an actual app, a Shows Tracker.
Activity
Task started
So yeah, this won't be a Solid App 😅. I've already talked about why I'm leaving Solid aside (for the time being); but TLDR I'm facing some performance issues with my current tooling, and I don't have the time nor motivation to solve them. Instead, I've decided to build this one app with a different stack. It should serve both to solve my current problem, and to see how other ecosystems are doing.
Now, when I started to think about this, there were other contenders to choose from. The first one was NextGraph, given that it has first-class support for RDF, and I've been following the project for a couple of years. However, looking at the documentation and resources, it doesn't seem to be ready yet. It would be fine if I just wanted to tinker with it, but I'm actually trying to build a "real app" here, and the point of not using Solid is to make my life easier. So I'm looking for a more mature solution.
Another project I considered was Convex, which seems promising and I've seen it recommended a couple of times. Unfortunately, it doesn't seem ideal for local-first apps, and I'm not willing to give that up. Apparently, it can be used with Automerge, but that seems more like an idea than something anyone is working on for real.
So, Jazz it is. The main thing that caught my attention is their focus on developer experience. Honestly, it's very similar to what I'm trying to achieve with Aerogel: help people make local-first apps without having to think about any of the technical details. They don't even mention "CRDTs" in the landing page! Also, their whole approach to defining schemas is very Zod-centric, and I've had a great experience working with Zod so far.
But it's not all sunshine and roses. By using Jazz, I'll have to sacrifice one of my most revered ideals: Interoperability 😱. We'll see how it goes, but given this limitation I don't think I'll be working with Jazz a lot in the future, even if I like it. I'm also not looking forward to managing yet another service, but I'm totally going to self-host the backend (or "sync engine", as they call it). Thanks to that, I may be able to get something done with Solid... But for now, that's completely outside of the scope. The biggest bummer here is that I wanted to eventually bring this functionality to Media Kraken, and finally make honor to its name (it's called Media Kraken, not Movie Kraken). But that will have to wait. I just want to get my Shows Tracker done, and take a break from having to developing my own tooling.
On that note, though, there is yet another impediment... They don't have Vue support 😱😱. So I'm at a crossroads now. Should I use React, and see what life is like on the main stage? (even though I've used React before, and I don't like it). Or should I give Svelte a try, which I've been wanting to do for a while? Honestly, I don't know. Maybe this will be the first part of my experimentation, to try a bit with both and see how things go.
It hasn't even been a month since my last update, and here I am writing about how I am already using my Shows Tracker made with Jazz in production. Yes, you've read that right, in production. So TLDR, Jazz is very cool and life really is better using React :/.
Here's the long version:
First of all, I'll have to resolve the tension I created in my last update: React or Svelte? Well, after having looked into it, I decided to go with React. First for the obvious reasons: it would be nice for once to use what the cool kids are using (sorry, even I felt the cringe writing that). But also, after reading the documentation and lurking in their Discord, it's pretty clear that React is the most well supported. I actually discovered there was a Vue version before, and you can even use it with VanillaJS. So I'm pretty confident that I could use Jazz in my Vue apps if I wanted to. But for now, I'm sticking with React.
(Also, in case you missed it, I'm taking React more seriously given that I'll be using it in my day job as well).
The truth is that I've felt a real improvement using React and Jazz. Let alone the fact that I'm writing this update in a month (after struggling for months using Vue/Solid), the output produced by LLMs is also a lot better. I have also been playing with Cursor's Composer model, and I really like it. Of course, I still can't get AI to sort imports reliably, but it is getting better.
So yeah, I'm pretty happy with the way things are going. Although I'm also a bit sad that I won't be able to use my favorite tools. But if I look at it objectively, and ignore sunk costs, this is better.
It's not all sunshine and roses, though. My main gripe with Jazz is, of course, interoperability. I was already worried about this in my last update, but having learned more about it, I'm even more worried. If you read their FAQs, you'll notice a very appealing sentence: "We're designing the protocol as an open specification". The problem with that is... that I'm not convinced it's true 😅. I haven't been able to find anything about this "open specification" outside of that sentence, and even asking in the Discord community (which has been super helpful otherwise), nobody knew anything about it.
Other than that, I had a few bumps setting up a sync server and the authentication, but in the end it turned out very simple (you can check out the source in GitHub). The documentation is also a bit short, and I had to dig through source code and tinker to understand a couple of things. But as I said, the Discord community is very helpful, and I guess this is to be expected when learning a new technology (not all documentations can be as good as Laravel or Vue's!).
In summary, my initial hypotheses are proving to be true. Jazz is really cool, and the DX is great (I'd even say magical). Life is a lot easier if you are using React. And there is still nothing that comes close to Solid in terms of vision and values.
So, where does that leave me?
For now, I'll continue working on the app. I am using it in production, but if you give it a try you'll realize that it's still very rough. The UI in particular sucks (specially in Mobile), since I've mostly vibe-coded it without paying much attention. But I'm quite happy with the data model and the architecture. After I spend some time on the project, I may even call it a "real app", not just a Personal App :). I also have some ideas to take advantage of Jazz in my Solid Apps, thus having the best of both worlds. But I still have to decide how much time I want to dedicate to Solid with the way things are going.