[{"data":1,"prerenderedAt":733},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fv1\u002Fserver\u002Fconfiguration":121,"\u002Fdocs\u002Fv1\u002Fserver\u002Fconfiguration-surround":728},[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":41,"body":123,"description":720,"extension":721,"links":722,"meta":723,"navigation":724,"path":56,"seo":725,"stem":57,"__hash__":727},"docs\u002Fdocs\u002Fv1\u002F3.server\u002F2.configuration.md",{"type":124,"value":125,"toc":707},"minimark",[126,130,133,162,169,172,178,217,228,230,235,273,284,286,291,335,346,348,353,390,400,402,407,438,457,459,464,501,510,512,517,545,548,582,584,589,620,636,638,643,677,703],[127,128,129],"p",{},"Configure how your Laravel sync server registers routes, protects push and pull endpoints, resolves sync identity keys, stores applied mutations, and handles duplicate mutation IDs.",[127,131,132],{},"Publish the config file with:",[134,135,140],"pre",{"className":136,"code":137,"language":138,"meta":139,"style":139},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","php artisan vendor:publish --tag=tether-server-config\n","bash","",[141,142,143],"code",{"__ignoreMap":139},[144,145,148,152,156,159],"span",{"class":146,"line":147},"line",1,[144,149,151],{"class":150},"sBMFI","php",[144,153,155],{"class":154},"sfazB"," artisan",[144,157,158],{"class":154}," vendor:publish",[144,160,161],{"class":154}," --tag=tether-server-config\n",[127,163,164,165,168],{},"This creates ",[141,166,167],{},"config\u002Ftether-server.php"," in your server application.",[170,171],"hr",{},[173,174,176],"h3",{"id":175},"connection",[141,177,175],{},[134,179,182],{"className":180,"code":181,"language":151,"meta":139,"style":139},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","'connection' => env('TETHER_SERVER_DB_CONNECTION', null),\n",[141,183,184],{"__ignoreMap":139},[144,185,186,190,192,194,197,201,204,206,209,211,214],{"class":146,"line":147},[144,187,189],{"class":188},"sMK4o","'",[144,191,175],{"class":154},[144,193,189],{"class":188},[144,195,196],{"class":188}," =>",[144,198,200],{"class":199},"s2Zo4"," env",[144,202,203],{"class":188},"(",[144,205,189],{"class":188},[144,207,208],{"class":154},"TETHER_SERVER_DB_CONNECTION",[144,210,189],{"class":188},[144,212,213],{"class":188},",",[144,215,216],{"class":188}," null),\n",[127,218,219,220,223,224,227],{},"The database connection used for the ",[141,221,222],{},"tether_server_mutations"," table. ",[141,225,226],{},"null"," uses the application default. Useful in multi-database setups.",[170,229],{},[173,231,233],{"id":232},"table",[141,234,232],{},[134,236,238],{"className":180,"code":237,"language":151,"meta":139,"style":139},"'table' => env('TETHER_SERVER_TABLE', 'tether_server_mutations'),\n",[141,239,240],{"__ignoreMap":139},[144,241,242,244,246,248,250,252,254,256,259,261,263,266,268,270],{"class":146,"line":147},[144,243,189],{"class":188},[144,245,232],{"class":154},[144,247,189],{"class":188},[144,249,196],{"class":188},[144,251,200],{"class":199},[144,253,203],{"class":188},[144,255,189],{"class":188},[144,257,258],{"class":154},"TETHER_SERVER_TABLE",[144,260,189],{"class":188},[144,262,213],{"class":188},[144,264,265],{"class":188}," '",[144,267,222],{"class":154},[144,269,189],{"class":188},[144,271,272],{"class":188},"),\n",[127,274,275,276,279,280,283],{},"The table name for the server-side applied mutation log. The pull cursor sent to clients is not based on this table; it is an integer microsecond timestamp derived from syncable model ",[141,277,278],{},"updated_at"," \u002F ",[141,281,282],{},"deleted_at"," values.",[170,285],{},[173,287,289],{"id":288},"model_namespace",[141,290,288],{},[134,292,294],{"className":180,"code":293,"language":151,"meta":139,"style":139},"'model_namespace' => env('TETHER_MODEL_NAMESPACE', 'App\\\\Models'),\n",[141,295,296],{"__ignoreMap":139},[144,297,298,300,302,304,306,308,310,312,315,317,319,321,324,328,331,333],{"class":146,"line":147},[144,299,189],{"class":188},[144,301,288],{"class":154},[144,303,189],{"class":188},[144,305,196],{"class":188},[144,307,200],{"class":199},[144,309,203],{"class":188},[144,311,189],{"class":188},[144,313,314],{"class":154},"TETHER_MODEL_NAMESPACE",[144,316,189],{"class":188},[144,318,213],{"class":188},[144,320,265],{"class":188},[144,322,323],{"class":154},"App",[144,325,327],{"class":326},"sTEyZ","\\\\",[144,329,330],{"class":154},"Models",[144,332,189],{"class":188},[144,334,272],{"class":188},[127,336,337,338,341,342,345],{},"The namespace used when resolving model classes from incoming push mutation payloads. A mutation with ",[141,339,340],{},"model: \"Task\""," resolves to ",[141,343,344],{},"App\\Models\\Task",".",[170,347],{},[173,349,351],{"id":350},"sync_key",[141,352,350],{},[134,354,356],{"className":180,"code":355,"language":151,"meta":139,"style":139},"'sync_key' => env('TETHER_SYNC_KEY', 'tether_id'),\n",[141,357,358],{"__ignoreMap":139},[144,359,360,362,364,366,368,370,372,374,377,379,381,383,386,388],{"class":146,"line":147},[144,361,189],{"class":188},[144,363,350],{"class":154},[144,365,189],{"class":188},[144,367,196],{"class":188},[144,369,200],{"class":199},[144,371,203],{"class":188},[144,373,189],{"class":188},[144,375,376],{"class":154},"TETHER_SYNC_KEY",[144,378,189],{"class":188},[144,380,213],{"class":188},[144,382,265],{"class":188},[144,384,385],{"class":154},"tether_id",[144,387,189],{"class":188},[144,389,272],{"class":188},[127,391,392,393,395,396,399],{},"The column name that holds the client-generated ULID on server-side models. Must match the ",[141,394,350],{}," in ",[141,397,398],{},"config\u002Ftether-client.php"," and the column in your migrations.",[170,401],{},[173,403,405],{"id":404},"register_routes",[141,406,404],{},[134,408,410],{"className":180,"code":409,"language":151,"meta":139,"style":139},"'register_routes' => env('TETHER_REGISTER_ROUTES', true),\n",[141,411,412],{"__ignoreMap":139},[144,413,414,416,418,420,422,424,426,428,431,433,435],{"class":146,"line":147},[144,415,189],{"class":188},[144,417,404],{"class":154},[144,419,189],{"class":188},[144,421,196],{"class":188},[144,423,200],{"class":199},[144,425,203],{"class":188},[144,427,189],{"class":188},[144,429,430],{"class":154},"TETHER_REGISTER_ROUTES",[144,432,189],{"class":188},[144,434,213],{"class":188},[144,436,437],{"class":188}," true),\n",[127,439,440,441,444,445,448,449,452,453,456],{},"When ",[141,442,443],{},"true",", the package automatically registers ",[141,446,447],{},"POST \u002Ftether\u002Fpush"," and ",[141,450,451],{},"POST \u002Ftether\u002Fpull",". Set to ",[141,454,455],{},"false"," to register routes manually - useful for embedding them in an API version prefix or using a custom controller.",[170,458],{},[173,460,462],{"id":461},"route_prefix",[141,463,461],{},[134,465,467],{"className":180,"code":466,"language":151,"meta":139,"style":139},"'route_prefix' => env('TETHER_ROUTE_PREFIX', 'tether'),\n",[141,468,469],{"__ignoreMap":139},[144,470,471,473,475,477,479,481,483,485,488,490,492,494,497,499],{"class":146,"line":147},[144,472,189],{"class":188},[144,474,461],{"class":154},[144,476,189],{"class":188},[144,478,196],{"class":188},[144,480,200],{"class":199},[144,482,203],{"class":188},[144,484,189],{"class":188},[144,486,487],{"class":154},"TETHER_ROUTE_PREFIX",[144,489,189],{"class":188},[144,491,213],{"class":188},[144,493,265],{"class":188},[144,495,496],{"class":154},"tether",[144,498,189],{"class":188},[144,500,272],{"class":188},[127,502,503,504,448,507,345],{},"The URL prefix for all Tether sync endpoints. With the default value, routes are registered at ",[141,505,506],{},"\u002Ftether\u002Fpush",[141,508,509],{},"\u002Ftether\u002Fpull",[170,511],{},[173,513,515],{"id":514},"middleware",[141,516,514],{},[134,518,520],{"className":180,"code":519,"language":151,"meta":139,"style":139},"'middleware' => ['api'],\n",[141,521,522],{"__ignoreMap":139},[144,523,524,526,528,530,532,535,537,540,542],{"class":146,"line":147},[144,525,189],{"class":188},[144,527,514],{"class":154},[144,529,189],{"class":188},[144,531,196],{"class":188},[144,533,534],{"class":188}," [",[144,536,189],{"class":188},[144,538,539],{"class":154},"api",[144,541,189],{"class":188},[144,543,544],{"class":188},"],\n",[127,546,547],{},"Middleware applied to the sync endpoints. Add authentication middleware that fits your app:",[134,549,551],{"className":180,"code":550,"language":151,"meta":139,"style":139},"'middleware' => ['api', 'auth:sanctum'],\n",[141,552,553],{"__ignoreMap":139},[144,554,555,557,559,561,563,565,567,569,571,573,575,578,580],{"class":146,"line":147},[144,556,189],{"class":188},[144,558,514],{"class":154},[144,560,189],{"class":188},[144,562,196],{"class":188},[144,564,534],{"class":188},[144,566,189],{"class":188},[144,568,539],{"class":154},[144,570,189],{"class":188},[144,572,213],{"class":188},[144,574,265],{"class":188},[144,576,577],{"class":154},"auth:sanctum",[144,579,189],{"class":188},[144,581,544],{"class":188},[170,583],{},[173,585,587],{"id":586},"strict_duplicates",[141,588,586],{},[134,590,592],{"className":180,"code":591,"language":151,"meta":139,"style":139},"'strict_duplicates' => env('TETHER_STRICT_DUPLICATES', false),\n",[141,593,594],{"__ignoreMap":139},[144,595,596,598,600,602,604,606,608,610,613,615,617],{"class":146,"line":147},[144,597,189],{"class":188},[144,599,586],{"class":154},[144,601,189],{"class":188},[144,603,196],{"class":188},[144,605,200],{"class":199},[144,607,203],{"class":188},[144,609,189],{"class":188},[144,611,612],{"class":154},"TETHER_STRICT_DUPLICATES",[144,614,189],{"class":188},[144,616,213],{"class":188},[144,618,619],{"class":188}," false),\n",[127,621,440,622,624,625,628,629,631,632,635],{},[141,623,455],{}," (default), previously-applied mutations are returned as ",[141,626,627],{},"applied"," without re-applying (idempotent). When ",[141,630,443],{},", they are returned as ",[141,633,634],{},"rejected"," - useful for debugging to detect unexpected retries.",[170,637],{},[173,639,641],{"id":640},"debug_level",[141,642,640],{},[134,644,646],{"className":180,"code":645,"language":151,"meta":139,"style":139},"'debug_level' => env('TETHER_DEBUG_LEVEL', 0),\n",[141,647,648],{"__ignoreMap":139},[144,649,650,652,654,656,658,660,662,664,667,669,671,675],{"class":146,"line":147},[144,651,189],{"class":188},[144,653,640],{"class":154},[144,655,189],{"class":188},[144,657,196],{"class":188},[144,659,200],{"class":199},[144,661,203],{"class":188},[144,663,189],{"class":188},[144,665,666],{"class":154},"TETHER_DEBUG_LEVEL",[144,668,189],{"class":188},[144,670,213],{"class":188},[144,672,674],{"class":673},"sbssI"," 0",[144,676,272],{"class":188},[127,678,679,680,683,684,687,688,691,692,695,696,699,700,345],{},"Controls package debug logging (",[141,681,682],{},"Log::debug()","). ",[141,685,686],{},"0"," disables debug logging, ",[141,689,690],{},"1"," logs lifecycle summaries, ",[141,693,694],{},"2"," logs decisions and outcomes, and ",[141,697,698],{},"3"," logs verbose diagnostics. All package debug messages are prefixed with ",[141,701,702],{},"[TETHER]",[704,705,706],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":139,"searchDepth":147,"depth":708,"links":709},2,[710,712,713,714,715,716,717,718,719],{"id":175,"depth":711,"text":175},3,{"id":232,"depth":711,"text":232},{"id":288,"depth":711,"text":288},{"id":350,"depth":711,"text":350},{"id":404,"depth":711,"text":404},{"id":461,"depth":711,"text":461},{"id":514,"depth":711,"text":514},{"id":586,"depth":711,"text":586},{"id":640,"depth":711,"text":640},"Configure tether\u002Fserver routes, middleware, sync keys, registered models, mutation storage, duplicate handling, and Laravel sync endpoint behaviour.","md",null,{},true,{"title":726,"description":720},"tether\u002Fserver Configuration for Laravel Sync APIs","e1KvzmCwYH4yfgxbmF59FNMfc95n77HiaOSGiZncx4o",[729,731],{"title":52,"path":53,"stem":54,"description":730,"children":-1},"Install tether\u002Fserver, register Syncable Eloquent models, expose push and pull endpoints, and reconcile offline client mutations on your Laravel server.",{"title":66,"path":67,"stem":68,"description":732,"children":-1},"See how tether\u002Fnativephp-client adds automatic offline sync triggers for NativePHP mobile apps on app resume, network restore, and background tasks.",1780481014145]