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