top of page

Syncular Hit Hacker News, but Its Two-Core SQL Sync Bet Still Needs Proof

Syncular reached Hacker News with 22 points and nine comments, pitching offline-first SQL sync across browsers, mobile apps, and desktop software. The project places SQLite on every client, queues local writes, and reconciles them through one server-authoritative commit log. Its sharper claim is architectural: separate TypeScript and Rust cores should behave as one implementation.

That approach challenges a familiar compromise in offline-first development. Teams often choose broad platform support, a consistent protocol, or direct control over deployment, but rarely get all three without maintaining substantial synchronization code.

Syncular says its written specification and shared conformance tests can close that gap. Yet its public performance results mostly measure an in-process environment, while its adoption footprint remains small. The launch therefore matters less as a finished victory than as a testable proposal for operating SQL synchronization without surrendering the stack.

The central contest is not simply Syncular against PowerSync, ElectricSQL, or another vendor. It is specification-driven portability against the operational certainty of a more established, narrower path.

What the Hacker News Launch Actually Introduced

Syncular’s release packages several difficult synchronization concerns behind one protocol, while keeping the server firmly in control.

The project describes itself as server-authoritative, offline-first SQL synchronization. Each device keeps a complete SQLite database for the data it may access. Browser clients use SQLite compiled to WebAssembly and persisted through the Origin Private File System, commonly shortened to OPFS.

Native clients use native SQLite through Syncular’s Rust core. Local reads do not wait for a network request, while writes enter an optimistic outbox. An optimistic outbox stores an intended change locally before the central server accepts or rejects it.

When connectivity returns, queued writes move toward the server’s ordered commit log. The server validates each mutation, assigns its place in the global sequence, and returns accepted changes to authorized clients. That ordering gives every connected replica a common history.

This design means “offline-first” does not imply peer-to-peer authority. Users can continue reading and editing without a connection, but the server retains the final say when devices reconnect. Rejected or superseded writes require correction on the client.

The project’s source repository lists server adapters for SQLite, PostgreSQL, and Cloudflare D1. It also includes bindings for React, Swift, Kotlin, Flutter, React Native, Tauri, and Rust. Server libraries target Bun or Node through Hono, plus Cloudflare Workers.

That surface area makes the release notable. Supporting one web client is already difficult because browser storage, lifecycle events, and network interruptions introduce failure modes. Supporting native environments adds foreign-function interfaces, packaging differences, and platform-specific scheduling constraints.

Syncular divides that work between two cores. Its TypeScript core serves web applications, while its Rust core supplies native environments through a C-compatible interface. Generated query APIs extend to TypeScript, Swift, Kotlin, Dart, and Rust.

The two implementations follow a written protocol rather than sharing all execution code. Syncular says golden byte-level test vectors and 95 conformance scenarios run against both cores. A conformance scenario checks whether independent implementations produce the same observable result from the same inputs.

That distinction is the heart of the announcement. Cross-platform libraries often wrap one native engine everywhere or recreate similar behavior separately for each platform. The first approach can complicate web delivery, while the second creates drift between implementations.

Syncular instead accepts two implementations and tries to control drift through specification and testing. The model resembles standards-based interoperability on a small scale. The specification becomes the authority, and code that disagrees with it must change.

The public feature list reaches beyond basic row replication. It includes scope-based authorization, durable rejection handling, WebSocket updates, generated SQL interfaces, full-text search, optional column encryption, binary attachments, and windowed synchronization.

Windowed synchronization lets a client retain only an authorized subset of a larger dataset. That capability matters because copying an entire business database onto every phone or browser would be impractical and unsafe.

The Hacker News post gave that bundle a public launch moment, but the project already shows considerable repository activity. GitHub displayed more than 1,200 commits when reviewed, alongside an Apache 2.0 license and a modest early audience.

Those numbers should not be treated as adoption evidence. Commit volume measures development activity, not production reliability. Stars, forks, and discussion counts can also change quickly after a public launch.

