Ara is the SQLite sync engine for field operations — Search & Rescue, expeditions, disaster response. Write to a local database. State converges across the team over Internet, Network, or Radio, whatever link is up.
Six properties that distinguish Ara from a sync queue or a centralised backend. None of these require code in your application — they are properties of the engine.
Vector-clock delta sync. Conflicts resolve deterministically — no merge handlers in your application code.
SQLite is the source of truth. Ara instruments tracked tables via virtual tables; your schema and queries are unchanged.
Network, Internet, and Radio attach as siblings. The engine syncs over every available link and deduplicates changesets.
Additive migrations, version negotiated on handshake. Older nodes keep working until you choose to upgrade.
Hours or days offline. State converges when any link comes back — no replay coordination, no manual reconciliation.
OpenTelemetry traces on every sync operation. Drop a collector at the Incident Command Post; see the whole mesh.
Open a node, attach a transport, run SQL. No new query language, no merge handlers, no peer discovery code. The rest is the engine's problem.
Go quickstart →node, _ := ara.Open(ctx, ara.Config{
Path: "./ara.db",
Migrations: []ara.Migration{{
Version: 1,
SQL: `CREATE TABLE positions (
id TEXT PRIMARY KEY,
device_id TEXT NOT NULL,
lat REAL NOT NULL,
lon REAL NOT NULL,
recorded_at INTEGER NOT NULL
) STRICT;`,
Sync: []string{"positions"},
}},
})
defer node.Close()
// attach a transport — sync starts immediately
node.AddTransportUDP(7946)
// write — propagates to every peer automatically
node.Exec(ctx,
"INSERT INTO positions (id, device_id, lat, lon, recorded_at) VALUES (?,?,?,?,?)",
"pos-1", "unit-42", 37.7749, -122.4194, time.Now().UnixMilli(),
)
// read locally — always available, even offline
rows, _ := node.Query(ctx,
"SELECT device_id, lat, lon FROM positions ORDER BY recorded_at DESC",
)Attach any combination to a single node. The engine syncs over all available links simultaneously and deduplicates changesets. Network when you have a subnet. Internet when you have a broker. Radio when you have neither.
Works on any subnet. No infrastructure required — nodes discover each other via broadcast.
Works wherever a broker is reachable — LAN, cell, or Starlink at the ICP.
Works when neither Network nor Internet does. 5–15 km, no infrastructure, sub-watt power. Actual bandwidth depends on your regional band and duty-cycle limit.