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. Das Schema Ihrer App ist 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 und JSON Schemas pflegen Sie in der Konsole. Jede neue Version wird geprüft, erlaubt ist nur, was ältere App-Versionen nicht bricht. Unbekannte Felder bleiben erhalten.
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, 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, definieren die Collections und binden das SDK ein.