What changed is simpler: developers now have an inspectable implementation that connects web and native clients through one specified synchronization model. That creates the article’s tension because the hardest promise is behavioral consistency, not feature availability.

Why Offline-First SQL Still Pressures Application Teams

Offline-first software moves latency out of the user interface, but it transfers distributed-systems complexity into the synchronization layer.

A conventional online application sends a request to a remote service, waits for authorization and database work, then updates the interface. Developers understand this model, and central control simplifies consistency. Users experience its weakness whenever connectivity becomes slow or unreliable.

An offline-first application reverses that interaction. It reads and writes a database on the device, updates the interface immediately, and synchronizes changes in the background. The app remains responsive on a train, inside a warehouse, or during a temporary service outage.

The local database can also simplify client state management. Screens query durable data rather than coordinating several memory caches. Background synchronization then updates that same database as remote changes arrive.

However, every client becomes a replica that can disappear for an unknown period. Different users may update the same row while disconnected. Old software versions may return with mutations created under an earlier schema.

Authorization can also change during an offline interval. A user might lose access to a workspace after data has already reached the device. Attachments, deleted records, and encrypted fields add further lifecycle questions.

This is why offline support cannot be reduced to saving pending HTTP requests. A production system needs ordering, retries, idempotency, conflict policies, schema evolution, authorization, and recovery after interrupted writes.

Idempotency means that replaying the same operation does not create a second unintended result. It becomes essential when a client cannot tell whether the server received its last message before a connection failed.

The local-first principles published by Ink & Switch framed local ownership, collaboration, longevity, privacy, and user control as related goals. Most current synchronization products implement only part of that vision.

Syncular belongs to the practical server-authoritative branch. Data lives locally for speed and resilience, but the central service remains necessary for convergence, access control, and collaboration. The architecture does not promise that an application can outlive its backend unchanged.

That compromise also appears in other products. PowerSync describes local databases as the immediate read-and-write surface while acknowledging that its architecture remains server-authoritative. Its local-first model similarly separates practical offline operation from full decentralization.

For application teams, the pressure comes from user expectations on one side and engineering capacity on the other. Users expect mobile and desktop software to open quickly, preserve work, and tolerate weak networks. Teams cannot casually build a replication protocol whenever they add a second platform.

Syncular’s cross-platform argument targets that gap. A web team can use TypeScript without sending a Rust engine into the browser. Native teams can share a Rust implementation instead of rebuilding synchronization behavior in Swift, Kotlin, and Dart.

The forced response is architectural. Teams evaluating offline-first features must decide whether to adopt an external sync engine, constrain their platform ambitions, or fund a substantial internal system.

Established providers face a different pressure. Syncular exposes its protocol, server components, test fixtures, and clients under an open license. Buyers who value self-hosting can inspect the rules that govern data movement and retain more deployment control.

That does not automatically make Syncular safer or cheaper to operate. Open code transfers some responsibilities from a vendor to the adopting team. Security patches, upgrades, monitoring, capacity planning, and recovery procedures still need accountable owners.

The timing also reflects improvements around SQLite. Browsers can now persist SQLite databases through OPFS, while native frameworks routinely expose SQLite. WebAssembly makes a common SQL engine viable inside modern web applications, although support and lifecycle behavior still vary.

Meanwhile, teams increasingly ship the same product through browsers, mobile apps, and desktop shells. A synchronization system that stops at React or one mobile framework leaves a costly gap. Syncular’s two-core design directly answers that cross-platform expansion.

The project therefore pressures both internal platform teams and existing sync providers. Internal teams must justify custom protocols. Vendors must explain where their managed operations, integrations, maturity, or support outweigh an operable open stack.

This is a long-term contest because synchronization becomes infrastructure once users trust it with their work. A convincing demo can start evaluation, but migration, failure testing, and production history decide adoption.

Two Cores Turn Portability Into a Testable Contract

Syncular’s main mechanism is not SQLite itself; it is the decision to make two independent cores obey one observable contract.

