[{"data":1,"prerenderedAt":770},["ShallowReactive",2],{"project-37584049":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":47,"post_text":51,"what":52,"said":89,"maker_in_thread":211,"shape":222,"grid":227,"attempts":731,"same_week":732,"maker_shows":50,"maker_hidden":762,"reader_version":763,"card":764},"37584049","ElectricSQL","ElectricSQL, Postgres to SQLite active-active sync for local-first apps","title","Show HN: ElectricSQL, Postgres to SQLite active-active sync for local-first apps","https:\u002F\u002Felectric-sql.com\u002F","electric-sql.com","samwillis",1695217615,2023,617,170,35,3109,2,"legend","data","sync layer","library",[24,25,26,27,28],"postgres","sqlite","local-first","crdt","offline sync","curious",0.268,{"positive":32,"neutral":33,"mixed":18,"critical":34},30,87,6,125,{"idea":37,"design":40,"privacy":42,"execution":43,"performance":44,"pricing":45,"docs":46},{"positive":38,"critical":39},16,1,{"positive":41,"critical":18},0,{"positive":39,"critical":41},{"positive":18,"critical":39},{"positive":39,"critical":39},{"positive":41,"critical":41},{"positive":41,"critical":39},[48,48,49,49,18,50,41,50,49,39,50,49,50,49,49,49,49,48,48,50,49,48,50,50,48,50,49,48,49,48,18,50,49,50,49,49,49,50,18,49],4,3,5,"Hi HN, James, Valter, Sam and the team from ElectricSQL here.\n\nWe're really excited to be sharing ElectricSQL with you today. It's an open source, local-first sync layer that can be used to build reactive, realtime, offline-capable apps directly on Postgres with two way active-active sync to SQLite (including with WASM in the browser).\n\nElectric comprises a sync layer (built with Elixir) placed in front of your Postgres database and a type safe client that allows you to bidirectionally sync data from your Postgres to local SQLite databases. This sync is CRDT-based, resilient to conflicting edi",{"problem":53,"audience":59,"pricing":64,"motivation":65,"time_to_build":64,"stack":69,"openness":86,"stage":87,"team_size":88},{"value":54,"source":55,"evidence":56},"Syncing data between Postgres servers and local SQLite databases for offline-capable, realtime apps","maker",[57],{"id":58},"post",{"value":60,"source":61,"evidence":62},"developers building local-first, offline-capable apps","inferred",[63],{"id":58},null,{"value":66,"source":55,"evidence":67},"Enable local-first apps built directly on Postgres with bidirectional SQLite sync",[68],{"id":58},[70,74,78,82],{"value":71,"source":55,"evidence":72},"Elixir",[73],{"id":58},{"value":75,"source":55,"evidence":76},"Postgres",[77],{"id":58},{"value":79,"source":55,"evidence":80},"SQLite (WASM in browser)",[81],{"id":58},{"value":83,"source":55,"evidence":84},"CRDTs",[85],{"id":58},"open_source","beta","company",{"praise":90,"objections":118,"requests":134,"questions":162,"alternatives":185},[91,107],{"value":92,"source":93,"evidence":94},"Excellent sync concept for local-first apps","commenter",[95,99,103],{"id":96,"by":97,"text":98},"37590034","obeavs","Huge congrats to the team. I reached out to them four or five months ago as we explored offline-first frameworks, and its awesome to see how far they've come in a short time. We…",{"id":100,"by":101,"text":102},"37593363","thanikkal","Congratulations to James and the team! I reached out to James when they were searching for early adopters for their V2 version, which focuses on PostgreSQL. Our primary business…",{"id":104,"by":105,"text":106},"37586643","mjadobson","I am fully on the offline-first bandwagon after starting to use cr-sqlite (https:\u002F\u002Fvlcn.io), which works similar to ElectricSQL. I thought the bundle size of wasm-sqlite would be…",{"value":108,"source":93,"evidence":109},"Long-awaited pattern for offline-first apps",[110,114],{"id":111,"by":112,"text":113},"37586630","vekker","Wow, this is awesome! I've been \"waiting\" for a project like this for years - having to roll out my own syncing solution for my local-first app until now. I have yet to dive…",{"id":115,"by":116,"text":117},"37585798","crubier","Oh wow, I’ve been wanting this for a long time, to the point that I started making it myself. This is perfect to create super fast offline first apps like linear.app, with Postgres",[119,123],{"value":120,"source":93,"evidence":121},"Permissions not yet implemented, so users may sync others' data",[122],{"id":111,"by":112,"text":113},{"value":124,"source":93,"evidence":125},"Client bundle size of about 1-2MB WASM SQLite",[126,130],{"id":127,"by":128,"text":129},"37584329","meiraleal","EletricSQL is very cool, congratulations and thanks for the work! I was thinking about using it for an app that I'm developing but decided to not ship a 2mb binary to every user.…",{"id":131,"by":132,"text":133},"37593214","zubairq","I just looked at the size of Sqlite in the browser as sql.js compared to WASM Sqlite in the broswer. sql.js seems to be over 2MB and WASM sqlite in just 900k, is that right? If…",[135,146,154],{"value":136,"source":93,"evidence":137},"Native Swift and Kotlin clients",[138,142],{"id":139,"by":140,"text":141},"37592347","TeeWEE","Congrats. How does this deal with schema changes? We have a solution where old clients can store objects that have new fields unknown to the client. Then when the clients updates…",{"id":143,"by":144,"text":145},"37585357","jwells89","Will be keeping an eye on this. Are there plans for Swift\u002FKotlin clients for native iOS\u002FAndroid apps?",{"value":147,"source":93,"evidence":148},"Client-side encryption support",[149,153],{"id":150,"by":151,"text":152},"37587852","jchw","I saw this recently and I am really excited for, hopefully, a renaissance in local-first apps; it's been quite a long time coming. That said, it seems like there's still a lot of…",{"id":111,"by":112,"text":113},{"value":155,"source":93,"evidence":156},"Partial sync of working set",[157,158],{"id":139,"by":140,"text":141},{"id":159,"by":160,"text":161},"37591442","iamgopal","Does it support partial sync ?",[163,170,177],{"value":164,"source":93,"evidence":165},"How validation and authorization of client writes works",[166],{"id":167,"by":168,"text":169},"37584395","koolba","Is there any validation or authorization for changes being merged back into the root database? In a traditional client \u002F server model, the server has an opportunity to validate…",{"value":171,"source":93,"evidence":172},"Dataset size limits",[173],{"id":174,"by":175,"text":176},"37584293","alooPotato","Can you talk about the dataset sizes you support? Your example linear app has 112 rows, could you support 1000? 10K? 100k? 1M?",{"value":178,"source":93,"evidence":179},"How schema changes are handled",[180,181],{"id":139,"by":140,"text":141},{"id":182,"by":183,"text":184},"37585363","pdhborges","Congrats to the team. I think it is particularly impressive (and a bit scary) that DDL changes are also synchronized to the clients automatically!",[186,193,197,204],{"value":187,"source":93,"evidence":188},"PowerSync",[189],{"id":190,"by":191,"text":192},"37586111","rococosbasilisk","Congrats to the team. I'm on the team over at https:\u002F\u002Fpowersync.co and have been following this space for a while. PowerSync is also a plug-in sync layer. The biggest difference…",{"value":194,"source":93,"evidence":195},"cr-sqlite",[196],{"id":104,"by":105,"text":106},{"value":198,"source":93,"evidence":199},"PouchDB with CouchDB",[200],{"id":201,"by":202,"text":203},"37584945","pgm8705","Awesome! I'm looking forward to trying this out. Currently I get this functionality by using PouchDB on the client with a CouchDB sever. Then on my API server I have some janky…",{"value":205,"source":93,"evidence":206},"RxDB",[207],{"id":208,"by":209,"text":210},"37592707","adrianotadao","Congrats to the team. I’ve tried https:\u002F\u002Frxdb.info\u002F and it wasn’t funny at all to do the remote replication (PG) and to deal with conflicts. I do need to check this one out!",{"comments":34,"answered":50,"key":212},[213,216,219],{"id":214,"text":215},"37588367","Absolutely, we are really keen to support an encryption pattern. We are at the design phase, the current thinking is to have a hook enabling developers to provided their own…",{"id":217,"text":218},"37586058","Hey, I work at Electric, The CouchDB\u002FPouchDB pattern is how I originally got interested in local first, they are such a good tool, but having the full power of Postgres and then…",{"id":220,"text":221},"37584555","OP here, I work for Electric, Electric is designed to support partial sync, and so you don’t have to sync your whole dataset. (Note that this is feature is under development and…",{"commenters":223,"max_depth":224,"maker_replies":34,"first_comment_mins":225,"lifespan_hours":226},104,8,11,75,[228,230,234,237,240,244,247,250,254,258,260,263,266,268,270,273,277,281,284,286,290,293,295,297,300,303,306,308,310,313,315,317,320,321,324,326,328,331,333,336,339,342,345,347,349,351,354,358,361,362,364,368,370,371,375,377,379,382,383,387,390,392,394,397,399,402,404,407,409,410,412,417,419,423,425,427,431,433,436,439,442,447,449,453,455,457,461,466,469,473,475,477,481,485,488,490,492,494,498,500,502,506,509,513,518,521,523,527,530,533,538,542,546,549,553,557,559,563,566,568,572,574,576,578,581,585,587,591,595,597,601,603,608,612,616,620,624,626,630,632,635,638,640,644,648,652,654,658,660,662,666,670,674,677,680,682,684,688,692,694,698,702,706,709,713,715,717,721,725,727,729],[96,41,50,229,97,41],"maker\u002Fpositive\u002Fidea",[231,41,49,232,233,41],"37590390","project\u002Fneutral\u002Fidea","roncesvalles",[235,39,49,232,236,41],"37585535","canadiantim",[238,39,49,232,239,41],"37585722","thruflo",[241,39,50,242,243,41],"37588707","project\u002Fpositive\u002Fidea","appplication",[245,39,49,232,246,41],"37589244","aidos",[248,39,49,249,239,41],"37589744","maker\u002Fneutral\u002Fnone",[251,39,41,252,253,41],"37586254","commenter\u002Fneutral\u002Fidea","ochiba",[255,39,41,256,257,41],"37586761","commenter\u002Fneutral\u002Fnone","afavour",[259,39,41,256,253,41],"37589756",[261,39,49,232,262,41],"37594854","lifty",[264,39,49,265,253,41],"37600917","project\u002Fneutral\u002Fdesign",[267,39,41,256,239,41],"37611829",[269,39,41,256,253,41],"37613434",[271,39,49,232,272,41],"37586767","candiddevmike",[274,39,49,275,276,41],"37596338","project\u002Fneutral\u002Fprivacy","luxcem",[278,39,41,279,280,41],"37596659","other\u002Fneutral\u002Fnone","vbalegas",[282,18,49,232,283,41],"37585220","addisonj",[285,18,49,249,239,41],"37585672",[287,18,39,288,289,41],"37589901","project\u002Fcritical\u002Fdesign","irq-1",[291,18,41,256,292,41],"37591148","kiitos",[294,18,41,256,289,41],"37597880",[150,49,50,296,151,41],"project\u002Fpositive\u002Fprivacy",[298,49,49,275,299,41],"37588251","klabb3",[301,49,41,302,151,41],"37588460","other\u002Fneutral\u002Fprivacy",[304,49,41,302,305,41],"37590257","westurner",[307,49,41,256,151,41],"37590294",[309,49,41,256,299,41],"37590919",[311,49,41,312,151,41],"37591174","commenter\u002Fneutral\u002Fprivacy",[314,49,41,256,299,41],"37594044",[214,49,41,316,11,39],"maker\u002Fneutral\u002Fprivacy",[318,49,50,242,319,41],"37588842","vmfunction",[167,48,49,265,168,41],[322,48,41,256,323,41],"37584549","FrancoisBosun",[325,48,49,265,168,41],"37584653",[327,48,49,265,239,41],"37584831",[329,48,49,265,330,41],"37586168","robertlagrant",[332,48,49,265,239,41],"37584627",[334,48,39,288,335,41],"37585219","doctorpangloss",[337,48,41,279,338,41],"37591013","kiwicopple",[340,48,49,265,341,41],"37596119","rmbyrro",[343,48,41,344,253,41],"37586460","commenter\u002Fneutral\u002Fdesign",[346,48,41,256,128,41],"37589286",[348,48,41,256,253,41],"37589417",[350,48,41,256,128,41],"37592301",[352,48,41,256,353,41],"37592412","cebert",[355,50,50,356,357,41],"37586645","project\u002Fpositive\u002Fexecution","ThinkBeat",[359,50,49,360,239,41],"37586961","project\u002Fneutral\u002Fexecution",[139,34,49,265,140,41],[363,34,49,265,280,41],"37594601",[365,34,49,366,367,41],"37595122","project\u002Fneutral\u002Fnone","nerdyadventurer",[201,369,50,242,202,41],7,[217,369,41,249,11,39],[372,224,50,373,374,41],"37585073","maker\u002Fpositive\u002Fnone","tantaman",[376,224,49,249,239,41],"37585196",[378,224,41,279,374,41],"37585268",[174,380,49,381,175,41],9,"project\u002Fneutral\u002Fperformance",[220,380,41,381,11,39],[384,380,41,385,386,41],"37584904","other\u002Fneutral\u002Fperformance","slashdev",[388,380,41,256,389,41],"37585098","tln",[391,380,41,256,386,41],"37585283",[393,380,49,381,253,41],"37586728",[395,380,49,360,396,41],"37591804","dustingetz",[398,380,41,256,253,41],"37586711",[111,400,49,401,112,41],10,"project\u002Fmixed\u002Fprivacy",[403,400,49,249,280,41],"37587268",[405,400,49,275,406,41],"37587821","mnahkies",[408,400,49,249,280,41],"37589965",[100,225,50,242,101,41],[131,411,49,381,132,41],12,[413,414,39,415,416,41],"37594609",13,"project\u002Fcritical\u002Fexecution","m3h",[418,414,49,249,280,41],"37594723",[420,421,49,366,422,41],"37588864",14,"vladstudio",[424,421,49,249,239,41],"37588970",[426,421,49,249,239,41],"37589056",[428,429,50,242,430,41],"37591138",15,"roblh",[127,38,39,432,128,41],"project\u002Fcritical\u002Fperformance",[434,38,49,435,239,41],"37584522","maker\u002Fneutral\u002Fperformance",[104,437,50,438,105,41],17,"project\u002Fpositive\u002Fperformance",[440,437,41,441,374,41],"37589052","commenter\u002Fneutral\u002Fperformance",[443,444,50,445,446,41],"37586547",18,"project\u002Fpositive\u002Fnone","gregzo",[190,448,49,232,191,41],19,[450,451,50,242,452,41],"37587814",20,"hultner",[454,451,49,316,239,41],"37588037",[182,456,50,356,183,41],21,[458,459,49,366,460,41],"37591514",22,"j0e1",[462,463,49,464,465,41],"37592749",23,"project\u002Fmixed\u002Fdesign","Cannabat",[467,463,41,344,468,41],"37593733","danielskogly",[470,471,49,249,472,41],"37592069",24,"zacksiri",[143,474,49,360,144,41],25,[476,474,49,249,239,41],"37586332",[478,479,50,242,480,41],"37586473",26,"cpursley",[482,483,49,360,484,41],"37586306",27,"mrgalaxy",[486,483,49,487,239,41],"37586439","maker\u002Fneutral\u002Fexecution",[489,483,50,373,484,41],"37586653",[491,483,41,256,253,41],"37586574",[493,483,41,256,484,41],"37586617",[495,496,49,381,497,41],"37585510",28,"lucgagan",[499,496,41,435,11,39],"37585882",[501,496,49,381,374,41],"37586376",[503,504,50,445,505,41],"37590480",29,"caiocodes",[507,32,50,242,508,41],"37588813","malablaster",[510,511,41,279,512,41],"37586036",31,"pgt",[514,515,49,516,517,41],"37594074",32,"project\u002Fneutral\u002Fpricing","davidkuennen",[519,515,49,520,239,41],"37594340","maker\u002Fneutral\u002Fpricing",[115,522,50,242,116,41],33,[524,525,50,242,526,41],"37584246",34,"switz",[528,16,50,242,529,41],"37588088","srameshc",[531,16,41,256,532,41],"37588211","brigadier132",[534,535,41,536,537,41],"37584232",36,"other\u002Fneutral\u002Fidea","hinkley",[539,540,50,229,541,41],"37590659",37,"LAC-Tech",[543,544,41,279,545,41],"37588923",38,"chaxor",[547,544,41,279,548,41],"37589009","CogitoCogito",[550,551,49,520,552,41],"37603496",39,"hruzgar",[554,555,49,360,556,41],"37593649",40,"jorroll",[558,555,49,487,280,41],"37594637",[560,561,49,275,562,41],"37586255",41,"CuriouslyC",[564,561,49,316,565,41],"37586913","paulharter",[208,567,50,242,209,41],42,[569,570,49,232,571,41],"37584202",43,"3523582908",[573,570,49,232,239,41],"37584304",[575,570,49,265,571,41],"37584580",[577,570,49,265,239,41],"37584781",[579,570,49,360,580,41],"37588034","ako",[582,583,49,232,584,41],"37593570",44,"JaneLovesDotNet",[586,583,49,366,280,41],"37594651",[588,589,50,242,590,41],"37590228",45,"declan_roberts",[592,593,49,381,594,41],"37586779",46,"jtmarmon",[596,593,41,435,11,39],"37586897",[598,599,49,232,600,41],"37588066",47,"victorbjorklund",[602,599,49,232,239,41],"37588796",[604,605,39,606,607,41],"37587863",48,"project\u002Fcritical\u002Fdocs","boundlessdreamz",[609,610,49,360,611,41],"37592993",49,"rkagerer",[613,614,50,242,615,41],"37593697",50,"chris-orgmenta",[617,618,50,445,619,41],"37591402",51,"sovesky",[621,622,49,360,623,41],"37585423",52,"agg23",[625,622,49,360,565,41],"37585884",[627,628,49,366,629,41],"37586701",53,"LocalPCGuy",[631,628,41,366,11,39],"37586813",[633,628,49,360,634,41],"37587765","nathancahill",[636,628,49,360,637,41],"37590817","icehaunter",[639,628,50,445,634,41],"37595552",[641,642,50,445,643,41],"37624813",54,"Fire-Dragon-DoL",[645,646,49,232,647,41],"37587661",55,"revenga99",[649,650,49,360,651,41],"37599304",56,"prepor",[653,650,49,360,651,41],"37599395",[655,656,49,381,657,41],"37586430",57,"gunapologist99",[659,656,49,381,239,41],"37586501",[159,661,49,232,160,41],58,[663,664,49,265,665,41],"37597380",59,"avinassh",[667,668,49,366,669,41],"37592445",60,"android521",[671,672,49,360,673,41],"37591975",61,"Jonovono",[675,676,49,265,132,41],"37587998",62,[678,676,49,265,679,41],"37588277","pstuart",[681,676,49,265,132,41],"37593139",[683,676,49,265,679,41],"37593350",[685,676,49,686,687,41],"37594850","project\u002Fneutral\u002Fdocs","iamwil",[689,690,49,232,691,41],"37589478",63,"orixilus",[693,690,49,232,239,41],"37589591",[695,696,50,445,697,41],"37584248",64,"nine_zeros",[699,700,50,373,701,41],"37596361",65,"belalw",[703,704,50,373,705,41],"37586227",66,"jsaramago",[707,708,49,366,396,41],"37591762",67,[710,711,39,712,532,41],"37588212",68,"project\u002Fcritical\u002Fidea",[714,711,49,232,233,41],"37590500",[716,711,41,252,532,41],"37591753",[718,719,49,232,720,41],"37584800",69,"steida",[722,723,41,279,724,41],"37589088",70,"Exoristos",[726,723,41,279,541,41],"37590782",[728,723,41,279,396,41],"37595507",[730,723,41,256,280,41],"37596080",[],[733,738,743,748,753,757],{"id":734,"name":735,"points":736,"category":737},"37558357","HyperDX",722,"infrastructure",{"id":739,"name":740,"points":741,"category":742},"37507419","Nue",370,"languages",{"id":744,"name":745,"points":746,"category":747},"37538028","Every Breath You Take",348,"learning_science",{"id":749,"name":750,"points":751,"category":752},"37583219","SeaGOAT",240,"dev_tools",{"id":754,"name":755,"points":756,"category":752},"37533493","exaequOS",216,{"id":758,"name":759,"points":760,"category":761},"37585869","Booklet",183,"productivity",false,"v2",{"id":765,"name":5,"line":6,"ai":762,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":766,"top":18,"kw":767,"maker":11,"domain":10,"tier":19,"attempts":41,"strip":768,"url":9,"mix":769,"praise":92,"objection":120,"sub":21},37584049,0.27,[24,25,26,27,28],"4433250531535333344534554534342535333523",[32,33,18,34],1794036642042]