{"id":524315,"date":"2026-06-08T09:08:11","date_gmt":"2026-06-08T09:08:11","guid":{"rendered":"https:\/\/www.europesays.com\/ie\/524315\/"},"modified":"2026-06-08T09:08:11","modified_gmt":"2026-06-08T09:08:11","slug":"zero-reaches-1-0-marking-the-first-stable-release-of-rocicorps-web-sync-engine","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/ie\/524315\/","title":{"rendered":"Zero Reaches 1.0, Marking the First Stable Release of Rocicorp&#8217;s Web Sync Engine"},"content":{"rendered":"<p><a href=\"https:\/\/rocicorp.dev\/\" rel=\"nofollow noopener\" target=\"_blank\">Rocicorp<\/a> has shipped <a href=\"https:\/\/zero.rocicorp.dev\/docs\/release-notes\/1.0\" rel=\"nofollow noopener\" target=\"_blank\">Zero 1.0<\/a>, the first stable release of its general-purpose sync engine for the web, arriving after nearly two years of development, more than 50 releases, thousands of commits, and hundreds of bugfixes. The milestone signals that Rocicorp now fully supports the Zero API and is committing to maintaining it, with any future breaking changes expected to be rare and far smaller than those seen during the alpha period.<\/p>\n<p>Functionally, the <a href=\"https:\/\/zero.rocicorp.dev\/docs\/release-notes\/1.0\" rel=\"nofollow noopener\" target=\"_blank\">release notes<\/a> describe 1.0 as a very minor update to the previous 0.26.2 build, with the major version bump being largely symbolic and carrying no actual breaking changes. The headline addition is a schema change hook that detects publication changes on <a href=\"https:\/\/supabase.com\/\" rel=\"nofollow noopener\" target=\"_blank\">Supabase<\/a> through COMMENT ON PUBLICATION statements, working around Supabase&#8217;s lack of event trigger support for publications. The release also bundles fixes for corrupted litestream restores, error handling when change data capture is unhealthy, an IPC_CHANNEL_CLOSED race condition during shutdown, orphaned subscriber scenarios, and time and timetz SQL generation.<\/p>\n<p>Zero works by pairing a zero-client library inside the app with a zero-cache service that maintains a read-only replica of a Postgres database. Queries written in ZQL, Zero&#8217;s <a href=\"https:\/\/zero.rocicorp.dev\/\" rel=\"nofollow noopener\" target=\"_blank\">streaming query engine<\/a>, run against the local cache first and return matching results in the next frame, while authoritative results sync from the server in the background. Founder Aaron Boodman has <a href=\"https:\/\/news.ycombinator.com\/item?id=42453431\" rel=\"nofollow noopener\" target=\"_blank\">argued on Hacker News<\/a> that this bring-your-own-database approach is a strength, noting that Zero is &#8220;just a fancy cache&#8221; that cannot corrupt data and lets teams adopt it incrementally or move off it easily.<\/p>\n<p>Community reaction has been positive on developer experience but more cautious on production readiness. Reviewing the engine, <a href=\"https:\/\/marmelab.com\/blog\/2025\/02\/28\/zero-sync-engine.html\" rel=\"nofollow noopener\" target=\"_blank\">Marmelab<\/a> found that it delivered on speed and developer experience while flagging some notable limitations:<\/p>\n<blockquote><p>&#13;<\/p>\n<p>\u2026some limitations can still be significant, depending on the complexity of the app you want to build and the tech stack you want to use. Here are some examples we noted:<\/p>\n<p>&#13;<br \/>\n&#13;<\/p>\n<ul>&#13;<\/p>\n<li>Only Postgres is supported for now<\/li>\n<p>&#13;<\/p>\n<li>Postgres views are not synced<\/li>\n<p>&#13;<\/p>\n<li>Some Postgres column types aren\u2019t supported, like\u00a0array<\/li>\n<p>&#13;<\/p>\n<li>The client API does not allow to react to errors or rejected updates<\/li>\n<p>&#13;\n<\/ul>\n<p>&#13;\n<\/p><\/blockquote>\n<p>Critics on <a href=\"https:\/\/lobste.rs\/s\/ybn8wk\/day_zero_build_good_web_apps_with_zero_sync\" rel=\"nofollow noopener\" target=\"_blank\">Lobsters<\/a> pointed to a client bundle of 718 KB uncompressed (232 KB gzipped) and the absence of server-side rendering, while a <a href=\"https:\/\/www.reddit.com\/r\/ExperiencedDevs\/comments\/1nm98hu\/are_sync_engines_a_bad_idea\/\" rel=\"nofollow noopener\" target=\"_blank\">Reddit thread<\/a> questioned whether stacking a local store, a sync replica, and the source database adds too many layers.<\/p>\n<p>Zero enters a crowded field alongside <a href=\"https:\/\/electric-sql.com\/\" rel=\"nofollow noopener\" target=\"_blank\">ElectricSQL<\/a>, <a href=\"https:\/\/www.instantdb.com\/\" rel=\"nofollow noopener\" target=\"_blank\">InstantDB<\/a>, <a href=\"https:\/\/www.powersync.com\/\" rel=\"nofollow noopener\" target=\"_blank\">PowerSync<\/a>, and <a href=\"https:\/\/www.convex.dev\/\" rel=\"nofollow noopener\" target=\"_blank\">Convex<\/a>, and Boodman has <a href=\"https:\/\/news.ycombinator.com\/item?id=43433617\" rel=\"nofollow noopener\" target=\"_blank\">pointed<\/a> developers wanting fully decentralised, end-to-end setups toward <a href=\"https:\/\/jazz.tools\/\" rel=\"nofollow noopener\" target=\"_blank\">Jazz<\/a>. Server-side rendering itself remains on the <a href=\"https:\/\/zero.rocicorp.dev\/docs\/roadmap\" rel=\"nofollow noopener\" target=\"_blank\">roadmap<\/a> rather than shipped today.<\/p>\n<p>Upgrading is straightforward given the lack of breaking changes:<\/p>\n<p>&#13;<br \/>\nnpm install @rocicorp\/zero@1.0&#13;<\/p>\n<p>Teams coming from much older builds should still review the per-version <a href=\"https:\/\/zero.rocicorp.dev\/docs\/release-notes\" rel=\"nofollow noopener\" target=\"_blank\">release notes<\/a> for earlier API changes, such as the custom mutator type changes in 0.23, and follow the <a href=\"https:\/\/zero.rocicorp.dev\/docs\/schema\" rel=\"nofollow noopener\" target=\"_blank\">schema deployment guidance<\/a> on ordering to avoid downtime during migrations.<\/p>\n","protected":false},"excerpt":{"rendered":"Rocicorp has shipped Zero 1.0, the first stable release of its general-purpose sync engine for the web, arriving&hellip;\n","protected":false},"author":2,"featured_media":524316,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_share_on_mastodon":"0"},"categories":[267],"tags":[365,362,363,364,176393,366,7266,18,117,19,17,37356,101757,19535,226395],"class_list":["post-524315","post","type-post","status-publish","format-standard","has-post-thumbnail","category-arts-and-design","tag-arts","tag-arts-and-design","tag-artsanddesign","tag-artsdesign","tag-caching","tag-design","tag-development","tag-eire","tag-entertainment","tag-ie","tag-ireland","tag-javascript","tag-typescript","tag-web-development","tag-zero-version-1"],"share_on_mastodon":{"url":"https:\/\/pubeurope.com\/@ie\/116713705076213100","error":""},"_links":{"self":[{"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/posts\/524315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/comments?post=524315"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/posts\/524315\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/media\/524316"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/media?parent=524315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/categories?post=524315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/tags?post=524315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}