Sharing one codebase across every environment sounds attractive, yet runtime boundaries make that difficult. Browsers favor TypeScript and WebAssembly, while mobile and desktop applications often benefit from native libraries. A universal engine can impose packaging, binary-size, or debugging costs on platforms it does not naturally fit.

Separate implementations solve the runtime problem but create a correctness problem. A TypeScript client might encode a value differently from Rust. Each core might handle duplicate commits, clock changes, or partial failures in subtly different ways.

Those differences rarely appear during a happy-path demonstration. They emerge after retries, upgrades, interrupted transactions, and conflicting offline edits. By then, affected applications may contain databases with divergent histories.

Syncular’s answer is a normative specification, golden vectors, and shared scenarios. Golden vectors are fixed inputs with exact expected byte outputs. They catch protocol changes that ordinary behavior tests might miss.

The project says both cores run 95 conformance scenarios. Those scenarios cover observable behavior rather than matching internal implementation details. That allows TypeScript and Rust to use different techniques while requiring equivalent results.

A third-party client could theoretically join by implementing the same specification and passing the same tests. This lowers dependence on a particular language binding, at least at the protocol level. Whether outside contributors can do that efficiently remains unproven.

The ordered commit log supplies the second part of the mechanism. Every accepted server mutation receives a single position. Clients track cursors that indicate how far they have consumed the sequence.

This central order avoids the ambiguity of fully decentralized replication. The server can apply business rules and authorization before accepting a write. Clients then converge on the history that the server recognizes.

The price is correction. A local interface can optimistically show a change that the server later rejects. The application must explain, reverse, or merge that outcome without confusing the user.

Syncular says rejection information survives restarts until the application resolves it. That is an important design detail because silent rollback destroys trust. However, developers still need product-level decisions for presenting failures.

Consider a field-service application. A technician can update an equipment record underground, attach a photograph, and close a task without connectivity. The local database preserves those actions and updates the interface.

When the device reconnects, the server may discover that another worker already closed the task. It may accept both notes, reject one status change, or run domain-specific logic. The synchronization engine transports and orders facts, but the application still defines what a valid resolution means.

Collaborative text creates another case. Row-level last-write behavior can erase concurrent edits, so Syncular includes optional Yjs-based conflict-free replicated data types for selected columns. A CRDT merges concurrent changes according to deterministic rules without requiring one edit to overwrite another wholesale.

Keeping CRDT behavior identical across two cores raises the value of byte-level tests. It also expands the system’s risk surface. Encryption, binary attachments, filtered replicas, and collaborative fields each introduce independent correctness and security requirements.

Scope-based authorization is similarly central. Syncular describes scopes as server-resolved rules that determine which rows an actor can read or modify. The server checks writes and distributes changes only to eligible clients.

That mechanism is more demanding than adding a filter to an initial download. Permissions can change after data reaches a device. A complete design needs local removal behavior, safe resubscription, and protection against unauthorized historical segments.

Syncular documents an authorized purge mechanism for local revocation. The existence of that path is encouraging, but production adopters should test it under device restarts, interrupted downloads, and changing identities.

The dual-core approach offers a clear engineering thesis: portability should come from a behavioral contract, not from pretending every platform is identical. It turns cross-platform parity into something teams can inspect and reproduce.

Still, conformance only proves what the suite asks. Unknown failure modes remain unknown. The credibility of this mechanism will grow when outside contributors add adversarial cases and independent implementations pass them.

The Benchmarks Show Engine Speed, Not Production Certainty

Syncular publishes unusually direct caveats, and those caveats matter more than its fastest numbers.

The project reports a median 30.4 milliseconds to bootstrap 100,000 rows from a precomputed SQLite image. It reports 362.6 milliseconds for the same row count through its rows-based path. The first cold image build reportedly took 288.5 milliseconds.

For real-time propagation, Syncular reports a 0.1-millisecond median and 0.2-millisecond p95. Its TypeScript client code measures 31.3 KB after gzip, excluding SQLite’s JavaScript glue and WebAssembly binary.

