[{"data":1,"prerenderedAt":278},["ShallowReactive",2],{"navigation":3,"index":121},[4],{"title":5,"path":6,"stem":7,"children":8,"page":44},"Docs","\u002Fdocs","docs",[9],{"title":10,"path":11,"stem":12,"children":13,"page":44},"V1","\u002Fdocs\u002Fv1","docs\u002Fv1",[14,18,22,45,58,80,93,111],{"title":15,"path":16,"stem":17},"Introduction","\u002Fdocs\u002Fv1\u002Fintroduction","docs\u002Fv1\u002F0.introduction",{"title":19,"path":20,"stem":21},"How It Works","\u002Fdocs\u002Fv1\u002Fhow-it-works","docs\u002Fv1\u002F1.how-it-works",{"title":23,"icon":24,"path":25,"stem":26,"children":27,"page":44},"Client","i-lucide-laptop","\u002Fdocs\u002Fv1\u002Fclient","docs\u002Fv1\u002F2.client",[28,32,36,40],{"title":29,"path":30,"stem":31},"Client Setup","\u002Fdocs\u002Fv1\u002Fclient\u002Fsetup","docs\u002Fv1\u002F2.client\u002F1.setup",{"title":33,"path":34,"stem":35},"Syncing","\u002Fdocs\u002Fv1\u002Fclient\u002Fsyncing","docs\u002Fv1\u002F2.client\u002F2.syncing",{"title":37,"path":38,"stem":39},"Events","\u002Fdocs\u002Fv1\u002Fclient\u002Fevents","docs\u002Fv1\u002F2.client\u002F3.events",{"title":41,"path":42,"stem":43},"Configuration","\u002Fdocs\u002Fv1\u002Fclient\u002Fconfiguration","docs\u002Fv1\u002F2.client\u002F4.configuration",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Server","i-lucide-server","\u002Fdocs\u002Fv1\u002Fserver","docs\u002Fv1\u002F3.server",[51,55],{"title":52,"path":53,"stem":54},"Server Setup","\u002Fdocs\u002Fv1\u002Fserver\u002Fsetup","docs\u002Fv1\u002F3.server\u002F1.setup",{"title":41,"path":56,"stem":57},"\u002Fdocs\u002Fv1\u002Fserver\u002Fconfiguration","docs\u002Fv1\u002F3.server\u002F2.configuration",{"title":59,"icon":60,"badge":61,"path":62,"stem":63,"children":64,"page":44},"NativePHP","i-lucide-smartphone","Commercial","\u002Fdocs\u002Fv1\u002Fnativephp","docs\u002Fv1\u002F4.nativephp",[65,69,73,76],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fv1\u002Fnativephp\u002Foverview","docs\u002Fv1\u002F4.nativephp\u002F1.overview",{"title":70,"path":71,"stem":72},"Setup","\u002Fdocs\u002Fv1\u002Fnativephp\u002Fsetup","docs\u002Fv1\u002F4.nativephp\u002F2.setup",{"title":41,"path":74,"stem":75},"\u002Fdocs\u002Fv1\u002Fnativephp\u002Fconfiguration","docs\u002Fv1\u002F4.nativephp\u002F3.configuration",{"title":77,"path":78,"stem":79},"Lifecycle & Events","\u002Fdocs\u002Fv1\u002Fnativephp\u002Flifecycle","docs\u002Fv1\u002F4.nativephp\u002F4.lifecycle",{"title":81,"icon":82,"badge":61,"path":83,"stem":84,"children":85,"page":44},"Server Pro","i-lucide-bar-chart-2","\u002Fdocs\u002Fv1\u002Fserver-pro","docs\u002Fv1\u002F5.server-pro",[86,89],{"title":66,"path":87,"stem":88},"\u002Fdocs\u002Fv1\u002Fserver-pro\u002Foverview","docs\u002Fv1\u002F5.server-pro\u002F1.overview",{"title":90,"path":91,"stem":92},"Features","\u002Fdocs\u002Fv1\u002Fserver-pro\u002Ffeatures","docs\u002Fv1\u002F5.server-pro\u002F2.features",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":44},"Advanced","i-lucide-settings-2","\u002Fdocs\u002Fv1\u002Fadvanced","docs\u002Fv1\u002F6.advanced",[99,103,107],{"title":100,"path":101,"stem":102},"Service Container","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fservice-container","docs\u002Fv1\u002F6.advanced\u002F0.service-container",{"title":104,"path":105,"stem":106},"Conflict Resolution","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fconflict-resolution","docs\u002Fv1\u002F6.advanced\u002F1.conflict-resolution",{"title":108,"path":109,"stem":110},"Payload Mapping","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fpayload-mapping","docs\u002Fv1\u002F6.advanced\u002F2.payload-mapping",{"title":112,"icon":113,"path":114,"stem":115,"children":116,"page":44},"Examples","i-lucide-book-open","\u002Fdocs\u002Fv1\u002Fexamples","docs\u002Fv1\u002F7.examples",[117],{"title":118,"path":119,"stem":120},"Task Manager","\u002Fdocs\u002Fv1\u002Fexamples\u002Ftask-manager","docs\u002Fv1\u002F7.examples\u002F1.task-manager",{"id":122,"title":123,"body":124,"description":123,"extension":269,"meta":270,"navigation":271,"path":272,"seo":273,"stem":276,"__hash__":277},"landing\u002Findex.md","",{"type":125,"value":126,"toc":265},"minimark",[127,173,176],[128,129,131,145,150,170],"u-page-hero",{"orientation":130},"horizontal",[132,133,134],"template",{"v-slot:title":123},[135,136,137,138,144],"p",{},"Offline-first sync for ",[139,140,143],"span",{"className":141},[142],"text-primary","Laravel & NativePHP",".",[132,146,147],{"v-slot:description":123},[135,148,149],{},"Build offline-first Laravel and NativePHP apps with local database writes, mutation logs, conflict resolution, and client-driven sync when connectivity returns - without WebSockets, polling, or realtime infrastructure.",[132,151,152,160],{"v-slot:links":123},[153,154,157],"u-button",{"size":155,"to":16,"trailing-icon":156},"xl","i-lucide-arrow-right",[135,158,159],{},"Read docs",[153,161,167],{"size":155,"to":162,"color":163,"icon":164,"target":165,"variant":166},"https:\u002F\u002Fgithub.com\u002Flrakauskas\u002Ftether-core","neutral","i-simple-icons-github","_blank","outline",[135,168,169],{},"View on GitHub",[171,172],"hero-architecture-panel",{},[174,175],"home-package-family",{},[177,178,179,184],"u-page-section",{},[132,180,181],{"v-slot:title":123},[135,182,183],{},"Built for real-world offline apps",[132,185,186,200,213,226,239,252],{"v-slot:features":123},[187,188,190,195],"u-page-feature",{"icon":189},"i-lucide-wifi-off",[132,191,192],{"v-slot:title":123},[135,193,194],{},"Truly offline-first",[132,196,197],{"v-slot:description":123},[135,198,199],{},"No network dependency for reads or writes. Data lives in a local database. Sync is a background concern, not a blocking step.",[187,201,203,208],{"icon":202},"i-lucide-arrow-right-left",[132,204,205],{"v-slot:title":123},[135,206,207],{},"Client-initiated sync",[132,209,210],{"v-slot:description":123},[135,211,212],{},"The server never pushes to clients. All sync is triggered by the client - on demand, on a schedule, or automatically via queue jobs.",[187,214,216,221],{"icon":215},"i-lucide-git-merge",[132,217,218],{"v-slot:title":123},[135,219,220],{},"Conflict resolution",[132,222,223],{"v-slot:description":123},[135,224,225],{},"The server detects conflicts when two clients modify the same record. Register a custom resolver per model, or rely on the sensible last-write-wins default.",[187,227,229,234],{"icon":228},"i-lucide-fingerprint",[132,230,231],{"v-slot:title":123},[135,232,233],{},"ULID identity",[132,235,236],{"v-slot:description":123},[135,237,238],{},"Every record gets a client-generated ULID before it touches the network. No ID remapping on sync. Records created offline merge cleanly when they reach the server.",[187,240,242,247],{"icon":241},"i-lucide-refresh-cw",[132,243,244],{"v-slot:title":123},[135,245,246],{},"Idempotent by design",[132,248,249],{"v-slot:description":123},[135,250,251],{},"Every push is safe to retry. The server deduplicates by mutation ID - within a batch and across requests. No duplicate writes, no matter how many times a sync runs.",[187,253,255,260],{"icon":254},"i-lucide-layers",[132,256,257],{"v-slot:title":123},[135,258,259],{},"Layered architecture",[132,261,262],{"v-slot:description":123},[135,263,264],{},"The free packages provide the core sync foundation. Commercial add-ons extend the system with mobile automation and a finished Pro Server dashboard for inspecting production sync behaviour.",{"title":123,"searchDepth":266,"depth":267,"links":268},1,2,[],"md",{},true,"\u002F",{"title":274,"description":275},"Laravel Tether - Offline-First Sync for Laravel & NativePHP","Build offline-first Laravel and NativePHP apps with local writes, conflict resolution, and client-driven sync when connectivity returns.","index","9eFrm4CIbjjncbCL4wVoaHCLCAbZyqhynbCl7Y8D04M",1780604932713]