[{"data":1,"prerenderedAt":302},["ShallowReactive",2],{"project-33931971":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":35,"aspects":36,"strip":43,"post_text":44,"what":45,"said":82,"maker_in_thread":155,"shape":164,"grid":169,"attempts":264,"same_week":265,"maker_shows":293,"maker_hidden":294,"reader_version":295,"card":296},"33931971","Pg_CRDT","an experimental CRDT extension for Postgres","title","Show HN: Pg_CRDT – an experimental CRDT extension for Postgres","https:\u002F\u002Fsupabase.com\u002Fblog\u002Fpostgres-crdt","supabase.com","kiwicopple",1670674824,2022,296,38,143,2570,6,"legend","data","postgres extension","library",[24,25,26,27,28],"crdt","postgres","yjs","automerge","offline sync","debated",-0.018,{"positive":32,"neutral":33,"mixed":34,"critical":33},5,3,0,11,{"idea":37,"execution":39,"design":40,"performance":41,"docs":42},{"positive":33,"critical":38},1,{"positive":38,"critical":34},{"positive":34,"critical":38},{"positive":34,"critical":38},{"positive":38,"critical":34},[34,32,33,34,34,32,34,34,32,38,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,33,38,34,34,34,38,34,33,32,34,32,34,34],"This is an experimental extension for CRDTs, `pg_crdt`[0]. It supports Yjs\u002FYrs and Automerge.\n\nThe linked blog post describes how we're thinking about this extension in a Supabase context. Ideally this \"Show HN\" generates some discussion\u002Finterest, both here and in the github discussions [1].\n\nI want to emphasise this part from the blog post[2]: \"pg_crdt has not been released onto the Supabase platform (and it may never be). We’re considering many options for offline-sync\u002Fsupport and, while CRDTs will undoubtedly factor in, we’re not sure if this is the right approach.\"\n\n[0] GitHub repo: https:",{"problem":46,"audience":55,"pricing":55,"motivation":56,"time_to_build":55,"stack":60,"openness":79,"stage":80,"team_size":81},{"value":47,"source":48,"evidence":49},"Storing and merging CRDT documents inside Postgres","maker",[50,52],{"id":51},"post",{"id":53,"by":11,"text":54},"33932398","Thanks, perhaps I can try explain it from another angle. At the moment, every tool in supabase is decoupled from the other tools. The only thing that each tool depends on is…",null,{"value":57,"source":48,"evidence":58},"Explore CRDTs as a data problem inside the Supabase database",[59],{"id":53,"by":11,"text":54},[61,67,71,75],{"value":62,"source":48,"evidence":63},"Rust",[64],{"id":65,"by":11,"text":66},"33932125","For quick viewing, here's how it works in Postgres (using Yjs): ``` create table posts ( id serial primary key, content crdt.ydoc default crdt.new_ydoc() ); insert into posts…",{"value":68,"source":48,"evidence":69},"pgx",[70],{"id":65,"by":11,"text":66},{"value":72,"source":48,"evidence":73},"Yjs",[74],{"id":65,"by":11,"text":66},{"value":76,"source":48,"evidence":77},"Automerge",[78],{"id":65,"by":11,"text":66},"open_source","prototype","company",{"praise":83,"objections":102,"requests":124,"questions":135,"alternatives":143},[84,92],{"value":85,"source":86,"evidence":87},"Support for both Yjs and Automerge is the right direction","commenter",[88],{"id":89,"by":90,"text":91},"33932662","samwillis","Super excited to see this Paul, and amused to see the nod to my comment in the post :-) I'm going to enjoy getting stuck into this! (When I'm not stuck driving for six hours...…",{"value":93,"source":86,"evidence":94},"Interest in offline-sync use cases",[95,98],{"id":96,"by":90,"text":97},"33934277","Had a chance to take a little more of a look, did you investigate querying\u002Findexing within the documents? (Didn't spot any sign in the repository) Without the ability to index…",{"id":99,"by":100,"text":101},"33979195","moralestapia","Sure thing! In all honestly, to say it was a \"persistence layer\" is a bit of a stretch since it was not an additional layer per se, but here's what we did. Context: I was the CTO…",[103,110,117],{"value":104,"source":86,"evidence":105},"Postgres MVCC may struggle with frequent CRDT updates",[106],{"id":107,"by":108,"text":109},"33933704","Hixon10","Hm, I am a bit worried about using PostgreSQL with CRDT (Limitations section from the blog). I guess that PostgreSQL doesn't like frequently updates, because of MVCC. Maybe it is…",{"value":111,"source":86,"evidence":112},"No indexing or querying within documents",[113,114],{"id":96,"by":90,"text":97},{"id":115,"by":11,"text":116},"33934493","> This could be as basic as a three column table (guid, doc, clock), the clock being a global Lamport This would be achievable, but also perhaps quite strict - we're dictating a…",{"value":118,"source":86,"evidence":119},"CRDTs only fit a limited set of use cases",[120],{"id":121,"by":122,"text":123},"33932394","danbruc","I do not get peoples' obsession with CRDTs. They are useful in a limited set of use cases when your operations are commutative but having only commutative operations is pretty…",[125,131],{"value":126,"source":86,"evidence":127},"Add an open source license",[128],{"id":129,"by":100,"text":130},"33960608","Hi @kiwicopple, hope you can still read this. This is very nice and comes handy to me as I've been working for months on a couple projects using Yjs for which I adapted a…",{"value":132,"source":86,"evidence":133},"Support for querying and indexing document contents",[134],{"id":96,"by":90,"text":97},[136],{"value":137,"source":86,"evidence":138},"Why not build this into Realtime instead",[139],{"id":140,"by":141,"text":142},"33932251","Smaug123","Forgive me, I'm still recovering from the flu and am having some trouble thinking, but I didn't find your \"Why not build this into Realtime?\" section very compelling. If you've…",[144,148],{"value":145,"source":86,"evidence":146},"Persisting Yjs documents with a custom Postgres historian",[147],{"id":99,"by":100,"text":101},{"value":149,"source":86,"evidence":150},"Operational Transforms",[151],{"id":152,"by":153,"text":154},"33938358","melony","And if you tie the conflict resolution logic to the individual delta operations, you get Operational Transforms.",{"comments":156,"answered":157,"key":158},9,2,[159,160,161],{"id":65,"text":66},{"id":115,"text":116},{"id":162,"text":163},"33935528","perfect, we'd love to collaborate with you. I'll jump into your github after our Launch Week (this week), or feel free to reach out directly (contact details in my bio)",{"commenters":165,"max_depth":166,"maker_replies":156,"first_comment_mins":167,"lifespan_hours":168},19,7,23,94,[170,172,174,176,180,181,185,187,191,195,197,200,202,205,207,210,213,215,217,220,222,224,225,228,232,235,237,239,241,245,247,249,252,254,256,258,259,261],[65,34,34,171,11,38],"maker\u002Fneutral\u002Fdocs",[89,34,32,173,90,34],"maker\u002Fpositive\u002Fidea",[96,34,33,175,90,34],"project\u002Fneutral\u002Fidea",[177,34,34,178,179,34],"33934389","commenter\u002Fneutral\u002Fidea","aaronblohowiak",[115,34,34,175,11,38],[182,34,32,183,184,34],"33935267","project\u002Fpositive\u002Fidea","Horusiath",[162,34,34,186,11,38],"commenter\u002Fneutral\u002Fnone",[188,34,34,189,190,34],"33961480","other\u002Fneutral\u002Fnone","cyanydeez",[192,34,32,193,194,34],"33935820","maker\u002Fpositive\u002Fexecution","zombodb",[121,38,38,196,122,34],"project\u002Fcritical\u002Fidea",[198,38,34,199,11,38],"33932420","maker\u002Fneutral\u002Fidea",[201,38,34,178,122,34],"33932515",[203,38,34,178,204,34],"33932566","AlexErrant",[206,38,34,178,122,34],"33932664",[208,38,34,178,209,34],"33935704","preseinger",[211,38,34,178,212,34],"33932791","jclem",[214,38,34,178,122,34],"33933679",[216,38,34,186,11,38],"33934822",[218,38,34,178,219,34],"33933736","jamil7",[221,38,34,178,122,34],"33934213",[223,38,34,178,219,34],"33935433",[152,38,34,178,153,34],[226,38,34,227,209,34],"33937775","other\u002Fneutral\u002Fidea",[229,38,34,230,231,34],"33940622","other\u002Fcritical\u002Fidea","Existenceblinks",[233,157,34,178,234,34],"33932920","matlin",[236,157,33,175,219,34],"33933805",[140,33,38,238,141,34],"project\u002Fcritical\u002Fdesign",[53,33,34,240,11,38],"project\u002Fneutral\u002Fdesign",[242,243,34,227,244,34],"33937351",4,"cranium",[246,243,34,227,209,34],"33937829",[107,32,38,248,108,34],"project\u002Fcritical\u002Fperformance",[250,32,34,251,11,38],"33934096","project\u002Fneutral\u002Fperformance",[253,32,33,251,108,34],"33934230",[129,18,32,255,100,34],"project\u002Fpositive\u002Fdocs",[257,18,34,171,11,38],"33965944",[99,18,32,183,100,34],[260,18,34,186,11,38],"33981865",[262,166,34,189,263,34],"33932640","nixpulvis",[],[266,271,275,279,284,288],{"id":267,"name":268,"points":269,"category":270},"33923907","LearnGPT",352,"ai",{"id":272,"name":273,"points":274,"category":270},"33910863","Hello (sayhello.so)",318,{"id":276,"name":277,"points":278,"category":20},"33969908","XetHub",279,{"id":280,"name":281,"points":282,"category":283},"33922754","Pynecone",209,"dev_tools",{"id":285,"name":286,"points":287,"category":283},"33906520","Ezy",155,{"id":289,"name":290,"points":291,"category":292},"33985550","Juice Labs",138,"infrastructure",13,false,"v2",{"id":297,"name":5,"line":6,"ai":294,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":298,"top":18,"kw":299,"maker":11,"domain":10,"tier":19,"attempts":34,"strip":300,"url":9,"mix":301,"praise":85,"objection":104,"sub":21},33931971,-0.02,[24,25,26,27,28],"05300500510000000000000003100010350500",[32,33,34,33],1794036628349]