[{"data":1,"prerenderedAt":260},["ShallowReactive",2],{"project-29483913":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":29,"sentiment":30,"stance_mix":31,"scored_comments":18,"aspects":36,"strip":42,"post_text":44,"what":45,"said":77,"maker_in_thread":149,"shape":157,"grid":160,"attempts":222,"same_week":223,"maker_shows":43,"maker_hidden":252,"reader_version":253,"card":254},"29483913","SyncedStore CRDT","build multiplayer collaborative apps for React \u002F Vue","title","Show HN: SyncedStore CRDT – build multiplayer collaborative apps for React \u002F Vue","https:\u002F\u002Fsyncedstore.org\u002Fdocs\u002F","syncedstore.org","YousefED",1638966422,2021,144,26,345,2533,14,"notable","languages","collaborative state library","library",[24,25,26,27,28],"crdt","multiplayer sync","yjs","react state","offline sync","curious",0.138,{"positive":32,"neutral":33,"mixed":34,"critical":35},3,10,0,1,{"performance":37,"idea":38,"execution":40,"docs":41},{"positive":34,"critical":34},{"positive":39,"critical":34},2,{"positive":34,"critical":35},{"positive":35,"critical":34},[34,32,34,32,34,34,32,34,43,32,32,34,43,34,34,34,35,32,34,43,34,32,34,32,32,32],5,null,{"problem":46,"audience":53,"pricing":44,"motivation":57,"time_to_build":44,"stack":61,"openness":76,"stage":76,"team_size":76},{"value":47,"source":48,"evidence":49},"Building multiplayer collaborative apps on CRDTs is not trivial.","maker",[50],{"id":51,"by":11,"text":52},"29484147","Hi HN! With CRDTs (Conflict-free Replicated Data Types) becoming more mature and getting more attention lately, I decided to dive in and use it as the basis for a new project. I…",{"value":54,"source":48,"evidence":55},"Developers building React, Vue, Svelte or plain JS apps with real-time collaboration.",[56],{"id":51,"by":11,"text":52},{"value":58,"source":48,"evidence":59},"Make CRDT-based multiplayer apps simpler to build.",[60],{"id":51,"by":11,"text":52},[62,66,72],{"value":63,"source":48,"evidence":64},"JavaScript \u002F TypeScript",[65],{"id":51,"by":11,"text":52},{"value":67,"source":48,"evidence":68},"Yjs CRDT",[69],{"id":70,"by":11,"text":71},"29490072","Hi! Great questions :) First of all, SyncedStore does not implement any CRDT algorithms. Credits for this go to Yjs [1] (and its author Kevin), which it uses as underlying CRDT.…",{"value":73,"source":48,"evidence":74},"JavaScript Proxies",[75],{"id":51,"by":11,"text":52},"unknown",{"praise":78,"objections":95,"requests":107,"questions":114,"alternatives":133},[79],{"value":80,"source":81,"evidence":82},"Interesting, awesome project for CRDT developers","commenter",[83,87,91],{"id":84,"by":85,"text":86},"29485735","yawnxyz","Wow this is so awesome! How\u002Fwhere does the data get saved for later? I'm guessing from the example, you don't need a database? E.g. I can just save the data to a document…",{"id":88,"by":89,"text":90},"29484357","hanspagel","So cool to see libraries like yours coming out! (am in love with Y.js)",{"id":92,"by":93,"text":94},"29485622","orliesaurus","Love this! Thanks for sharing, I have some amazing use cases for this type of work and I can't wait to dig into the code to learn more. The future for CRDT is indeed hot right…",[96],{"value":97,"source":81,"evidence":98},"Examples fail in Brave browser due to storage handling",[99,103],{"id":100,"by":101,"text":102},"29484884","dkersten","FYI, the examples don't work for me in Brave browser on linux: React example: \"\u002FApp.tsx: Cannot read property 'getItem' of null (2:0)\" Vue example: \"file:\u002F\u002F\u002Fsrc\u002Fstore.ts: Cannot…",{"id":104,"by":105,"text":106},"29485138","saurik","https:\u002F\u002Fbrave.com\u002Fprivacy-updates\u002F7-ephemeral-storage\u002F",[108],{"value":109,"source":81,"evidence":110},"Write-up of an example deployment and services used",[111],{"id":112,"by":85,"text":113},"29485790","Hi! I just saw this reply — could you please put together a quick write up of an example deployment and the steps you took to do that (e.g. for the documentation site), including…",[115,122,126],{"value":116,"source":81,"evidence":117},"How does it compare to Automerge and @localfirst\u002Fstate?",[118],{"id":119,"by":120,"text":121},"29488792","thingification","Would you care to compare this with for example @localfirst\u002Fstate, automerge and automerge-rs (latter two provide the CRDTs, i.e. similar to Yjs)?…",{"value":123,"source":81,"evidence":124},"Where is data stored and how are accounts handled?",[125],{"id":84,"by":85,"text":86},{"value":127,"source":81,"evidence":128},"How is undo-redo handled?",[129],{"id":130,"by":131,"text":132},"29484738","joris","Awesome! I assume you’ve been using this in another project? How did you handle\u002Fimplement undo-redo?",[134,138,142],{"value":135,"source":81,"evidence":136},"Automerge",[137],{"id":119,"by":120,"text":121},{"value":139,"source":81,"evidence":140},"@localfirst\u002Fstate",[141],{"id":119,"by":120,"text":121},{"value":143,"source":81,"evidence":144},"GUN.js",[145],{"id":146,"by":147,"text":148},"29486940","gardnr","How does this compare to other libraries like GUN.js?",{"comments":43,"answered":150,"key":151},4,[152,153,154],{"id":51,"text":52},{"id":70,"text":71},{"id":155,"text":156},"29486090","Thanks! Love the excitement :) SyncedStore supports the same backends as Yjs, here’s an overview: https:\u002F\u002Fsyncedstore.org\u002Fdocs\u002Fsync-providers. You can indeed store updates in a…",{"commenters":18,"max_depth":32,"maker_replies":43,"first_comment_mins":158,"lifespan_hours":159},30,41,[161,163,165,167,168,171,172,176,178,180,184,187,190,192,194,197,199,202,203,205,210,213,215,217,219,221],[51,34,34,162,11,35],"maker\u002Fneutral\u002Fidea",[119,35,32,164,120,34],"project\u002Fneutral\u002Fnone",[70,35,34,166,11,35],"project\u002Fneutral\u002Fdesign",[84,39,32,164,85,34],[169,39,34,170,89,34],"29485917","other\u002Fneutral\u002Fnone",[155,39,34,164,11,35],[173,32,32,174,175,34],"29498574","project\u002Fneutral\u002Fperformance","JoeOfTexas",[177,32,34,164,11,35],"29500911",[88,150,43,179,89,34],"project\u002Fpositive\u002Fidea",[181,43,32,182,183,34],"29486716","project\u002Fneutral\u002Fexecution","BiteCode_dev",[185,43,32,182,186,34],"29487993","kevinjahns",[188,43,34,189,183,34],"29489121","commenter\u002Fneutral\u002Fnone",[92,191,43,179,93,34],6,[193,191,34,170,120,34],"29488854",[195,191,34,170,196,34],"29491423","chris1993",[198,191,34,170,93,34],"29506686",[100,200,35,201,101,34],7,"project\u002Fcritical\u002Fexecution",[104,200,32,182,105,34],[204,200,34,189,101,34],"29486304",[206,207,43,208,209,34],"29484831",8,"project\u002Fpositive\u002Fdocs","mvf4z7",[211,207,34,212,11,35],"29484876","project\u002Fneutral\u002Fdocs",[112,207,32,214,85,34],"maker\u002Fneutral\u002Fdocs",[216,207,34,170,89,34],"29485945",[130,218,32,182,131,34],9,[220,218,32,182,186,34],"29487940",[146,33,32,164,147,34],[],[224,229,234,238,243,248],{"id":225,"name":226,"points":227,"category":228},"29461735","Modern Wiki",979,"productivity",{"id":230,"name":231,"points":232,"category":233},"29425735","Emoji to Scale",713,"learning_science",{"id":235,"name":236,"points":237,"category":233},"29488511","Scale of the Universe 2",276,{"id":239,"name":240,"points":241,"category":242},"29428910","Deep Dreams",237,"ai",{"id":244,"name":245,"points":246,"category":247},"29464889","Straw.page",210,"web_saas",{"id":249,"name":250,"points":251,"category":233},"29437527","UI\u002FUX Tips book",198,false,"v2",{"id":255,"name":5,"line":6,"ai":252,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":256,"top":18,"kw":257,"maker":11,"domain":10,"tier":19,"attempts":34,"strip":258,"url":9,"mix":259,"praise":80,"objection":97,"sub":21},29483913,0.14,[24,25,26,27,28],"03030030533050001305030333",[32,33,34,35],1794036614029]