• 2 Posts
  • 14 Comments
Joined 28 days ago
cake
Cake day: March 8th, 2026

help-circle
  • Oh yeah, it’s a long story!

    My core idea is to build a task manager that will stay with me for the rest of my life. Because of that, my main requirement is for it to be fast even with a massive database. If I have 10k+ tasks saved over the years, it should still load and feel instant.

    Another requirement is that it must be offline-first. I live in a country where the internet goes down pretty often, and I need my tasks to be available regardless of the server status.

    Finally, I wanted a clean API so I could connect things like an MCP server or create tasks via Telegram.

    I couldn’t find an existing app that met all these needs, here is a table where I compared all self-hosted apps that I found(in awesome self-hosted github):

    Here is how my journey went:

    1. First approach: I tried using Redux and MobX. Performance sucked. The main reason is that MobX/Redux don’t support B-tree indexing. Local-first apps rely heavily on “intervals”(cause you use fractional-indexing-jittered to order things and to support LWW per column), and that’s exactly where B-trees shine. Without them, it just got slower as the data grew.
    2. Second approach: I tried a reactive UI based on persistent SQLite queries (using wa-sqlite). It worked well for small lists, but it felt sluggish once the dataset got large.
    3. Third approach (Current): I decided to build my own DB solution, which you can see here: HyperDB. The trick is that you write the logic once, but on the frontend, it runs against an in-memory B-tree index (which is incredibly fast) and data still stored at persistent wa-sqlite layer, while on the backend, it runs against persistent SQLite (which keeps memory usage low).

    This third approach finally solved all three requirements. It’s hard to find an open-source app that does this because this specific architecture is difficult to “cook” correctly. On top of the database speed, I also had to solve the sync problem, that should also somehow resolve conflicts while clients are offline, which I handled by building own sync layer with LWW CRDT per column.














  • Yep, that’s why I don’t like SuperProductivity, it’s hard to make proper sync on top of json/caldav(especially with proper conflict resolution). As far as I know, SuperProductivity building its own cloud sync protocol, but it’s plan to be a paid feature anytime.

    As for mobile version - yep, I plan to add them too. It’s already support PWA, so you can install app as a bookmark (and it opens pretty fast btw! And works offline also). But I want to have proper notifications in future and maybe widgets, so andriod/ios will be, but not sure when.

    Thanks for the feedback!