The complete measured browser payload totals 492.7 KB after gzip when those vendor assets are included. The benchmark also reports a 20 MB peak resident-memory increase during the 100,000-row bootstrap.

Those figures come from Syncular’s own benchmark methodology, not an independent evaluation. The recorded run used Bun 1.3.14 on Darwin with an Arm processor and deterministic seed data.

More importantly, client and server exchanged bytes inside one process. Transport calls, segment downloads, and real-time delivery did not cross an actual network. Browser performance also differs because the benchmark client used Bun’s SQLite implementation, not SQLite WebAssembly.

The project explicitly says network latency will dominate its 0.2-millisecond p95 figure. That disclosure prevents an obvious misreading, but the headline number can still travel farther than its caveat.

The image bootstrap result also represents a warm path. The server builds an image once for a given permission scope and pin, then later clients import that artifact. Performance will depend on cache reuse, database shape, image size, storage location, and download conditions.

A production evaluation needs wider measurements. Teams should test median and tail latency over real sockets, cold starts, mobile radios, browser storage pressure, and slow devices. They should also measure recovery after interrupted downloads and large offline queues.

Scale introduces another unanswered dimension. One ordered log simplifies reasoning, but implementations must partition work without violating ordering guarantees. Popular applications may contain many tenants, scopes, rapidly changing rows, and clients at different cursor positions.

Pruning matters too. A commit log cannot grow forever without retention policies, snapshots, or compaction. Those operations must preserve recovery for devices that remain offline longer than expected.

Security deserves equal attention. The repository includes optional per-column encryption and scope enforcement, but features do not substitute for threat modeling. Adopters need to examine key handling, metadata exposure, local database protection, and authorization changes.

The project’s small public footprint compounds uncertainty. A young repository can contain thoughtful engineering without having encountered years of production edge cases. Early adoption should therefore begin with bounded, recoverable workloads.

A notes application, inspection checklist, or field inventory tool can provide a sensible trial. Teams can compare local behavior, reconnection outcomes, and operational effort without first moving financial records or safety-critical workflows.

The same caution applies to supported platforms. A binding’s presence does not establish equivalent lifecycle quality. iOS background limits, Android process death, browser quota rules, and desktop file locking require platform-specific testing.

Competitors bring their own tradeoffs. PowerSync focuses on synchronizing backend databases with local SQLite and documents multiple mobile examples. ElectricSQL has emphasized syncing subsets of PostgreSQL data into local application state.

Earlier projects such as SQLSync explored SQLite-centered collaboration through different transaction and conflict models. The SQLSync discussion showed that developers consistently ask about native platforms, conflicts, and the cost of rebasing state.

Syncular’s wider package does not erase those questions. It relocates some answers into a specification and conformance suite. That is useful, yet only deployment evidence can establish whether the answers survive real workloads.

There is also a product risk hidden inside breadth. Supporting web, native clients, multiple servers, encryption, attachments, CRDT fields, and generated queries creates many compatibility combinations. Each new combination increases testing and release-management demands.

The project’s spec-first doctrine is designed for exactly that problem. However, a doctrine works only when maintainers consistently update fixtures, reject accidental incompatibility, and publish migration paths.

Version skew offers a decisive test. Production fleets rarely upgrade together. A phone may stay several releases behind while the server and web client advance.

Syncular needs clear guarantees for supported protocol ranges, schema changes, and deprecated behavior. Otherwise, identical current cores can still diverge across time. Long-lived offline clients make that risk especially important.

The appropriate conclusion is not that Syncular’s metrics are misleading. Its benchmark page is more candid than many launch pages. The conclusion is that engine benchmarks answer a narrow question about implementation overhead.

They do not establish operational certainty, platform maturity, or safe convergence under hostile conditions. Those are the standards Syncular must meet if the two-core contract becomes infrastructure.

What Developers Should Watch After the Hacker News Debut

