[{"data":1,"prerenderedAt":1957},["ShallowReactive",2],{"/docs/scripts/free-phone/installation":3,"/docs/scripts/free-phone/installation-surround":1946,"/docs/scripts/free-phone/installation-implemented-suggestions":1956},{"id":4,"title":5,"body":6,"description":1937,"extension":1938,"head":1939,"implementedSuggestions":1939,"meta":1940,"navigation":247,"path":1941,"schemaOrg":1939,"seo":1942,"sitemap":1943,"stem":1944,"__hash__":1945},"docs/1.docs/scripts/4.free-phone/1.installation.md","Installation",{"type":7,"value":8,"toc":1917},"minimark",[9,14,18,26,31,95,102,106,1037,1041,1044,1050,1053,1057,1082,1086,1092,1096,1159,1163,1257,1260,1264,1283,1316,1322,1326,1345,1375,1378,1382,1432,1442,1446,1449,1500,1507,1511,1520,1603,1614,1618,1621,1689,1695,1698,1702,1740,1744,1747,1798,1802,1805,1866,1870,1896,1913],[10,11,13],"h1",{"id":12},"free-phone","Free Phone",[15,16,17],"p",{},"Free Phone is a complete FiveM smartphone with an iPhone-inspired Sky UI, persistent devices,\nphysical or virtual SIM cards, calls, messages, social networks, media apps, server services,\ngames, and custom-app compatibility.",[19,20,23],"callout",{"color":21,"icon":22},"primary","i-lucide-package-check",[15,24,25],{},"The production frontend is included in the release. A normal server installation does not require\nNode.js, pnpm, or a frontend build.",[27,28,30],"h2",{"id":29},"requirements","Requirements",[32,33,34,47],"table",{},[35,36,37],"thead",{},[38,39,40,44],"tr",{},[41,42,43],"th",{},"Type",[41,45,46],{},"Supported options",[48,49,50,63,71,79,87],"tbody",{},[38,51,52,56],{},[53,54,55],"td",{},"Database",[53,57,58,59],{},"MySQL or MariaDB with ",[60,61,62],"code",{},"oxmysql",[38,64,65,68],{},[53,66,67],{},"Framework",[53,69,70],{},"ESX Legacy, Qbox, or QBCore",[38,72,73,76],{},[53,74,75],{},"Inventory",[53,77,78],{},"ox, QB, LJ, QS, CodeM, Core, MF, or SMX Inventory",[38,80,81,84],{},[53,82,83],{},"Calls",[53,85,86],{},"PMA Voice or SaltyChat",[38,88,89,92],{},[53,90,91],{},"Radio",[53,93,94],{},"YACA, PMA Voice, or SaltyChat",[15,96,97,98,101],{},"Start the selected framework, inventory, and voice resources before ",[60,99,100],{},"sky_phone",".",[27,103,105],{"id":104},"install-the-resource","Install the resource",[107,108,110,115,120,124,127,137,140,348,352,356,361,372,412,419,423,433,510,524,528,543,678,688,692,695,698,704,707,713,751,756,760,770,906,920,923,926,930,943,949,953,959,991,994,997,1024,1028,1031],"steps",{"level":109},"3",[111,112,114],"h3",{"id":113},"copy-free-phone","Copy Free Phone",[15,116,117,118,101],{},"Copy the release into your FiveM resources directory and keep the folder name exactly\n",[60,119,100],{},[111,121,123],{"id":122},"configure-the-server","Configure the server",[15,125,126],{},"Open these two files:",[128,129,135],"pre",{"className":130,"code":132,"language":133,"meta":134},[131],"language-text","sky_phone/config/config.lua\nsky_phone/config/media.lua\n","text","",[60,136,132],{"__ignoreMap":134},[15,138,139],{},"At minimum, verify the framework, inventory, locale, phone-item name, device mode, SIM mode, and\nvoice provider. Automatic provider detection is available for the framework and inventory.",[128,141,146],{"className":142,"code":143,"filename":144,"language":145,"meta":134,"style":134},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Config.Bridge = {\n    Framework = \"auto\",\n    Inventory = \"auto\",\n    Locale = \"en\",\n    Debug = false,\n}\n\nConfig.Phone = {\n    Item = \"phone\",\n    Unique = true,\n    Keybind = \"F1\",\n    AllowMovement = true,\n}\n\nConfig.Sim.Enabled = true\n","config/config.lua","lua",[60,147,148,168,190,206,223,236,242,249,261,278,291,308,320,325,330],{"__ignoreMap":134},[149,150,153,157,161,165],"span",{"class":151,"line":152},"line",1,[149,154,156],{"class":155},"sTEyZ","Config.",[149,158,160],{"class":159},"sBMFI","Bridge",[149,162,164],{"class":163},"sMK4o"," =",[149,166,167],{"class":155}," {\n",[149,169,171,174,177,180,184,187],{"class":151,"line":170},2,[149,172,173],{"class":155},"    Framework ",[149,175,176],{"class":163},"=",[149,178,179],{"class":163}," \"",[149,181,183],{"class":182},"sfazB","auto",[149,185,186],{"class":163},"\"",[149,188,189],{"class":155},",\n",[149,191,193,196,198,200,202,204],{"class":151,"line":192},3,[149,194,195],{"class":155},"    Inventory ",[149,197,176],{"class":163},[149,199,179],{"class":163},[149,201,183],{"class":182},[149,203,186],{"class":163},[149,205,189],{"class":155},[149,207,209,212,214,216,219,221],{"class":151,"line":208},4,[149,210,211],{"class":155},"    Locale ",[149,213,176],{"class":163},[149,215,179],{"class":163},[149,217,218],{"class":182},"en",[149,220,186],{"class":163},[149,222,189],{"class":155},[149,224,226,229,231,234],{"class":151,"line":225},5,[149,227,228],{"class":155},"    Debug ",[149,230,176],{"class":163},[149,232,233],{"class":163}," false",[149,235,189],{"class":155},[149,237,239],{"class":151,"line":238},6,[149,240,241],{"class":155},"}\n",[149,243,245],{"class":151,"line":244},7,[149,246,248],{"emptyLinePlaceholder":247},true,"\n",[149,250,252,254,257,259],{"class":151,"line":251},8,[149,253,156],{"class":155},[149,255,256],{"class":159},"Phone",[149,258,164],{"class":163},[149,260,167],{"class":155},[149,262,264,267,269,271,274,276],{"class":151,"line":263},9,[149,265,266],{"class":155},"    Item ",[149,268,176],{"class":163},[149,270,179],{"class":163},[149,272,273],{"class":182},"phone",[149,275,186],{"class":163},[149,277,189],{"class":155},[149,279,281,284,286,289],{"class":151,"line":280},10,[149,282,283],{"class":155},"    Unique ",[149,285,176],{"class":163},[149,287,288],{"class":163}," true",[149,290,189],{"class":155},[149,292,294,297,299,301,304,306],{"class":151,"line":293},11,[149,295,296],{"class":155},"    Keybind ",[149,298,176],{"class":163},[149,300,179],{"class":163},[149,302,303],{"class":182},"F1",[149,305,186],{"class":163},[149,307,189],{"class":155},[149,309,311,314,316,318],{"class":151,"line":310},12,[149,312,313],{"class":155},"    AllowMovement ",[149,315,176],{"class":163},[149,317,288],{"class":163},[149,319,189],{"class":155},[149,321,323],{"class":151,"line":322},13,[149,324,241],{"class":155},[149,326,328],{"class":151,"line":327},14,[149,329,248],{"emptyLinePlaceholder":247},[149,331,333,335,338,340,343,345],{"class":151,"line":332},15,[149,334,156],{"class":155},[149,336,337],{"class":159},"Sim",[149,339,101],{"class":155},[149,341,342],{"class":159},"Enabled",[149,344,164],{"class":163},[149,346,347],{"class":163}," true\n",[111,349,351],{"id":350},"add-inventory-items","Add inventory items",[353,354,355],"h4",{"id":355},"ox_inventory",[357,358,360],"h5",{"id":359},"update-config","Update config",[15,362,363,364,367,368,371],{},"Set unique phones to ",[60,365,366],{},"true",". Free Phone always uses the configured phone item, so it has no\nseparate ",[60,369,370],{},"Config.Item.Require"," option.",[128,373,375],{"className":142,"code":374,"filename":144,"language":145,"meta":134,"style":134},"Config.Phone.Unique = true\nConfig.Bridge.Inventory = \"ox\"\n",[60,376,377,392],{"__ignoreMap":134},[149,378,379,381,383,385,388,390],{"class":151,"line":152},[149,380,156],{"class":155},[149,382,256],{"class":159},[149,384,101],{"class":155},[149,386,387],{"class":159},"Unique",[149,389,164],{"class":163},[149,391,347],{"class":163},[149,393,394,396,398,400,402,404,406,409],{"class":151,"line":170},[149,395,156],{"class":155},[149,397,160],{"class":159},[149,399,101],{"class":155},[149,401,75],{"class":159},[149,403,164],{"class":163},[149,405,179],{"class":163},[149,407,408],{"class":182},"ox",[149,410,411],{"class":163},"\"\n",[15,413,414,415,418],{},"Setting ",[60,416,417],{},"Config.Bridge.Inventory"," is optional when automatic detection already selects\nox_inventory.",[357,420,422],{"id":421},"add-the-phone-item-to-ox_inventory","Add the phone item to ox_inventory",[15,424,425,426,428,429,432],{},"If an item named ",[60,427,273],{}," already exists, replace its complete definition. Add the following to\n",[60,430,431],{},"ox_inventory/data/items.lua",":",[128,434,436],{"className":142,"code":435,"filename":431,"language":145,"meta":134,"style":134},"[\"phone\"] = {\n    label = \"Phone\",\n    weight = 190,\n    stack = false,\n    consume = 0\n},\n",[60,437,438,456,471,484,495,505],{"__ignoreMap":134},[149,439,440,443,445,447,449,452,454],{"class":151,"line":152},[149,441,442],{"class":155},"[",[149,444,186],{"class":163},[149,446,273],{"class":182},[149,448,186],{"class":163},[149,450,451],{"class":155},"] ",[149,453,176],{"class":163},[149,455,167],{"class":155},[149,457,458,461,463,465,467,469],{"class":151,"line":170},[149,459,460],{"class":155},"    label ",[149,462,176],{"class":163},[149,464,179],{"class":163},[149,466,256],{"class":182},[149,468,186],{"class":163},[149,470,189],{"class":155},[149,472,473,476,478,482],{"class":151,"line":192},[149,474,475],{"class":155},"    weight ",[149,477,176],{"class":163},[149,479,481],{"class":480},"sbssI"," 190",[149,483,189],{"class":155},[149,485,486,489,491,493],{"class":151,"line":208},[149,487,488],{"class":155},"    stack ",[149,490,176],{"class":163},[149,492,233],{"class":163},[149,494,189],{"class":155},[149,496,497,500,502],{"class":151,"line":225},[149,498,499],{"class":155},"    consume ",[149,501,176],{"class":163},[149,503,504],{"class":480}," 0\n",[149,506,507],{"class":151,"line":238},[149,508,509],{"class":155},"},\n",[15,511,512,513,516,517,520,521,101],{},"Copy ",[60,514,515],{},"phone.png"," from ",[60,518,519],{},"sky_phone/inventory_images"," into ",[60,522,523],{},"ox_inventory/web/images",[357,525,527],{"id":526},"remove-the-npwd-integration","Remove the NPWD integration",[15,529,530,531,534,535,538,539,542],{},"Search the complete ox_inventory resource for ",[60,532,533],{},"Item('phone'",". Current releases place the handler\nin ",[60,536,537],{},"ox_inventory/modules/items/client.lua","; older releases can use\n",[60,540,541],{},"ox_inventory/items/client.lua",". Remove this complete NPWD block when it exists:",[128,544,546],{"className":142,"code":545,"filename":537,"language":145,"meta":134,"style":134},"Item('phone', function(data, slot)\n    local success, result = pcall(function()\n        return exports.npwd:isPhoneVisible()\n    end)\n\n    if success then\n        exports.npwd:setPhoneVisible(not result)\n    end\nend)\n",[60,547,548,586,606,624,631,635,646,666,671],{"__ignoreMap":134},[149,549,550,554,557,560,562,564,567,571,573,577,580,583],{"class":151,"line":152},[149,551,553],{"class":552},"s2Zo4","Item",[149,555,556],{"class":155},"(",[149,558,559],{"class":163},"'",[149,561,273],{"class":182},[149,563,559],{"class":163},[149,565,566],{"class":155},", ",[149,568,570],{"class":569},"s7zQu","function",[149,572,556],{"class":163},[149,574,576],{"class":575},"sHdIc","data",[149,578,579],{"class":163},",",[149,581,582],{"class":575}," slot",[149,584,585],{"class":163},")\n",[149,587,588,591,594,596,599,601,603],{"class":151,"line":170},[149,589,590],{"class":163},"    local",[149,592,593],{"class":155}," success, result ",[149,595,176],{"class":163},[149,597,598],{"class":552}," pcall",[149,600,556],{"class":155},[149,602,570],{"class":569},[149,604,605],{"class":163},"()\n",[149,607,608,611,614,617,619,622],{"class":151,"line":192},[149,609,610],{"class":569},"        return",[149,612,613],{"class":155}," exports.",[149,615,616],{"class":159},"npwd",[149,618,432],{"class":155},[149,620,621],{"class":552},"isPhoneVisible",[149,623,605],{"class":155},[149,625,626,629],{"class":151,"line":208},[149,627,628],{"class":569},"    end",[149,630,585],{"class":155},[149,632,633],{"class":151,"line":225},[149,634,248],{"emptyLinePlaceholder":247},[149,636,637,640,643],{"class":151,"line":238},[149,638,639],{"class":569},"    if",[149,641,642],{"class":155}," success ",[149,644,645],{"class":569},"then\n",[149,647,648,651,653,655,658,660,663],{"class":151,"line":244},[149,649,650],{"class":155},"        exports.",[149,652,616],{"class":159},[149,654,432],{"class":155},[149,656,657],{"class":552},"setPhoneVisible",[149,659,556],{"class":155},[149,661,662],{"class":163},"not",[149,664,665],{"class":155}," result)\n",[149,667,668],{"class":151,"line":251},[149,669,670],{"class":569},"    end\n",[149,672,673,676],{"class":151,"line":263},[149,674,675],{"class":569},"end",[149,677,585],{"class":155},[15,679,680,681,566,684,687],{},"Do not add a ",[60,682,683],{},"client.event",[60,685,686],{},"client.export",", LB Phone event, or LB Phone export to the item. Free\nPhone listens for the used ox_inventory slot and validates it server-side.",[357,689,691],{"id":690},"restart-your-server","Restart your server",[15,693,694],{},"Restart the complete server to load the updated item and remove the old NPWD integration.",[353,696,697],{"id":697},"qb-inventory",[15,699,700,701,703],{},"This guide is for ",[60,702,697],{}," 2.0.0. Forks may store shared items or images elsewhere.",[357,705,360],{"id":706},"update-config-1",[15,708,363,709,367,711,371],{},[60,710,366],{},[60,712,370],{},[128,714,716],{"className":142,"code":715,"filename":144,"language":145,"meta":134,"style":134},"Config.Phone.Unique = true\nConfig.Bridge.Inventory = \"qb\"\n",[60,717,718,732],{"__ignoreMap":134},[149,719,720,722,724,726,728,730],{"class":151,"line":152},[149,721,156],{"class":155},[149,723,256],{"class":159},[149,725,101],{"class":155},[149,727,387],{"class":159},[149,729,164],{"class":163},[149,731,347],{"class":163},[149,733,734,736,738,740,742,744,746,749],{"class":151,"line":170},[149,735,156],{"class":155},[149,737,160],{"class":159},[149,739,101],{"class":155},[149,741,75],{"class":159},[149,743,164],{"class":163},[149,745,179],{"class":163},[149,747,748],{"class":182},"qb",[149,750,411],{"class":163},[15,752,414,753,755],{},[60,754,417],{}," is optional when automatic detection already selects\nqb-inventory.",[357,757,759],{"id":758},"update-items-data","Update items data",[15,761,762,763,766,767,769],{},"Open ",[60,764,765],{},"qb-core/shared/items.lua",", search for ",[60,768,273],{},", and replace its complete definition with the\nfollowing:",[128,771,773],{"className":142,"code":772,"filename":765,"language":145,"meta":134,"style":134},"phone = {\n    name = 'phone',\n    label = 'Phone',\n    weight = 190,\n    type = 'item',\n    image = 'phone.png',\n    unique = true,\n    useable = true,\n    shouldClose = true,\n    description = 'Free Phone'\n},\n",[60,774,775,784,800,814,824,840,855,866,877,888,902],{"__ignoreMap":134},[149,776,777,780,782],{"class":151,"line":152},[149,778,779],{"class":155},"phone ",[149,781,176],{"class":163},[149,783,167],{"class":155},[149,785,786,789,791,794,796,798],{"class":151,"line":170},[149,787,788],{"class":155},"    name ",[149,790,176],{"class":163},[149,792,793],{"class":163}," '",[149,795,273],{"class":182},[149,797,559],{"class":163},[149,799,189],{"class":155},[149,801,802,804,806,808,810,812],{"class":151,"line":192},[149,803,460],{"class":155},[149,805,176],{"class":163},[149,807,793],{"class":163},[149,809,256],{"class":182},[149,811,559],{"class":163},[149,813,189],{"class":155},[149,815,816,818,820,822],{"class":151,"line":208},[149,817,475],{"class":155},[149,819,176],{"class":163},[149,821,481],{"class":480},[149,823,189],{"class":155},[149,825,826,829,831,833,836,838],{"class":151,"line":225},[149,827,828],{"class":155},"    type ",[149,830,176],{"class":163},[149,832,793],{"class":163},[149,834,835],{"class":182},"item",[149,837,559],{"class":163},[149,839,189],{"class":155},[149,841,842,845,847,849,851,853],{"class":151,"line":238},[149,843,844],{"class":155},"    image ",[149,846,176],{"class":163},[149,848,793],{"class":163},[149,850,515],{"class":182},[149,852,559],{"class":163},[149,854,189],{"class":155},[149,856,857,860,862,864],{"class":151,"line":244},[149,858,859],{"class":155},"    unique ",[149,861,176],{"class":163},[149,863,288],{"class":163},[149,865,189],{"class":155},[149,867,868,871,873,875],{"class":151,"line":251},[149,869,870],{"class":155},"    useable ",[149,872,176],{"class":163},[149,874,288],{"class":163},[149,876,189],{"class":155},[149,878,879,882,884,886],{"class":151,"line":263},[149,880,881],{"class":155},"    shouldClose ",[149,883,176],{"class":163},[149,885,288],{"class":163},[149,887,189],{"class":155},[149,889,890,893,895,897,899],{"class":151,"line":280},[149,891,892],{"class":155},"    description ",[149,894,176],{"class":163},[149,896,793],{"class":163},[149,898,13],{"class":182},[149,900,901],{"class":163},"'\n",[149,903,904],{"class":151,"line":293},[149,905,509],{"class":155},[15,907,512,908,516,910,520,912,915,916,919],{},[60,909,515],{},[60,911,519],{},[60,913,914],{},"qb-inventory/html/images",", unless the file\nalready exists. Free Phone registers the usable item through QBCore and stores the phone data in\nthe inventory ",[60,917,918],{},"info"," metadata.",[357,921,691],{"id":922},"restart-your-server-1",[15,924,925],{},"Restart the complete server to load the updated QB-Core item definition.",[353,927,929],{"id":928},"add-physical-sim-items","Add physical SIM items",[15,931,932,933,936,937,940,941,101],{},"When ",[60,934,935],{},"Config.Sim.Enabled = true",", also add the registered and anonymous SIM items for your\ninventory. Both SIM items must always be unique. The ready-to-copy definitions are available in\n",[60,938,939],{},"sky_phone/README.md",", and the matching images are included in ",[60,942,519],{},[15,944,932,945,948],{},[60,946,947],{},"Config.Sim.Enabled = false",", the two SIM items are not required.",[111,950,952],{"id":951},"add-the-start-order","Add the start order",[15,954,955,956,432],{},"Add Free Phone after its dependencies in ",[60,957,958],{},"server.cfg",[128,960,964],{"className":961,"code":962,"filename":958,"language":963,"meta":134,"style":134},"language-cfg shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ensure oxmysql\nensure es_extended\nensure ox_inventory\nensure pma-voice\nensure sky_phone\n","cfg",[60,965,966,971,976,981,986],{"__ignoreMap":134},[149,967,968],{"class":151,"line":152},[149,969,970],{},"ensure oxmysql\n",[149,972,973],{"class":151,"line":170},[149,974,975],{},"ensure es_extended\n",[149,977,978],{"class":151,"line":192},[149,979,980],{},"ensure ox_inventory\n",[149,982,983],{"class":151,"line":208},[149,984,985],{},"ensure pma-voice\n",[149,987,988],{"class":151,"line":225},[149,989,990],{},"ensure sky_phone\n",[15,992,993],{},"Replace the example framework, inventory, and voice resources with the providers used by your\nserver.",[15,995,996],{},"For QB-Core with qb-inventory, the corresponding order is:",[128,998,1000],{"className":961,"code":999,"filename":958,"language":963,"meta":134,"style":134},"ensure oxmysql\nensure qb-core\nensure qb-inventory\nensure pma-voice\nensure sky_phone\n",[60,1001,1002,1006,1011,1016,1020],{"__ignoreMap":134},[149,1003,1004],{"class":151,"line":152},[149,1005,970],{},[149,1007,1008],{"class":151,"line":170},[149,1009,1010],{},"ensure qb-core\n",[149,1012,1013],{"class":151,"line":192},[149,1014,1015],{},"ensure qb-inventory\n",[149,1017,1018],{"class":151,"line":208},[149,1019,985],{},[149,1021,1022],{"class":151,"line":225},[149,1023,990],{},[111,1025,1027],{"id":1026},"start-and-verify","Start and verify",[15,1029,1030],{},"Restart the server and inspect the console. Free Phone creates and upgrades its database tables\nautomatically, then registers the configured phone item. A manual SQL import is normally not\nrequired.",[15,1032,1033,1034,1036],{},"Use the phone item or press ",[60,1035,303],{}," to open the phone. The key can be rebound in FiveM's key bindings.",[27,1038,1040],{"id":1039},"manual-database-installation","Manual database installation",[15,1042,1043],{},"Hosts that require a manual schema import can run:",[128,1045,1048],{"className":1046,"code":1047,"language":133,"meta":134},[131],"sky_phone/sql/install.sql\n",[60,1049,1047],{"__ignoreMap":134},[15,1051,1052],{},"Keep runtime migrations enabled after the import because they install future schema upgrades.",[27,1054,1056],{"id":1055},"first-start-checklist","First-start checklist",[1058,1059,1060,1064,1067,1070,1073,1076,1079],"ul",{},[1061,1062,1063],"li",{},"The server console reports the selected framework and inventory without errors.",[1061,1065,1066],{},"The configured phone item opens the phone.",[1061,1068,1069],{},"Unique phones receive a persistent IMEI and do not stack.",[1061,1071,1072],{},"A physical SIM provides cellular service, or automatic numbers work when SIMs are disabled.",[1061,1074,1075],{},"Calls have audio through the configured voice provider.",[1061,1077,1078],{},"Light and dark modes render correctly.",[1061,1080,1081],{},"The server-owned pepper values have been replaced and stored safely before production use.",[27,1083,1085],{"id":1084},"production-setup-guide","Production setup guide",[15,1087,1088,1089,1091],{},"Review the following settings before opening a production server. Restart ",[60,1090,100],{}," after\nchanging Lua configuration.",[111,1093,1095],{"id":1094},"configuration-files","Configuration files",[32,1097,1098,1108],{},[35,1099,1100],{},[38,1101,1102,1105],{},[41,1103,1104],{},"File",[41,1106,1107],{},"Purpose",[48,1109,1110,1119,1129,1139,1149],{},[38,1111,1112,1116],{},[53,1113,1114],{},[60,1115,144],{},[53,1117,1118],{},"Framework, inventory, devices, SIMs, calls, apps, permissions, limits, and providers",[38,1120,1121,1126],{},[53,1122,1123],{},[60,1124,1125],{},"config/media.lua",[53,1127,1128],{},"FiveManage, GIPHY, upload limits, and Gallery import websites",[38,1130,1131,1136],{},[53,1132,1133],{},[60,1134,1135],{},"config/locales/en.lua",[53,1137,1138],{},"Canonical English locale and fallback structure",[38,1140,1141,1146],{},[53,1142,1143],{},[60,1144,1145],{},"config/locales/de.lua",[53,1147,1148],{},"German locale overrides",[38,1150,1151,1156],{},[53,1152,1153],{},[60,1154,1155],{},"config/music/",[53,1157,1158],{},"Server-owned MP3/OGG tracks and optional artwork",[111,1160,1162],{"id":1161},"framework-inventory-and-locale","Framework, inventory, and locale",[128,1164,1166],{"className":142,"code":1165,"filename":144,"language":145,"meta":134,"style":134},"Config.Bridge = {\n    Framework = \"auto\", -- auto, esx, qbox, qb\n    Inventory = \"auto\", -- auto, ox, qb, lj, qs, codem, core, mf, smx\n    Locale = \"en\",      -- en or de\n    CallbackTimeout = 15000,\n    Debug = false,\n}\n",[60,1167,1168,1178,1196,1213,1231,1243,1253],{"__ignoreMap":134},[149,1169,1170,1172,1174,1176],{"class":151,"line":152},[149,1171,156],{"class":155},[149,1173,160],{"class":159},[149,1175,164],{"class":163},[149,1177,167],{"class":155},[149,1179,1180,1182,1184,1186,1188,1190,1192],{"class":151,"line":170},[149,1181,173],{"class":155},[149,1183,176],{"class":163},[149,1185,179],{"class":163},[149,1187,183],{"class":182},[149,1189,186],{"class":163},[149,1191,566],{"class":155},[149,1193,1195],{"class":1194},"sHwdD","-- auto, esx, qbox, qb\n",[149,1197,1198,1200,1202,1204,1206,1208,1210],{"class":151,"line":192},[149,1199,195],{"class":155},[149,1201,176],{"class":163},[149,1203,179],{"class":163},[149,1205,183],{"class":182},[149,1207,186],{"class":163},[149,1209,566],{"class":155},[149,1211,1212],{"class":1194},"-- auto, ox, qb, lj, qs, codem, core, mf, smx\n",[149,1214,1215,1217,1219,1221,1223,1225,1228],{"class":151,"line":208},[149,1216,211],{"class":155},[149,1218,176],{"class":163},[149,1220,179],{"class":163},[149,1222,218],{"class":182},[149,1224,186],{"class":163},[149,1226,1227],{"class":155},",      ",[149,1229,1230],{"class":1194},"-- en or de\n",[149,1232,1233,1236,1238,1241],{"class":151,"line":225},[149,1234,1235],{"class":155},"    CallbackTimeout ",[149,1237,176],{"class":163},[149,1239,1240],{"class":480}," 15000",[149,1242,189],{"class":155},[149,1244,1245,1247,1249,1251],{"class":151,"line":238},[149,1246,228],{"class":155},[149,1248,176],{"class":163},[149,1250,233],{"class":163},[149,1252,189],{"class":155},[149,1254,1255],{"class":151,"line":244},[149,1256,241],{"class":155},[15,1258,1259],{},"Use explicit provider values when automatic detection could select the wrong resource. Debug mode\nadds diagnostic information; warnings and errors are always printed.",[111,1261,1263],{"id":1262},"choose-a-device-mode","Choose a device mode",[128,1265,1267],{"className":142,"code":1266,"language":145,"meta":134,"style":134},"Config.Phone.Unique = true\n",[60,1268,1269],{"__ignoreMap":134},[149,1270,1271,1273,1275,1277,1279,1281],{"class":151,"line":152},[149,1272,156],{"class":155},[149,1274,256],{"class":159},[149,1276,101],{"class":155},[149,1278,387],{"class":159},[149,1280,164],{"class":163},[149,1282,347],{"class":163},[32,1284,1285,1295],{},[35,1286,1287],{},[38,1288,1289,1292],{},[41,1290,1291],{},"Mode",[41,1293,1294],{},"Behavior",[48,1296,1297,1306],{},[38,1298,1299,1303],{},[53,1300,1301],{},[60,1302,366],{},[53,1304,1305],{},"Each phone item has its own IMEI. Settings, apps, account link, local data, and SIM follow that item. The item must not stack.",[38,1307,1308,1313],{},[53,1309,1310],{},[60,1311,1312],{},"false",[53,1314,1315],{},"Each framework character receives one persistent virtual device. Any configured phone item opens that device.",[15,1317,1318,1319,1321],{},"With unique phones, using an item selects that exact handset. The ",[60,1320,303],{}," key reopens the last selected\nIMEI; when no handset has been selected, the server chooses the first concrete phone slot.",[111,1323,1325],{"id":1324},"choose-a-sim-mode","Choose a SIM mode",[128,1327,1329],{"className":142,"code":1328,"language":145,"meta":134,"style":134},"Config.Sim.Enabled = true\n",[60,1330,1331],{"__ignoreMap":134},[149,1332,1333,1335,1337,1339,1341,1343],{"class":151,"line":152},[149,1334,156],{"class":155},[149,1336,337],{"class":159},[149,1338,101],{"class":155},[149,1340,342],{"class":159},[149,1342,164],{"class":163},[149,1344,347],{"class":163},[32,1346,1347,1355],{},[35,1348,1349],{},[38,1350,1351,1353],{},[41,1352,1291],{},[41,1354,1294],{},[48,1356,1357,1366],{},[38,1358,1359,1363],{},[53,1360,1361],{},[60,1362,366],{},[53,1364,1365],{},"Cellular service requires a registered or anonymous physical SIM item.",[38,1367,1368,1372],{},[53,1369,1370],{},[60,1371,1312],{},[53,1373,1374],{},"Devices without a SIM receive a persistent automatic number. Physical SIM items are not required.",[15,1376,1377],{},"Test device- or SIM-mode changes on a database copy before applying them to an existing production\nserver.",[111,1379,1381],{"id":1380},"configure-calls-and-radio","Configure calls and radio",[128,1383,1385],{"className":142,"code":1384,"language":145,"meta":134,"style":134},"Config.Calls.VoiceProvider = \"pma\" -- pma, pma-voice, saltychat, salty\nConfig.Radio.VoiceProvider = \"auto\" -- auto, yaca, pma, saltychat\n",[60,1386,1387,1411],{"__ignoreMap":134},[149,1388,1389,1391,1393,1395,1398,1400,1402,1405,1408],{"class":151,"line":152},[149,1390,156],{"class":155},[149,1392,83],{"class":159},[149,1394,101],{"class":155},[149,1396,1397],{"class":159},"VoiceProvider",[149,1399,164],{"class":163},[149,1401,179],{"class":163},[149,1403,1404],{"class":182},"pma",[149,1406,1407],{"class":163},"\" ",[149,1409,1410],{"class":1194},"-- pma, pma-voice, saltychat, salty\n",[149,1412,1413,1415,1417,1419,1421,1423,1425,1427,1429],{"class":151,"line":170},[149,1414,156],{"class":155},[149,1416,91],{"class":159},[149,1418,101],{"class":155},[149,1420,1397],{"class":159},[149,1422,164],{"class":163},[149,1424,179],{"class":163},[149,1426,183],{"class":182},[149,1428,1407],{"class":163},[149,1430,1431],{"class":1194},"-- auto, yaca, pma, saltychat\n",[15,1433,1434,1435,1438,1439,101],{},"Start the selected voice resource before Free Phone. Radio's automatic selection checks YACA,\nPMA Voice, and SaltyChat. Configure restricted frequencies in ",[60,1436,1437],{},"Config.Radio.LockedChannels"," and\ndisplay-name permissions in ",[60,1440,1441],{},"Config.Radio.DisplayName.AllowedJobs",[111,1443,1445],{"id":1444},"configure-media","Configure media",[15,1447,1448],{},"Add the FiveManage V3 Media API token to the server-loaded media file:",[128,1450,1452],{"className":142,"code":1451,"filename":1125,"language":145,"meta":134,"style":134},"Config.Media.FiveManage.ApiKey = \"your-fivemanage-v3-media-token\"\nConfig.Media.GiphyApiKey = \"your-giphy-api-key\"\n",[60,1453,1454,1480],{"__ignoreMap":134},[149,1455,1456,1458,1461,1463,1466,1468,1471,1473,1475,1478],{"class":151,"line":152},[149,1457,156],{"class":155},[149,1459,1460],{"class":159},"Media",[149,1462,101],{"class":155},[149,1464,1465],{"class":159},"FiveManage",[149,1467,101],{"class":155},[149,1469,1470],{"class":159},"ApiKey",[149,1472,164],{"class":163},[149,1474,179],{"class":163},[149,1476,1477],{"class":182},"your-fivemanage-v3-media-token",[149,1479,411],{"class":163},[149,1481,1482,1484,1486,1488,1491,1493,1495,1498],{"class":151,"line":170},[149,1483,156],{"class":155},[149,1485,1460],{"class":159},[149,1487,101],{"class":155},[149,1489,1490],{"class":159},"GiphyApiKey",[149,1492,164],{"class":163},[149,1494,179],{"class":163},[149,1496,1497],{"class":182},"your-giphy-api-key",[149,1499,411],{"class":163},[15,1501,1502,1503,1506],{},"Without a valid FiveManage token, Camera uploads, video uploads, Voice Memo uploads, and FiveManage\nGallery imports are unavailable. Limit Gallery import origins through\n",[60,1504,1505],{},"Config.Media.Import.Websites","; direct URLs are accepted only from configured HTTPS hosts.",[111,1508,1510],{"id":1509},"configure-server-owned-music","Configure server-owned music",[15,1512,1513,1514,1516,1517,432],{},"Place MP3 or OGG files anywhere below ",[60,1515,1155],{},". Optional artwork can use WEBP, PNG, JPG, or\nJPEG. Define stable tracks in ",[60,1518,1519],{},"Config.Music.Tracks",[128,1521,1523],{"className":142,"code":1522,"language":145,"meta":134,"style":134},"Config.Music.Tracks = {\n    {\n        Id = \"night-drive\",\n        Title = \"Night Drive\",\n        Artist = \"Sky Records\",\n    },\n}\n",[60,1524,1525,1541,1546,1562,1578,1594,1599],{"__ignoreMap":134},[149,1526,1527,1529,1532,1534,1537,1539],{"class":151,"line":152},[149,1528,156],{"class":155},[149,1530,1531],{"class":159},"Music",[149,1533,101],{"class":155},[149,1535,1536],{"class":159},"Tracks",[149,1538,164],{"class":163},[149,1540,167],{"class":155},[149,1542,1543],{"class":151,"line":170},[149,1544,1545],{"class":155},"    {\n",[149,1547,1548,1551,1553,1555,1558,1560],{"class":151,"line":192},[149,1549,1550],{"class":155},"        Id ",[149,1552,176],{"class":163},[149,1554,179],{"class":163},[149,1556,1557],{"class":182},"night-drive",[149,1559,186],{"class":163},[149,1561,189],{"class":155},[149,1563,1564,1567,1569,1571,1574,1576],{"class":151,"line":208},[149,1565,1566],{"class":155},"        Title ",[149,1568,176],{"class":163},[149,1570,179],{"class":163},[149,1572,1573],{"class":182},"Night Drive",[149,1575,186],{"class":163},[149,1577,189],{"class":155},[149,1579,1580,1583,1585,1587,1590,1592],{"class":151,"line":225},[149,1581,1582],{"class":155},"        Artist ",[149,1584,176],{"class":163},[149,1586,179],{"class":163},[149,1588,1589],{"class":182},"Sky Records",[149,1591,186],{"class":163},[149,1593,189],{"class":155},[149,1595,1596],{"class":151,"line":238},[149,1597,1598],{"class":155},"    },\n",[149,1600,1601],{"class":151,"line":244},[149,1602,241],{"class":155},[15,1604,1605,1606,1609,1610,1613],{},"Name files after the track ID, for example ",[60,1607,1608],{},"night-drive.ogg"," and ",[60,1611,1612],{},"night-drive.webp",". Restart Free\nPhone after adding tracks; no frontend rebuild is required.",[111,1615,1617],{"id":1616},"set-production-security-values","Set production security values",[15,1619,1620],{},"Replace all three bundled values before players create passcodes or social accounts:",[128,1622,1624],{"className":142,"code":1623,"language":145,"meta":134,"style":134},"Config.Server = {\n    PasscodePepper = \"replace-with-a-long-random-value\",\n    FlipTokPasswordPepper = \"replace-with-another-random-value\",\n    PicstagramPasswordPepper = \"replace-with-a-third-random-value\",\n}\n",[60,1625,1626,1637,1653,1669,1685],{"__ignoreMap":134},[149,1627,1628,1630,1633,1635],{"class":151,"line":152},[149,1629,156],{"class":155},[149,1631,1632],{"class":159},"Server",[149,1634,164],{"class":163},[149,1636,167],{"class":155},[149,1638,1639,1642,1644,1646,1649,1651],{"class":151,"line":170},[149,1640,1641],{"class":155},"    PasscodePepper ",[149,1643,176],{"class":163},[149,1645,179],{"class":163},[149,1647,1648],{"class":182},"replace-with-a-long-random-value",[149,1650,186],{"class":163},[149,1652,189],{"class":155},[149,1654,1655,1658,1660,1662,1665,1667],{"class":151,"line":192},[149,1656,1657],{"class":155},"    FlipTokPasswordPepper ",[149,1659,176],{"class":163},[149,1661,179],{"class":163},[149,1663,1664],{"class":182},"replace-with-another-random-value",[149,1666,186],{"class":163},[149,1668,189],{"class":155},[149,1670,1671,1674,1676,1678,1681,1683],{"class":151,"line":208},[149,1672,1673],{"class":155},"    PicstagramPasswordPepper ",[149,1675,176],{"class":163},[149,1677,179],{"class":163},[149,1679,1680],{"class":182},"replace-with-a-third-random-value",[149,1682,186],{"class":163},[149,1684,189],{"class":155},[149,1686,1687],{"class":151,"line":225},[149,1688,241],{"class":155},[1690,1691,1692],"warning",{},[15,1693,1694],{},"Keep each value private, different, and stable. Changing a pepper invalidates the passcodes or\npasswords protected by that value.",[15,1696,1697],{},"Players must treat Sky Cloud and social-app credentials as in-character roleplay credentials and\nmust never reuse real-world passwords.",[111,1699,1701],{"id":1700},"configure-optional-apps","Configure optional apps",[1058,1703,1704,1710,1716,1722,1728,1734],{},[1061,1705,1706,1707,101],{},"Select a Garage provider in ",[60,1708,1709],{},"Config.Garage.System",[1061,1711,1712,1713,101],{},"Select a Housing provider in ",[60,1714,1715],{},"Config.Housing.System",[1061,1717,1718,1719,101],{},"Define company jobs, profiles, services, phone numbers, permissions, and availability under\n",[60,1720,1721],{},"Config.Companies.Definitions",[1061,1723,1724,1725,101],{},"Configure Weazel News editorial jobs and grades under ",[60,1726,1727],{},"Config.WeazelNews.AllowedJobs",[1061,1729,1730,1731,101],{},"Add trusted external CrewLink ping resources to ",[60,1732,1733],{},"Config.CrewLink.ExternalPingResources",[1061,1735,1736,1737,101],{},"Configure custom-app origins, storage ceilings, rate limits, and adapters under\n",[60,1738,1739],{},"Config.CustomApps",[111,1741,1743],{"id":1742},"disable-development-tools","Disable development tools",[15,1745,1746],{},"Before production, review:",[128,1748,1750],{"className":142,"code":1749,"language":145,"meta":134,"style":134},"Config.Phone.DevelopmentCommand = false\nConfig.TestData.Enabled = false\nConfig.Bridge.Debug = false\n",[60,1751,1752,1768,1783],{"__ignoreMap":134},[149,1753,1754,1756,1758,1760,1763,1765],{"class":151,"line":152},[149,1755,156],{"class":155},[149,1757,256],{"class":159},[149,1759,101],{"class":155},[149,1761,1762],{"class":159},"DevelopmentCommand",[149,1764,164],{"class":163},[149,1766,1767],{"class":163}," false\n",[149,1769,1770,1772,1775,1777,1779,1781],{"class":151,"line":170},[149,1771,156],{"class":155},[149,1773,1774],{"class":159},"TestData",[149,1776,101],{"class":155},[149,1778,342],{"class":159},[149,1780,164],{"class":163},[149,1782,1767],{"class":163},[149,1784,1785,1787,1789,1791,1794,1796],{"class":151,"line":192},[149,1786,156],{"class":155},[149,1788,160],{"class":159},[149,1790,101],{"class":155},[149,1792,1793],{"class":159},"Debug",[149,1795,164],{"class":163},[149,1797,1767],{"class":163},[27,1799,1801],{"id":1800},"migrate-from-lb-phone","Migrate from LB Phone",[15,1803,1804],{},"Free Phone detects supported LB Phone tables but never starts an import automatically.",[107,1806,1807,1811,1814,1818,1821,1839,1843,1855],{"level":109},[111,1808,1810],{"id":1809},"back-up-the-database","Back up the database",[15,1812,1813],{},"Create a complete backup before previewing or importing data.",[111,1815,1817],{"id":1816},"preview-the-migration","Preview the migration",[15,1819,1820],{},"Run from the server console:",[128,1822,1826],{"className":1823,"code":1824,"language":1825,"meta":134,"style":134},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","skyphone:migrate lb-phone dry\n","bash",[60,1827,1828],{"__ignoreMap":134},[149,1829,1830,1833,1836],{"class":151,"line":152},[149,1831,1832],{"class":159},"skyphone:migrate",[149,1834,1835],{"class":182}," lb-phone",[149,1837,1838],{"class":182}," dry\n",[111,1840,1842],{"id":1841},"import-and-verify","Import and verify",[128,1844,1846],{"className":1823,"code":1845,"language":1825,"meta":134,"style":134},"skyphone:migrate lb-phone\n",[60,1847,1848],{"__ignoreMap":134},[149,1849,1850,1852],{"class":151,"line":152},[149,1851,1832],{"class":159},[149,1853,1854],{"class":182}," lb-phone\n",[15,1856,1857,1858,1861,1862,1865],{},"Restart the resource and verify accounts, devices, calls, messages, media, and social apps. Use\n",[60,1859,1860],{},"force"," for an idempotent retry or ",[60,1863,1864],{},"remove"," to remove data created by the migration.",[27,1867,1869],{"id":1868},"update-safely","Update safely",[1871,1872,1873,1876,1884,1887,1890,1893],"ol",{},[1061,1874,1875],{},"Back up the database.",[1061,1877,1878,1879,566,1881,1883],{},"Back up ",[60,1880,144],{},[60,1882,1125],{},", and custom music or media.",[1061,1885,1886],{},"Preserve all three production pepper values.",[1061,1888,1889],{},"Replace the resource files.",[1061,1891,1892],{},"Merge new configuration options instead of overwriting the new config blindly.",[1061,1894,1895],{},"Restart Free Phone and review all warnings and errors.",[1897,1898,1899],"tip",{},[15,1900,1901,1902,1907,1908,1912],{},"Continue with the ",[1903,1904,1906],"a",{"href":1905},"/docs/scripts/free-phone/exports","Exports"," and\n",[1903,1909,1911],{"href":1910},"/docs/scripts/free-phone/events","Events"," pages when integrating external resources.",[1914,1915,1916],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":134,"searchDepth":152,"depth":170,"links":1918},[1919,1920,1921,1922,1923,1935,1936],{"id":29,"depth":170,"text":30},{"id":104,"depth":170,"text":105},{"id":1039,"depth":170,"text":1040},{"id":1055,"depth":170,"text":1056},{"id":1084,"depth":170,"text":1085,"children":1924},[1925,1926,1927,1928,1929,1930,1931,1932,1933,1934],{"id":1094,"depth":192,"text":1095},{"id":1161,"depth":192,"text":1162},{"id":1262,"depth":192,"text":1263},{"id":1324,"depth":192,"text":1325},{"id":1380,"depth":192,"text":1381},{"id":1444,"depth":192,"text":1445},{"id":1509,"depth":192,"text":1510},{"id":1616,"depth":192,"text":1617},{"id":1700,"depth":192,"text":1701},{"id":1742,"depth":192,"text":1743},{"id":1800,"depth":170,"text":1801},{"id":1868,"depth":170,"text":1869},"Install Free Phone on a FiveM server, configure its required dependencies, and verify the first startup.","md",null,{},"/docs/scripts/free-phone/installation",{"title":5,"description":1937},{"loc":1941},"1.docs/scripts/4.free-phone/1.installation","nGHg5Uz-zpsS0AHonX4IO1woWnJpjPrb4F_wToua8zk",[1947,1951],{"title":1948,"path":1949,"stem":1950,"description":134,"children":-1},"Custom Rewards","/docs/scripts/dailyrewards/custom-rewards","1.docs/scripts/3.dailyrewards/2.custom-rewards",{"title":1952,"path":1953,"stem":1954,"description":1955,"children":-1},"Features","/docs/scripts/free-phone/features","1.docs/scripts/4.free-phone/2.features","Explore the device system, built-in apps, media, social features, integrations, and developer platform included with Free Phone.",[],1787244844807]