gitwtfhub

wtf is syncforge?

arsenoal/syncforge — explained in plain English

Analysis updated 2026-05-18

37KotlinAudience · developerComplexity · 4/5Setup · moderate

TL;DR

SyncForge is an offline-first sync engine for Kotlin Multiplatform that adds a durable outbox, push/pull sync, and configurable per-entity conflict resolution on top of your own database and backend.

Mindmap

mindmap
  root((SyncForge))
    What it does
      Offline-first sync
      Durable outbox
      Push and pull loop
    Conflict handling
      Last-write-wins
      Merge and gitLike
      CRDT fields
      Defer to user
    Platforms
      Android stable
      iOS and desktop
      Web experimental
    Transports
      REST and GraphQL
      Supabase
      Firebase

Code map

Detail Auto

An interactive map of this repo's files and how they connect — its source is parsed live in your browser. Click Visualize to build it.

filefunction / class

Why would anyone build with this?

REASON 1

Add offline-first sync with a durable outbox to an Android, iOS, or desktop app backed by your own API.

REASON 2

Choose a per-entity conflict resolution strategy such as last-write-wins, merge, or defer-to-user.

REASON 3

Connect to REST, GraphQL, Supabase, or Firebase as the sync transport without rewriting the sync stack.

REASON 4

Test sync behavior locally using the included mock server and sample app with a debug sync-health overlay.

What's in the stack?

KotlinKotlin MultiplatformSQLDelightRoomCompose

How it stacks up

arsenoal/syncforgeandroidpoet/mirageazxcvn/mpvrx-cn
Stars373736
LanguageKotlinKotlinKotlin
Setup difficultymoderateeasyeasy
Complexity4/52/51/5
Audiencedeveloperdevelopergeneral

Figures from each repo's GitHub metadata at analysis time.

How do you spin it up?

Difficulty · moderate Time to first run · 1h+

Requires your own backend implementing the REST push/pull contract, or a supported transport like Supabase or Firebase.

Wtf does this do

SyncForge is an offline-first sync engine for Kotlin Multiplatform apps, built for developers who already own their own database and their own backend API rather than wanting a fully managed backend service. It sits on top of a developer's existing entity store, such as Room or SQLDelight, and adds a durable outbox, a push and pull sync loop, and configurable conflict handling for each type of data. Local writes always go to the developer's own store first, and changes are queued so that syncing can happen whenever the network becomes available, with offline edits and app restarts treated as normal cases rather than exceptions. The README is explicit about who it fits: teams building offline-first mobile or multiplatform apps against their own API, who want an outbox that survives the app being killed, per-data-type conflict strategies, and Android as the primary platform with iOS, JVM desktop, and macOS following the same model. It is explicitly not a fit for teams wanting a fully managed backend that owns their schema and authentication, automatic handling of breaking changes to their data structure, or full real-time collaborative document editing. Conflict handling supports several strategies including last-write-wins, always preferring local or remote changes, custom merge logic, git-style conflict resolution, CRDT-based field merging, and deferring the decision to the user. The library ships stable support for REST, GraphQL, Supabase, and Firebase as transport options, along with a built-in authentication helper for apps whose API matches an expected shape. A sample app and mock server are included so developers can see syncing, forced conflicts, and local data clearing in action. Android and the JVM desktop and iOS platforms are described as stable, while debugging tools, tracing, and browser support are marked experimental. The wire format for the REST push and pull endpoints is frozen for the 2.x release line, and the library is distributed through Maven Central.

Yoink these prompts

Prompt 1
Set up SyncForge in my Android app using the version catalog and enqueue a change after writing to Room.
Prompt 2
Explain the difference between SyncForge's outbox model and a fully managed backend-as-a-service like Firebase.
Prompt 3
Walk me through configuring a per-entity conflict policy, like gitLike or crdt, for two of my data types.
Prompt 4
Run the SyncForge mock server and sample app to see a forced conflict and local data clear in action.
Prompt 5
Compare SyncForge's REST push/pull contract to implementing my own sync endpoint from scratch.

Frequently asked questions

wtf is syncforge?

SyncForge is an offline-first sync engine for Kotlin Multiplatform that adds a durable outbox, push/pull sync, and configurable per-entity conflict resolution on top of your own database and backend.

What language is syncforge written in?

Mainly Kotlin. The stack also includes Kotlin, Kotlin Multiplatform, SQLDelight.

How hard is syncforge to set up?

Setup difficulty is rated moderate, with roughly 1h+ to a first successful run.

Who is syncforge for?

Mainly developer.

View the repo → Decode another repo

This repo across BitVibe Labs

Don't trust strangers blindly. Verify against the repo.