Offline zuerst
Die App schreibt in ihre eigene Datenbank, ob SwiftData, SQLite oder Room. Das SDK merkt sich jede Änderung und gleicht ab, sobald wieder Netz da ist.

tightrelay ist der Sync-Dienst für native Apps. Ihre App behält ihre lokale Datenbank, tightrelay bringt die Änderungen auf alle Geräte und löst Konflikte auf dem Server.
Windows offline nehmen, dort ändern, dann auf dem Mac ändern und Windows wieder verbinden. Die spätere Änderung gewinnt, überall.
Der Dienst kennt keine Fachtabellen. Er speichert JSON-Dokumente, versioniert sie und verteilt Änderungen. Ein Schema ist optional und Konfiguration, kein Servercode.
Die App schreibt in ihre eigene Datenbank, ob SwiftData, SQLite oder Room. Das SDK merkt sich jede Änderung und gleicht ab, sobald wieder Netz da ist.
Der Schlüssel liegt in Secure Enclave, TPM oder Android Keystore. Neue Geräte finden ihr Konto über iCloud-Schlüsselbund oder Block Store, andere koppeln Sie per QR.
Geteilte Spaces für Teams oder Betriebe, mit Einladung per QR-Code und Rollen zum Verwalten, Bearbeiten oder Lesen.
Jede Änderung trägt einen Zeitstempel einer hybriden logischen Uhr. Pro Dokument gewinnt die spätere Änderung, und alle Geräte landen beim selben Stand.
Auf Wunsch synchronisiert tightrelay nur mit gültigem Abo. Der Server prüft Käufe, Verlängerung, Ablauf und Rückerstattung selbst. Läuft ein Abo aus, ruht der Sync, die Daten bleiben.
Collections entstehen beim ersten Sync. Ein Schema legen Sie fest, wenn Sie wollen: im Formular der Konsole, als Vorschlag aus Ihren Daten oder aus Ihrem Code. Danach ist nur erlaubt, was ältere App-Versionen nicht bricht.
Kein Server aufsetzen, keine Tabellen anlegen, kein Schema schreiben. Sie brauchen eine App-ID und das SDK.
In der Konsole eine App-ID wählen. Kein API-Schlüssel, kein Passwort: Jedes Gerät meldet sich beim ersten Sync selbst an.
Das SDK kommt per Swift Package, NuGet oder Maven. Ein kleiner Adapter verbindet es mit der Datenbank, die Ihre App schon hat.
create(collection: "notes", …) und sync(). Die Collection entsteht beim ersten Sync, auf allen Geräten.
Später, wenn Sie wollen, ein Schema: im Formular der Konsole, als Vorschlag aus den gespeicherten Daten oder aus Ihrem Code mit tightrelay-cli schema push, auch in der CI.
Swift, C# und Kotlin, ohne Fremdabhängigkeiten. Alle drei spielen dieselben Testvektoren ab und verhalten sich gleich.
let client = TightRelayClient( configuration: .init(baseURL: api, appId: "stundennachweis", clientSchema: 1, deviceName: "Mac"), store: MySwiftDataStore(), identities: KeychainIdentityStore(appId: "stundennachweis"), recovery: ICloudKeychainRecoveryStore(appId: "stundennachweis")) try await client.create(collection: "clients", data: ["name": "Müller AG"]) try await client.update(id, set: ["archived": true]) // Merge try await client.delete(id) // Tombstone let report = try await client.sync() // Push, dann Pull
var client = new TightRelayClient( new TightRelayConfiguration(api, "stundennachweis", ClientSchema: 1, DeviceName: Environment.MachineName), store: new MySqliteStore(db), identities: new FileIdentityStore(identityPath), // Schlüssel im TPM recovery: new DpapiRecoveryStore(recoveryPath)); await client.CreateAsync("clients", new JsonObject { ["name"] = "Müller AG" }); await client.UpdateAsync(id, new JsonObject { ["archived"] = true }); await client.DeleteAsync(id); var report = await client.SyncAsync();
val client = TightRelayAndroid.client( context, api, appId = "stundennachweis", clientSchema = 1, store = MyRoomStore(db)) // Schlüssel im Keystore client.create("clients", jsonOf("name" to "Müller AG")) client.update(id, jsonOf("archived" to true)) client.delete(id) val report = client.sync() // auch aus dem WorkManager
Ein Durchgang besteht aus Push und Pull über HTTPS. Jeder Request ist mit dem Geräteschlüssel signiert.
Die App speichert wie gewohnt. Das SDK stempelt die Änderung mit der Uhr des Geräts und merkt sie zum Hochladen vor.
Der Server prüft das Schema, falls eines festgelegt ist, vergleicht die Zeitstempel und übernimmt nur Neueres. Ist die Änderung älter, bekommt das Gerät den aktuellen Stand zurück.
Jede übernommene Änderung erhält die nächste Nummer ihres Space, lückenlos, auch bei gleichzeitigen Uploads.
Das Gerät holt alles ab seiner letzten Nummer, seitenweise und in je einer Transaktion. Bricht die Verbindung ab, geht nichts verloren.
Ein kleiner Umfang hält den Dienst verständlich und berechenbar. Wenn Ihre App eines davon braucht, ist tightrelay heute nicht das Richtige.
Kein Echtzeit-PushGeräte gleichen nach Änderungen, beim Start und alle paar Minuten ab. Für einen Chat zu langsam, für Arbeitsdaten genug.
Keine Feld-ZusammenführungÄndern zwei Geräte dasselbe Dokument, gewinnt die spätere Änderung als Ganzes.
Keine DateienFotos und PDFs gehören nicht in den Sync. Ein Dokument ist höchstens 64 KB gross.
Kein Web-ClientGebaut für native Apps mit eigener Datenbank, nicht für Browser.
Die Zeiterfassung für Freelancer synchronisiert Auftraggeber, Projekte und Einträge über tightrelay. Ein laufender Timer erscheint sofort auf den anderen Geräten.
Startet man auf zwei Geräten gleichzeitig einen Timer, beendet eine Regel auf dem Server den älteren. Solche Regeln laufen in derselben Transaktion wie der Upload.
Registrieren Sie sich in der Konsole. Nach der Freischaltung legen Sie Ihre App an und binden das SDK ein. Die Collections entstehen beim ersten Sync.