Offline-first means your application works fully offline, storing data locally first, then syncing to the network when available. GUN is designed with offline-first principles at its core:
✅ Works completely offline
✅ No connection required to read/write data
✅ Automatic sync when back online
✅ No code changes needed
var gun = Gun();// Works offline!gun.get('note').put({text: 'Written offline'});// Works offline!gun.get('note').on(note => { console.log(note.text); // 'Written offline'});// When network returns, automatically syncs
Traditional databases require a connection to a server. GUN stores data locally first, making it instantly available without network latency.
From src/localStorage.js:15, GUN automatically uses localStorage:
Gun.on('create', function(root){ var opt = root.opt; if(false === opt.localStorage){ return } // Disabled opt.prefix = opt.file || 'gun/'; var disk = JSON.parse(localStorage.getItem(opt.prefix)) || {}; // Load from localStorage on startup root.on('get', function(msg){ var soul = msg.get['#']; var data = disk[soul]; Gun.on.get.ack(msg, data); }); // Save to localStorage on write root.on('put', function(msg){ var put = msg.put; var soul = put['#']; disk[soul] = Gun.state.ify(disk[soul], put['.'], put['>'], put[':'], soul); localStorage.setItem(opt.prefix, JSON.stringify(disk)); });});
var gun = Gun();// Write datagun.get('settings').put({theme: 'dark'});// Close browser, come back later// Data is still there!gun.get('settings').once(settings => { console.log(settings.theme); // 'dark'});
// Include RAD adapterimport 'gun/lib/radix';import 'gun/lib/radisk';import 'gun/lib/store';import 'gun/lib/rindexed'; // IndexedDBvar gun = Gun();// Now supports 50MB+ storagegun.get('largeDataset').put(/* large data */);
var gun = Gun(); // No network configured// Still works!gun.get('todo').set({text: 'Buy milk', done: false});gun.get('todo').set({text: 'Walk dog', done: false});// Read works toogun.get('todo').map().on(item => { console.log(item.text);});// Data stored in localStorage
// Device A goes offlinegunA.get('doc').put({text: 'Version A'});// Device B goes offlinegunB.get('doc').put({text: 'Version B'});// Both come back online// GUN syncs and resolves conflict using CRDT// Higher timestamp wins
GUN uses CRDTs (Conflict-free Replicated Data Types) to automatically resolve conflicts when syncing. Learn more in CRDT Concepts.
// Only sync specific data when neededfunction syncImportantData() { gun.get('important').once(data => { if(!data) { // Not in localStorage, fetch from network gun.get('important').on(data => { console.log('Synced:', data); }); } });}
// Don't load everything on startupgun.get('archive').once(data => { // Only load if needed});// Instead of:gun.get('archive').on(data => { // Always listening, even if not visible});