Three signals will show whether Syncular is becoming dependable infrastructure or remaining an ambitious reference implementation.

The first signal is independent production use. Public case studies should describe dataset size, connected devices, offline duration, conflict rates, and deployment topology. A logo without workload details would add little evidence.

The strongest validation would come from an application serving real users across both web and native clients. That would exercise the exact boundary Syncular’s two-core architecture exists to solve.

Reports should include failure behavior, not only responsiveness. How often did the server reject optimistic writes? How did users understand corrections? What happened when devices returned after weeks offline?

If credible production deployments appear, the specification-driven portability thesis gains support. If adoption remains limited to demos, the project’s broad platform claims remain technically interesting but commercially untested.

The second signal is conformance growth from outside contributors. The current suite contains 95 scenarios for each core, according to the project. The important next step is adversarial coverage based on bugs found beyond the maintainers’ own assumptions.

Useful additions would target version skew, reordered packets, authorization changes, partial segment downloads, corrupted local state, and repeated reconnections. Encryption and CRDT combinations deserve separate cases because each adds state transitions.

An independent protocol implementation would provide even stronger evidence. It would reveal whether the written specification is complete enough for outsiders to reproduce behavior without relying on undocumented code knowledge.

If another implementation passes the suite, Syncular’s protocol becomes more credible as a real contract. If only the original two cores can interpret it correctly, shared tests may be masking implicit coupling.

The third signal is reproducible performance over real networks and devices. Syncular already provides scripts for reproducing its in-process results, which gives evaluators a useful starting point.

The next benchmark set should include browser SQLite, midrange phones, mobile networks, cold server instances, and realistic payloads. Tail latency and recovery time matter more than a best-case in-process median.

Evaluators should also measure total transfer size for first synchronization and catch-up after long absences. A fast import cannot compensate for a large artifact over a constrained connection.

Operational tests should cover log pruning, database migrations, backup restoration, and server failover. These events determine whether a synchronization engine remains manageable after the initial deployment.

Stronger real-world results would reinforce Syncular’s claim that one protocol can serve many platforms. Large gaps between the loopback lane and deployed behavior would weaken the performance story without necessarily invalidating the architecture.

Developers do not need to wait passively for those signals. The Apache-licensed code, public specification, test fixtures, and benchmark scripts allow direct evaluation. Teams can build a failure matrix around the exact conditions their users face.

Start by choosing one cross-platform workflow where stale data is tolerable and corrections remain visible. Simulate long disconnections, expired permissions, duplicated messages, and incompatible client versions. Then compare observed behavior with the protocol’s promises.

Treat every optimistic interface state as provisional. Define how the product communicates server rejection before deciding that synchronization works. Technical convergence is not enough if users cannot understand why their saved action changed.

Examine the operational boundary as carefully as the client API. Determine who monitors the commit log, manages storage, rotates keys, restores backups, and handles a protocol upgrade. Self-hosting creates control only when those responsibilities have owners.

The Hacker News response gave Syncular attention, not validation. Its 22 points and nine comments indicate curiosity around a persistent developer problem. They do not establish market demand or reliability.

What makes Syncular worth following is its falsifiable design. Two cores either stay behaviorally aligned under difficult conditions, or they do not. The specification either enables outside implementations, or hidden assumptions block them.

That clarity is valuable in a category filled with attractive demonstrations and painful edge cases. Syncular has exposed enough code, tests, and caveats for developers to challenge its claims directly.

The next move belongs to teams that need offline-first SQL across several platforms. Reproduce the benchmarks, extend the conformance suite, and test correction paths before trusting the architecture with essential data. Then share the failures as openly as the successes, because those results will decide whether this Hacker News launch marked a durable sync layer or merely a persuasive beginning.

Get started for free

A local first AI Assistant w/ Personal Knowledge Management

remio only supports Windows 10+ (x64) and M-Chip Macs currently.

Your AI Partner at Work
Get more done with remio

Plan. Create. Deliver.
All in one place.

bottom of page