[{"data":1,"prerenderedAt":251},["ShallowReactive",2],{"project-43217546":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":28,"sentiment":29,"stance_mix":30,"scored_comments":34,"aspects":35,"strip":39,"post_text":41,"what":42,"said":76,"maker_in_thread":158,"shape":169,"grid":173,"attempts":212,"same_week":213,"maker_shows":40,"maker_hidden":243,"reader_version":244,"card":245},"43217546","PG-Capture","a better way to sync Postgres with Algolia (or Elastic)","title","Show HN: PG-Capture – a better way to sync Postgres with Algolia (or Elastic)","https:\u002F\u002Fpg-capture.onrender.com\u002F","pg-capture.onrender.com","nick-keller",1740820682,2025,56,19,1168,3837,31,"notable","infrastructure","change data capture","library",[24,25,26,27],"postgres change data capture","postgres elasticsearch sync","postgres algolia sync","debezium alternative","curious",0.042,{"positive":31,"neutral":32,"mixed":33,"critical":31},2,5,1,10,{"docs":36,"idea":38},{"positive":37,"critical":33},0,{"positive":31,"critical":33},[40,37,33,32,37,40,37,40,37,40,37,40,37,32,37,33,37,40,37],3,"Hello HN! Keeping Elasticsearch or Algolia in sync with Postgres is a pain when your data spans multiple tables. Traditional CDC tools like Debezium capture table-level events but don’t help when you need to index a full entity composed of related records. That's why I built PG-Capture.\n\nPG-Capture lets you define a schema as complex as you need, aggregate table-level events, and reconstruct structured objects spanning multiple tables. It then publishes them as meaningful domain-level events to any queue (RabbitMQ, SQS, etc.).\n\nPG-Capture does NOT replace Debezium, it works on top of it (or an",{"problem":43,"audience":49,"pricing":49,"motivation":50,"time_to_build":49,"stack":54,"openness":73,"stage":74,"team_size":75},{"value":44,"source":45,"evidence":46},"Keeping Elasticsearch or Algolia in sync with Postgres is hard when an entity spans multiple tables.","maker",[47],{"id":48},"post",null,{"value":51,"source":45,"evidence":52},"Syncing multi-table Postgres data to search indexes was painful with table-level CDC tools.",[53],{"id":48},[55,61,67],{"value":56,"source":45,"evidence":57},"PostgreSQL",[58],{"id":59,"by":11,"text":60},"43258525","It does if you are using PG (other SQL databases will be added later). Under the hood, PG-Capture listens to raw Postgres events, it does not matter if the data was updated via…",{"value":62,"source":45,"evidence":63},"Debezium",[64],{"id":65,"by":11,"text":66},"43263579","Documentation is indeed very early, the main focus now was to pitch the idea correctly and help people understand what it does. I will then work on integrating multiple sources…",{"value":68,"source":45,"evidence":69},"MeiliSearch",[70],{"id":71,"by":11,"text":72},"43263585","Today I use PG-Sync to index things in MeiliSearch and to populate cache in production.","open_source","launched","unknown",{"praise":77,"objections":90,"requests":112,"questions":135,"alternatives":150},[78],{"value":79,"source":80,"evidence":81},"Idea of turning Postgres triggers into queue events is appealing","commenter",[82,86],{"id":83,"by":84,"text":85},"43257366","srameshc","Thanks for sharing, even though I don't use Algolia or Elastic but I love the idea of tracking Postgres Triggers and sending it to the queue and sending wherever you need it.…",{"id":87,"by":88,"text":89},"43257539","nylonstrung","This looks awesome, was hoping for an easier way to use debezium for event capture and will try it",[91,98,105],{"value":92,"source":80,"evidence":93},"Documentation is very early",[94],{"id":95,"by":96,"text":97},"43259414","dark_ph0enix","Looks pretty promising, would be great to see some more documentation around pushing data out to elastic, etc. Small nit, the GitHub link at the bottom of the page leads to…",{"value":99,"source":80,"evidence":100},"Full reindex and ETL design concerns about joins on production database",[101],{"id":102,"by":103,"text":104},"43260526","jillesvangurp","There are many ways to do ETL (extract, transform, load). Probably if your transform function is a no-op, you are doing it wrong though (see below for why). Extract and load are…",{"value":106,"source":80,"evidence":107},"package.json license field inconsistent with added MIT license",[108],{"id":109,"by":110,"text":111},"43269815","LorenzoGood","The package.json still says ISC.",[113,117,128],{"value":114,"source":80,"evidence":115},"More documentation on pushing data to Elastic",[116],{"id":95,"by":96,"text":97},{"value":118,"source":80,"evidence":119},"Comparison with existing tools like PGSync",[120,124],{"id":121,"by":122,"text":123},"43260252","wanderingmind","Hi, congrats on the show HN. Is it possible for you to Provide some comparison of this tool against other existing tools that can sync Postgres to Elastic or other third-party…",{"id":125,"by":126,"text":127},"43261129","ahnick","How does this compare to PGSync? (https:\u002F\u002Fpgsync.com\u002F)",{"value":129,"source":80,"evidence":130},"Add a license to the repo",[131],{"id":132,"by":133,"text":134},"43258882","mdaniel","Please don't forget to add a license to your GH repo as I doubt very seriously the \"license\" field in package.json is authoritative, and doubly so since I think that's one of the…",[136,143],{"value":137,"source":80,"evidence":138},"Does it work with Prisma?",[139],{"id":140,"by":141,"text":142},"43258463","cuuupid","Does this work out of the box with Prisma?",{"value":144,"source":80,"evidence":145},"What is used for search currently?",[146],{"id":147,"by":148,"text":149},"43260960","MarekDlugos","What do you use for search then? Out of curiosity.",[151,155],{"value":152,"source":80,"evidence":153},"PGSync",[154],{"id":125,"by":126,"text":127},{"value":62,"source":80,"evidence":156},[157],{"id":83,"by":84,"text":85},{"comments":159,"answered":160,"key":161},9,4,[162,165,168],{"id":163,"text":164},"43259107","Good catch, I just added an MIT license.",{"id":166,"text":167},"43258486","Thanks! Syncing PG to another data store like Algolia or Elastic is just a very common use case that I use to pitch the idea. But Change-Data-Capture can be used for much more:…",{"id":71,"text":72},{"commenters":170,"max_depth":40,"maker_replies":159,"first_comment_mins":171,"lifespan_hours":172},11,4789,104,[174,176,178,180,182,184,186,187,189,191,193,196,197,199,200,202,205,208,210],[132,37,40,175,133,37],"project\u002Fneutral\u002Fdocs",[163,37,37,177,11,33],"maker\u002Fpositive\u002Fdocs",[109,37,33,179,110,37],"project\u002Fcritical\u002Fdocs",[83,33,32,181,84,37],"project\u002Fpositive\u002Fidea",[166,33,37,183,11,33],"maker\u002Fneutral\u002Fidea",[147,33,40,185,148,37],"maker\u002Fneutral\u002Fnone",[71,33,37,185,11,33],[95,31,40,188,96,37],"project\u002Fmixed\u002Fdocs",[65,31,37,190,11,33],"maker\u002Fneutral\u002Fdocs",[121,40,40,192,122,37],"project\u002Fneutral\u002Fnone",[194,40,37,195,11,33],"43263842","project\u002Fneutral\u002Fidea",[125,160,40,192,126,37],[198,160,37,195,11,33],"43263810",[87,32,32,181,88,37],[201,32,37,185,11,33],"43258542",[102,203,33,204,103,37],6,"project\u002Fcritical\u002Fidea",[206,203,37,207,11,33],"43263736","commenter\u002Fneutral\u002Fidea",[140,209,40,192,141,37],7,[59,209,37,211,11,33],"project\u002Fpositive\u002Fnone",[],[214,219,224,229,234,239],{"id":215,"name":216,"points":217,"category":218},"43255529","Bayleaf",735,"hardware",{"id":220,"name":221,"points":222,"category":223},"43223718","Berlin Swapfest",308,"web_saas",{"id":225,"name":226,"points":227,"category":228},"43230994","Kaguya",254,"productivity",{"id":230,"name":231,"points":232,"category":233},"43243893","Agents.json",212,"ai",{"id":235,"name":236,"points":237,"category":238},"43242818","Foudinge",201,"data",{"id":240,"name":241,"points":242,"category":20},"43196374","Superglue",198,false,"v2",{"id":246,"name":5,"line":6,"ai":243,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":247,"top":18,"kw":248,"maker":11,"domain":10,"tier":19,"attempts":37,"strip":249,"url":9,"mix":250,"praise":79,"objection":92,"sub":21},43217546,0.04,[24,25,26,27],"3015030303030501030",[31,32,33,31],1794036670520]