5 ms·
Show HN: CRDTs+WASM for local-first, collaborative note-taking in the browser
- sambigeara 5y agoHi HN! Author here. A little while ago I shared the terminal based version of the project (https://github.com/Sambigeara/fuzzynote https://github.com/Sambigeara/fuzzynote) with the community. I since got inspired, and disappeared into my loft for 9 months to work on leveraging the core logic for use in a WASM-based web client. So you can now sync your notes between your terminal and any reasonable modern browser (some early limitations in mobile)! The project has (finally) reached MVP and is ready for use, and any feedback is very welcome. (Direct link to app https://fuzzynote.app https://fuzzynote.app)
- 0des 5y agoThis is so cool :) I can't wait to use this. I was just describing something similar to a friend I was collaborating with recently, and actually uttered the words "hey you know, somebody should make ..." And here it is!
- sambigeara 5y agoThat is amazing! I hope it ticks some of the use-case boxes, and if it doesn't, I'd love to know what those boxes were
- shaunxcode 5y agoWhat CRDT library are you using? Or is this something new?
- sambigeara 5y agoI built this one myself, it's an event log which is used to progressively build onto a secondary data structure (which is more closely tied to the client)
- chaosprint 5y agoDid you implement CRDTs manually or depend on yjs?
- sambigeara 5y agoManually! The CRDT itself is an event log. The client state is built from a secondary data structure which replays from the log (the extent of the "replay" determined by how much data needs to be merged etc)
- 0des 5y agoThere is so much good work here, good job. Just curious, what pushed you to make this aside from the obvious usefulness of it? Was there something specific? Also, while making it, did you perhaps also use it to collab with others during the process? Thanks again
- sambigeara 5y agoThanks so much! Honestly, this was a personal project that got a bit carried away. The initial iteration was just a simple terminal app that allowed me to fuzzy-search through a lot of my notes quickly, with the ability to store and access a plain text file against each. I was rsyncing to the cloud so I could access my data across different machines, but got frustrated at the lack of conflict resolution, so figured I'd build a mergable data structure and use that. It _then_ became annoying that I couldn't easily access my list on the go, and hence the web app was born. I actually (amusingly) built this completely on my own, which certainly made things more challenging WRT testing the collaborative components. Have certainly had the opportunity to test it a bit (mostly for "life" things such as sharing shopping lists...) but hopefully opening up the MVP will get some more organic and extensive usage and the opportunity for some good feedback!
- aaaaaaaaata 5y agoWhat's the worst edge case you're aware of that you're not handling?
- riidom 5y agoIn your pricing list do you mean "TBA" instead of "TBC"? Or maybe it's just my english, then ignore me :)
- sambigeara 5y agoHaha, good point - perhaps "TBA" would have been more appropriate here! Thanks. I've been so far more focused on getting MVP out, so haven't given a lot of thought to the specific pricing tiers yet, but I hope to get all that set up really soon (pending some profiling/feedback etc).
- turtlebits 5y agoNot sure if I'm missing something, but this just looks like a text editor (with an extremely confusing UI). Why do you have to use the search input to add anything? It also seems way to large for the functionality (2.6MB compressed)
- sambigeara 5y agoI totally agree that the UX is basic and unclear at present. Lots to do on that front; on design, documentation and otherwise! Appreciate the feedback. You don't have to search in order to add anything, though. Focusing on the (empty, or otherwise) search and pressing Enter will add an item below. Enter on any item will do the same. However, the text within the first search-group will be invisibly prepended to each line you add whilst it's filled. This is a method by which you can group notes via a common prefix. Also, each TAB-separated search group is applied to the result set individually! There's some stuff in the help popup that might make things a bit clearer. The binary size is an unfortunate side-effect of golang's webassembly compilation sizes. I can't (yet) use tinygo as the compiler as I rely on some unsupported packages. The app will be progressive soon enough, to minimise downloads and optimise startup. Edit: I should probably mention as well, that on top of the basic textual capabilities, the web app is managing all data syncing/merging/playback/collaboration, continually. The cloud infrastructure is very basic, namely there as plumbing to ship DB files to the appropriate places. All the heavy lifting is done locally! Incidentally, this paves the way for potential E2E encryption (the app is ready, the key management/distribution etc is the challenge here)