<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RPScripts</title>
    <description>The latest articles on DEV Community by RPScripts (@rpscripts).</description>
    <link>https://dev.to/rpscripts</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4200793%2Fee056be4-b1a0-43d0-b65a-74fe98642115.png</url>
      <title>DEV Community: RPScripts</title>
      <link>https://dev.to/rpscripts</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rpscripts"/>
    <language>en</language>
    <item>
      <title>FiveM Script Database Migrations: What to Check Before You Install</title>
      <dc:creator>RPScripts</dc:creator>
      <pubDate>Mon, 02 Nov 2026 13:53:11 +0000</pubDate>
      <link>https://dev.to/rpscripts/fivem-script-database-migrations-what-to-check-before-you-install-31o5</link>
      <guid>https://dev.to/rpscripts/fivem-script-database-migrations-what-to-check-before-you-install-31o5</guid>
      <description>&lt;p&gt;Most FiveM script problems that show up a week after the install are not script bugs. They are database problems, and they are the reason a resource that looked perfect in the demo behaves strangely on your server.&lt;/p&gt;

&lt;p&gt;Every serious FiveM script stores something: a player's job, a vehicle's fuel level, a business balance, a phone contact list. The question is what it does to your database before it does that, and whether it can undo it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things a script can do to your database
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Create tables.&lt;/strong&gt; A lot of scripts create their own tables on first start, usually with a name prefix such as &lt;code&gt;scriptname_&lt;/code&gt; or &lt;code&gt;esx_&lt;/code&gt;. This is convenient and it is also the reason two scripts can fight: if two packages use the same table name with different columns, the second install silently wins and the first script starts throwing "unknown column" errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Require you to import SQL.&lt;/strong&gt; Older and more professional scripts ship a &lt;code&gt;.sql&lt;/code&gt; file and expect you to import it. Read the file before importing. The important lines are the &lt;code&gt;CREATE TABLE&lt;/code&gt; and &lt;code&gt;ALTER TABLE&lt;/code&gt; statements, because they tell you exactly what the script expects to exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Migrate existing rows.&lt;/strong&gt; This is the one that hurts. A script that updates its schema on start might run an &lt;code&gt;UPDATE&lt;/code&gt; across your player table, for example when a job was renamed from &lt;code&gt;police&lt;/code&gt; to &lt;code&gt;lspd&lt;/code&gt;. On a fresh demo server that is invisible. On your live server it can rewrite data for hundreds of players while you are reading this sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check that takes two minutes
&lt;/h2&gt;

&lt;p&gt;Before you install anything, ask three questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the script create tables, import SQL, or modify existing ones?&lt;/li&gt;
&lt;li&gt;Does it use a table name that another script on your server might also use?&lt;/li&gt;
&lt;li&gt;Does it need a database user with write access to tables it does not own?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer to the third question is yes, run it on a separate database first. A dedicated test database is the cheapest insurance in FiveM: export your current one, import it into a second schema, point the test server at the copy and install there. If the script breaks the copy, it breaks nothing that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the error instead of guessing
&lt;/h2&gt;

&lt;p&gt;When a script fails after the install, the console usually names the problem directly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Unknown column 'x' in 'field list'&lt;/code&gt; — the table exists but the schema is older than the script expects. Import the newer SQL file or update the column.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Table 'x' doesn't exist&lt;/code&gt; — the script expected you to import SQL and did not find it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Duplicate entry&lt;/code&gt; for a unique key — the script is trying to create a row that already exists, often because it ran twice during a failed start.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The static checker in the &lt;a href="https://rpscripts.net/tools/fivem-script-tester/" rel="noopener noreferrer"&gt;FiveM script tester&lt;/a&gt; catches the file-level problems before install, and the resource catalogue is separated per framework in &lt;a href="https://rpscripts.net/scripts/" rel="noopener noreferrer"&gt;all scripts&lt;/a&gt;, so you can compare what a package expects against what your server already runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short checklist before you press install
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read the SQL, if there is any, and note every table name.&lt;/li&gt;
&lt;li&gt;Check those table names against the scripts you already run.&lt;/li&gt;
&lt;li&gt;Test the install on a copy of the database, not on the live one.&lt;/li&gt;
&lt;li&gt;Keep the export from before the install. Restoring a schema takes seconds; rebuilding lost data does not.&lt;/li&gt;
&lt;li&gt;Pair the install with a correct load order in your &lt;a href="https://rpscripts.net/tools/server-cfg-generator/" rel="noopener noreferrer"&gt;server.cfg&lt;/a&gt;, because a script that starts before its framework will fail on the first query it sends.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is complicated. It is just easier to do before the install than after the first support ticket.&lt;/p&gt;

</description>
      <category>gta</category>
      <category>lua</category>
      <category>roleplay</category>
      <category>esx</category>
    </item>
    <item>
      <title>Loading screens in FiveM: why the first player to join sees a black screen</title>
      <dc:creator>RPScripts</dc:creator>
      <pubDate>Sun, 01 Nov 2026 17:23:12 +0000</pubDate>
      <link>https://dev.to/rpscripts/loading-screens-in-fivem-why-the-first-player-to-join-sees-a-black-screen-1j6e</link>
      <guid>https://dev.to/rpscripts/loading-screens-in-fivem-why-the-first-player-to-join-sees-a-black-screen-1j6e</guid>
      <description>&lt;p&gt;The loading screen is the first thing every new player sees, and it is also the first thing that breaks on a server that was working fine yesterday.&lt;/p&gt;

&lt;p&gt;Most "my loading screen is stuck" tickets have the same shape: the resource starts, the player connects, and the screen stays black — or the player lands in the world without ever seeing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the loading screen actually is
&lt;/h2&gt;

&lt;p&gt;A loading screen is a NUI resource. The client loads an HTML page in an overlay while the server assembles the session: character data, inventory, framework state, spawn point. The screen you design is the visible layer over that wait.&lt;/p&gt;

&lt;p&gt;Two separate things can therefore be wrong, and they look identical from the outside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;design&lt;/strong&gt; never renders. The NUI URL is wrong, the file name does not match, or the resource is not started before the client needs it.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;design renders fine&lt;/strong&gt;, but the session never completes, so the screen stays up forever.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second one is not a loading-screen bug at all. It is a broken database query, a missing framework resource or a failed event, and the loading screen is only where you notice it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three checks that resolve most cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is the resource started?&lt;/strong&gt; &lt;code&gt;ensure&lt;/code&gt; the loading screen in your server.cfg, before the resources that depend on it. A screen that is started after the join flow has already begun will not be shown for that player.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the URL match the file?&lt;/strong&gt; The &lt;code&gt;ui_page&lt;/code&gt; in the manifest points at a path inside the resource. A file that was renamed to &lt;code&gt;index.html&lt;/code&gt; in a ZIP that unpacks to &lt;code&gt;Index.html&lt;/code&gt; is a broken URL on a case-sensitive host, and it works perfectly on the author's Windows machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the client actually send the event?&lt;/strong&gt; The standard flow is: the client asks the server for session data, the server answers with the player identifiers, and only then the client hides the screen. If the server never answers, the screen stays up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check when it hangs
&lt;/h2&gt;

&lt;p&gt;Open the browser console on the client with F8 developer mode enabled. You will see the NUI messages the resource sends. If you see the initial message but never the "hide" message, the screen is fine and the session is not.&lt;/p&gt;

&lt;p&gt;From the server side, the first red line in the console is usually the real answer: a missing dependency, an undefined table in a shared script, a query against a table that does not exist yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build it where you can see it
&lt;/h2&gt;

&lt;p&gt;Designing a loading screen in a text editor means guessing how it looks at 1920×1080, at 2560×1440 and on an ultrawide. The &lt;a href="https://rpscripts.net/tools/loading-screen-builder/" rel="noopener noreferrer"&gt;RPScripts Loading Screen Builder&lt;/a&gt; lets you lay out the design in the browser, preview it against the messages FiveM actually sends while a player joins, and export a ZIP you can drop straight into a resource. The preview runs the exported files at the real resolution, and the "Simulate FiveM loading" mode sends the same messages the game sends, so the progress bar you see is the progress bar players will see.&lt;/p&gt;

&lt;p&gt;You can also export the design as JSON and import it later, which is the difference between iterating on a design and re-implementing it every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on the "first join" case
&lt;/h2&gt;

&lt;p&gt;The first player to join after a server restart often sees a longer wait, because the server is loading resources and the database is cold. If that is the only case where the screen is slow, the screen is not broken — the server is. Progress reporting helps, but the fix is on the server side.&lt;/p&gt;

&lt;p&gt;Disclosure: this post is from RPScripts. The builder linked above is ours and free to use in the browser.&lt;/p&gt;

</description>
      <category>lua</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Is that FiveM script safe? What a backdoor scanner can and cannot tell you</title>
      <dc:creator>RPScripts</dc:creator>
      <pubDate>Sun, 01 Nov 2026 17:22:39 +0000</pubDate>
      <link>https://dev.to/rpscripts/is-that-fivem-script-safe-what-a-backdoor-scanner-can-and-cannot-tell-you-3gbb</link>
      <guid>https://dev.to/rpscripts/is-that-fivem-script-safe-what-a-backdoor-scanner-can-and-cannot-tell-you-3gbb</guid>
      <description>&lt;p&gt;Most "this script is a backdoor" claims you find in a Discord chat are unverified. The useful question is not whether a script is called a backdoor, but what its code actually does before you install it on a server that holds real money and real player data.&lt;/p&gt;

&lt;p&gt;A static scanner can answer part of that. It cannot answer all of it, and knowing where the line is makes the result usable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a static scan can tell you
&lt;/h2&gt;

&lt;p&gt;A scanner reads the files in a resource and looks for code that has no business being in a paid script. The patterns that matter on FiveM are specific:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code hidden behind whitespace.&lt;/strong&gt; A loader appended to an otherwise normal line, padded with spaces so that it sits far to the right of the visible editor area. It is invisible in a screenshot of the file and easy to miss in review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code downloaded and executed.&lt;/strong&gt; &lt;code&gt;load()&lt;/code&gt; or &lt;code&gt;loadstring()&lt;/code&gt; applied to the body of an HTTP response. Whoever controls that web server controls your server, and the control changes the moment the domain expires or is sold.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runtime-decoded payloads.&lt;/strong&gt; &lt;code&gt;string.char&lt;/code&gt; lists, escaped byte sequences, base64 or hex blobs that only turn into readable code at runtime. A reviewer cannot check what they cannot decode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reads of server secrets.&lt;/strong&gt; &lt;code&gt;sv_licenseKey&lt;/code&gt;, &lt;code&gt;rcon_password&lt;/code&gt;, &lt;code&gt;sv_tebexSecret&lt;/code&gt;, or a database connection string, inside a file that also sends HTTP requests. That combination is what a key-stealing loader looks like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requests to raw IP addresses.&lt;/strong&gt; A script that only talks to a domain can be reviewed. A script that talks to &lt;code&gt;http://185.220.101.7/...&lt;/code&gt; cannot be attributed to anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writes outside its own folder.&lt;/strong&gt; &lt;code&gt;SaveResourceFile&lt;/code&gt; into another resource, &lt;code&gt;io.open&lt;/code&gt; in write mode, &lt;code&gt;os.execute&lt;/code&gt;, &lt;code&gt;io.popen&lt;/code&gt;. A resource that rewrites a different resource is doing something no legitimate script needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Executables in the archive.&lt;/strong&gt; A &lt;code&gt;.exe&lt;/code&gt;, &lt;code&gt;.bat&lt;/code&gt; or &lt;code&gt;.ps1&lt;/code&gt; inside a FiveM resource has no runtime purpose. So do archive entries that would extract outside their folder.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://rpscripts.net/tools/fivem-backdoor-scanner/" rel="noopener noreferrer"&gt;RPScripts FiveM Backdoor Scanner&lt;/a&gt; checks exactly this list. Drop in a resource ZIP, a category folder or your whole resources folder — it handles Lua files with every check and JS files with the hidden-code check, up to 300 MB. The scan runs in the browser and your files are not uploaded.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it cannot tell you
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Intent.&lt;/strong&gt; A call to &lt;code&gt;PerformHttpRequest&lt;/code&gt; might be a licence check, a heartbeat or an exfiltration. The scanner reports the call; it does not read minds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a remote endpoint returns.&lt;/strong&gt; The dangerous part of a downloader is usually the payload, and the payload arrives after the scan. The scanner can show you that your server would execute whatever that URL returns. It cannot tell you what is served tomorrow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runtime behaviour.&lt;/strong&gt; Static analysis reads code, not execution. A script that behaves differently depending on a date, a license value or the server name passes every static check and is still a backdoor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your server's own files.&lt;/strong&gt; The scan covers the files you hand it. A resource that was already installed, modified in place, or replaced by a later update is outside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow that holds up
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scan before you install, not after.&lt;/strong&gt; The whole point is that the decision to install has not been made yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan the dependency chain too.&lt;/strong&gt; A clean resource that depends on a dirty one is still dirty. The scanner accepts a whole resources folder for exactly this reason.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a copy of what you installed.&lt;/strong&gt; If a file changes later, you want to know which file and when.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the console and the outbound traffic on a staging server first.&lt;/strong&gt; A script that phones home at boot is visible in the first minute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not store your Tebex or licence keys in a resource that can reach the network.&lt;/strong&gt; Even for a legitimate script, this is a smaller blast radius.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Disclosure: this post is from RPScripts. The scanner linked above is ours and free to use in the browser. The findings are yours to verify — a scanner is evidence, not a verdict.&lt;/p&gt;

</description>
      <category>lua</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>FiveM load order: why a script can start and still find nothing</title>
      <dc:creator>RPScripts</dc:creator>
      <pubDate>Sun, 01 Nov 2026 16:48:28 +0000</pubDate>
      <link>https://dev.to/rpscripts/fivem-load-order-why-a-script-can-start-and-still-find-nothing-l67</link>
      <guid>https://dev.to/rpscripts/fivem-load-order-why-a-script-can-start-and-still-find-nothing-l67</guid>
      <description>&lt;h2&gt;
  
  
  The symptom
&lt;/h2&gt;

&lt;p&gt;The resource starts. The console shows it as started. Then nothing happens: the menu never opens, the keybind does nothing, the chat command answers with silence.&lt;/p&gt;

&lt;p&gt;This is usually not a broken script. It is a script that asked for something that was not there yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;start&lt;/code&gt; and &lt;code&gt;ensure&lt;/code&gt; are not the same
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;start qb-core
ensure my_housing_script
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;start&lt;/code&gt; starts a resource once, and errors when the resource is not found. &lt;code&gt;ensure&lt;/code&gt; starts a stopped resource, or restarts one that is already running.&lt;/p&gt;

&lt;p&gt;Both lines run in the order they appear, but only within the configuration block they live in. If a framework is started in one &lt;code&gt;exec&lt;/code&gt; file and your scripts in another, the order between the two files is the order of the &lt;code&gt;exec&lt;/code&gt; lines — and it is easy to get wrong without noticing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dependency list protects only what it lists
&lt;/h2&gt;

&lt;p&gt;A resource with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'qb-core'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;waits for &lt;code&gt;qb-core&lt;/code&gt; before it starts. That is a real guarantee, and it is the best fix for load-order bugs.&lt;/p&gt;

&lt;p&gt;It is not a general guarantee. If your code calls an export of a resource you did not list, nothing waits for anything. The call returns &lt;code&gt;nil&lt;/code&gt;, and in Lua that &lt;code&gt;nil&lt;/code&gt; usually travels further than you expect: it becomes a missing field, then a failed &lt;code&gt;if&lt;/code&gt;, then a UI that silently never renders.&lt;/p&gt;

&lt;p&gt;List every resource whose API you call: &lt;code&gt;ox_lib&lt;/code&gt;, your voice library, your map library, the notification library. If you call it, it is a dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual order
&lt;/h2&gt;

&lt;p&gt;A configuration that survives contact with a real server looks roughly like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Framework and database driver.&lt;/li&gt;
&lt;li&gt;Shared libraries.&lt;/li&gt;
&lt;li&gt;Resources that only extend the framework — jobs, housing, inventory add-ons.&lt;/li&gt;
&lt;li&gt;Your own gameplay resources.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href="https://rpscripts.net/tools/server-cfg-generator/" rel="noopener noreferrer"&gt;RPScripts server.cfg Builder &amp;amp; Checker&lt;/a&gt; can review an existing configuration or generate an annotated starter. It runs in the browser.&lt;/p&gt;

&lt;p&gt;Disclosure: this post is from RPScripts. The tool linked above is ours and free to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the order is right and it still fails
&lt;/h2&gt;

&lt;p&gt;Two more causes with the same shape:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OneSync.&lt;/strong&gt; With OneSync enabled, networked entities, state bags and server-side natives behave differently than in single-player. A resource that expects a client-side entity will start fine and do nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Restart-only success.&lt;/strong&gt; If it works after a manual &lt;code&gt;ensure&lt;/code&gt; but not after a cold start, the order is wrong. A resource that depends on state held by another resource must be restarted after that resource, not merely started once.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The console shows the framework as started before the resources that use it.&lt;/li&gt;
&lt;li&gt;Every resource whose API you call is in your &lt;code&gt;dependencies&lt;/code&gt; list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ensure&lt;/code&gt; and &lt;code&gt;start&lt;/code&gt; are used with intent, not interchangeably.&lt;/li&gt;
&lt;li&gt;The same order works after a full server restart, not only after a manual start.&lt;/li&gt;
&lt;li&gt;The first red line in the console is read before anything is changed.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>lua</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>FiveM dependencies: how to read the dependency list before you install</title>
      <dc:creator>RPScripts</dc:creator>
      <pubDate>Sun, 01 Nov 2026 16:47:34 +0000</pubDate>
      <link>https://dev.to/rpscripts/fivem-dependencies-how-to-read-the-dependency-list-before-you-install-1ge7</link>
      <guid>https://dev.to/rpscripts/fivem-dependencies-how-to-read-the-dependency-list-before-you-install-1ge7</guid>
      <description>&lt;p&gt;Every FiveM script comes with a dependency list. It is the cheapest compatibility check you will ever run, and most people read it too late — after the purchase, after the install, after the "Could not find resource" line in the console.&lt;/p&gt;

&lt;p&gt;Here is what those lines actually mean, and how to check them before you install anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  A dependency entry is a name, not a version
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'qb-core'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'ox_lib'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'oxmysql'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three strings. The server reads them and does exactly one thing: it refuses to start this resource while one of those named resources is not running. That is the whole mechanism. There is no version check, no API check, no compatibility matrix.&lt;/p&gt;

&lt;p&gt;Two consequences follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A dependency that exists but is three releases behind satisfies the check perfectly.&lt;/li&gt;
&lt;li&gt;A dependency you renamed on disk breaks the check, because the comparison is a literal string match against the resource folder name.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three kinds of dependency
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Framework.&lt;/strong&gt; &lt;code&gt;es_extended&lt;/code&gt;, &lt;code&gt;qb-core&lt;/code&gt;, &lt;code&gt;qbx_core&lt;/code&gt;. This is the one that matters most, because a script written for QBCore does not run on ESX, and vice versa. The console usually stays quiet here: the script starts, calls an export that does not exist, gets &lt;code&gt;nil&lt;/code&gt; back, and every button in the UI does nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Libraries.&lt;/strong&gt; &lt;code&gt;ox_lib&lt;/code&gt;, &lt;code&gt;qbx_lib&lt;/code&gt;, &lt;code&gt;voruniverse_lib&lt;/code&gt;, &lt;code&gt;pma-voice&lt;/code&gt;. Shared helper libraries that several studios depend on. Installing the script without the library produces the same symptom as a framework mismatch: no error, no feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data layer.&lt;/strong&gt; &lt;code&gt;oxmysql&lt;/code&gt;, &lt;code&gt;mysql-async&lt;/code&gt;. If the resource opens a database and this one is missing, the failure surfaces on the first query instead of at start.&lt;/p&gt;

&lt;h2&gt;
  
  
  The name is the folder name
&lt;/h2&gt;

&lt;p&gt;The check compares the string in the manifest with the name of a started resource. If your server folder is called &lt;code&gt;qb-core-old&lt;/code&gt;, or you have both &lt;code&gt;ox_lib&lt;/code&gt; and &lt;code&gt;oxlib&lt;/code&gt;, the manifest will not match. That is why "it worked for him" is not evidence: the other server probably has the exact folder names the script author wrote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check it before you install
&lt;/h2&gt;

&lt;p&gt;Open the package, open &lt;code&gt;fxmanifest.lua&lt;/code&gt;, and list the dependencies. Then, on your server, list what is actually started. Every name on the first list must exist on the second, with the exact spelling.&lt;/p&gt;

&lt;p&gt;If you are buying rather than installing, this list is part of the compatibility answer: a script that targets &lt;code&gt;qbx_core&lt;/code&gt; is not a script for a QBCore server, whatever the title says.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://rpscripts.net/tools/fivem-script-tester/" rel="noopener noreferrer"&gt;RPScripts FiveM Script Tester&lt;/a&gt; does that read for you. Paste a resource ZIP, a single Lua file or the manifest text, and it parses the manifest, resolves the dependency list and reports the framework the resource targets. It runs in the browser; nothing is uploaded.&lt;/p&gt;

&lt;p&gt;Disclosure: this post is from RPScripts. The tool linked above is ours and free to use. You can also read the manifest by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every dependency in &lt;code&gt;fxmanifest.lua&lt;/code&gt; is started on your server, spelled exactly.&lt;/li&gt;
&lt;li&gt;The framework dependency matches your framework, not the one the seller tested on.&lt;/li&gt;
&lt;li&gt;Library dependencies are installed, not only the script itself.&lt;/li&gt;
&lt;li&gt;The database driver named in the manifest is present.&lt;/li&gt;
&lt;li&gt;A dependency you renamed will be renamed back, or the manifest edited to match.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ten minutes with the manifest before the purchase saves an evening with the console.&lt;/p&gt;

</description>
      <category>lua</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>FiveM server.cfg vs resources.cfg: the difference that breaks your server on restart</title>
      <dc:creator>RPScripts</dc:creator>
      <pubDate>Sun, 01 Nov 2026 13:32:55 +0000</pubDate>
      <link>https://dev.to/rpscripts/fivem-servercfg-vs-resourcescfg-the-difference-that-breaks-your-server-on-restart-15lg</link>
      <guid>https://dev.to/rpscripts/fivem-servercfg-vs-resourcescfg-the-difference-that-breaks-your-server-on-restart-15lg</guid>
      <description>&lt;p&gt;There is a specific moment in every FiveM server's life where it works on Tuesday and does not start on Wednesday, and nothing in the resource changed. The cause is almost always this: &lt;code&gt;server.cfg&lt;/code&gt; and &lt;code&gt;resources.cfg&lt;/code&gt; are two different files with two different jobs, and the order in which FiveM reads them decides what actually starts.&lt;/p&gt;

&lt;p&gt;Let me clear up what each file does, then walk through the failure patterns I see most often.&lt;/p&gt;

&lt;h2&gt;
  
  
  What server.cfg actually does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;server.cfg&lt;/code&gt; is the file you pass to the server binary. It is not a resource list, even though it often ends up containing one. Its job is to set the runtime configuration for the instance: your server name, the license key, the &lt;code&gt;set&lt;/code&gt; and &lt;code&gt;sets&lt;/code&gt; directives, the networking ports, and one or two &lt;code&gt;exec&lt;/code&gt; calls.&lt;/p&gt;

&lt;p&gt;A minimal server.cfg looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;endpoint_add_tcp&lt;/span&gt; &lt;span class="s2"&gt;"0.0.0.0:30120"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;sv_projectName&lt;/span&gt; &lt;span class="s2"&gt;"My Server"&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;sv_maxclients&lt;/span&gt; &lt;span class="m"&gt;48&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;mysql_connection_string&lt;/span&gt; &lt;span class="s2"&gt;"mysql://user:pass@127.0.0.1:3306/mydb"&lt;/span&gt;
&lt;span class="n"&gt;sets&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt; &lt;span class="s2"&gt;"de"&lt;/span&gt;
&lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;.&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line is the part that matters for the rest of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  What resources.cfg actually does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;resources.cfg&lt;/code&gt; is a resource list. It contains &lt;code&gt;ensure&lt;/code&gt; directives and nothing else that belongs in a config file. Its job is to say which resources start, and in which order.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ensure mapmanager
ensure sessionmanager
ensure qb-core
ensure qb-policejob
ensure my-custom-script
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file is loaded by &lt;code&gt;exec&lt;/code&gt; from &lt;code&gt;server.cfg&lt;/code&gt;, or by &lt;code&gt;exec&lt;/code&gt; from another exec'd file. The usual convention is a single &lt;code&gt;exec server.cfg&lt;/code&gt; in the launch config, and that file does &lt;code&gt;exec resources.cfg&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The order of operations, precisely
&lt;/h2&gt;

&lt;p&gt;This is the part that causes confusion, so here is the sequence in full:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The server binary starts and reads the config you passed on the command line, usually &lt;code&gt;+exec server.cfg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Every &lt;code&gt;set&lt;/code&gt; and &lt;code&gt;sets&lt;/code&gt; directive in that file is applied immediately.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exec&lt;/code&gt; directives are processed. Each exec'd file is read and processed in turn.&lt;/li&gt;
&lt;li&gt;Resources named with &lt;code&gt;ensure&lt;/code&gt; are queued.&lt;/li&gt;
&lt;li&gt;After the entire config tree has been read, the queued resources start, in the order they were queued.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 5 is the important one. Resources do not start as soon as their &lt;code&gt;ensure&lt;/code&gt; line is read. They start after all configuration is done. Which means this is legal and does what you expect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exec resources.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is also legal, and does something completely different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ensure qb-core
ensure my-custom-script
exec resources.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here the two &lt;code&gt;ensure&lt;/code&gt; lines are queued &lt;em&gt;before&lt;/em&gt; the exec, so they end up ahead of everything in &lt;code&gt;resources.cfg&lt;/code&gt;. The &lt;code&gt;ensure&lt;/code&gt; order that determines the startup order is the order of the queue, not the order of the file sections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure pattern 1: the double exec
&lt;/h2&gt;

&lt;p&gt;The single most common mistake I see is &lt;code&gt;exec resources.cfg&lt;/code&gt; appearing twice, or appearing in both &lt;code&gt;server.cfg&lt;/code&gt; and the command line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# server.cfg
&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;resources&lt;/span&gt;.&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# start command
+exec server.cfg +exec resources.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every resource gets queued twice. On the first pass resources start and register their exports. On the second pass the server tries to start them again, and depending on the resource you get one of three outcomes: a clean no-op, a console error about the resource already being started, or a genuine failure where the second start tries to re-create something that already exists.&lt;/p&gt;

&lt;p&gt;If your server logs show resources starting twice, or a resource that works fine but whose events fire twice, this is the cause. Check the launch command first, then the config file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure pattern 2: the config that never got loaded
&lt;/h2&gt;

&lt;p&gt;The reverse problem. A resource reads a value from &lt;code&gt;cfg&lt;/code&gt; that was supposed to be set in &lt;code&gt;server.cfg&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetConvar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"rpscripts_api_key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;server.cfg&lt;/code&gt; is missing the &lt;code&gt;set rpscripts_api_key "..."&lt;/code&gt; line, the resource starts with an empty string and quietly does nothing. No error, no crash, just a feature that never activates.&lt;/p&gt;

&lt;p&gt;The confusing part is that this often only shows up after a restart, because the developer had the value set in a local config that never made it to production. It also only shows up on the server that has the missing line, which is why it is hard to reproduce.&lt;/p&gt;

&lt;p&gt;Two habits prevent this. First, keep every &lt;code&gt;set&lt;/code&gt; directive in exactly one file, never spread across the launch command and the config. Second, after editing a config, check the effective values rather than the file: the server console exposes the running configuration, and a &lt;code&gt;set&lt;/code&gt; you cannot find there is not set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure pattern 3: ordering across framework and content
&lt;/h2&gt;

&lt;p&gt;Within &lt;code&gt;resources.cfg&lt;/code&gt;, order is dependency order. Frameworks first, then the libraries that sit on the framework, then your content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;ensure&lt;/span&gt; &lt;span class="n"&gt;mapmanager&lt;/span&gt;
&lt;span class="n"&gt;ensure&lt;/span&gt; &lt;span class="n"&gt;sessionmanager&lt;/span&gt;
&lt;span class="n"&gt;ensure&lt;/span&gt; &lt;span class="n"&gt;qb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;
&lt;span class="n"&gt;ensure&lt;/span&gt; &lt;span class="n"&gt;qb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;multicharacter&lt;/span&gt;
&lt;span class="n"&gt;ensure&lt;/span&gt; &lt;span class="n"&gt;qb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;policejob&lt;/span&gt;
&lt;span class="n"&gt;ensure&lt;/span&gt; &lt;span class="n"&gt;qb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;inventory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get this wrong and you get the classic symptom: a resource that depends on &lt;code&gt;qb-core&lt;/code&gt; starting before &lt;code&gt;qb-core&lt;/code&gt; exists. It then fails to find the framework object, throws during initialization, and the server moves on without it. The resource is not in the dependency graph at all, so it never restarts by itself.&lt;/p&gt;

&lt;p&gt;The robust fix is to declare dependencies in the resource manifest rather than relying purely on the &lt;code&gt;ensure&lt;/code&gt; order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;fx_version&lt;/span&gt; &lt;span class="s1"&gt;'cerulean'&lt;/span&gt;
&lt;span class="n"&gt;game&lt;/span&gt; &lt;span class="s1"&gt;'gta5'&lt;/span&gt;
&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="s1"&gt;'My custom script'&lt;/span&gt;
&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="s1"&gt;'1.0.0'&lt;/span&gt;

&lt;span class="n"&gt;dependency&lt;/span&gt; &lt;span class="s1"&gt;'qb-core'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;dependency&lt;/code&gt; declared, the server starts the dependency first regardless of the order of the &lt;code&gt;ensure&lt;/code&gt; lines. You keep the file readable for humans, and you get correctness from the manifest. Relying on file order alone works right up until someone reorders the file for tidiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure pattern 4: the resource that stops the line
&lt;/h2&gt;

&lt;p&gt;One resource throwing during its own initialization can prevent later resources from starting. This is worth knowing because it makes a single broken script look like a whole server problem.&lt;/p&gt;

&lt;p&gt;The symptom is a server that starts, prints the first handful of resources, and then goes quiet. You check each resource individually and they all work. The actual fault is usually a resource whose &lt;code&gt;fxmanifest.lua&lt;/code&gt; has a syntax error, or which tries to read a database table that does not exist yet. That resource fails, and depending on how the failing resource handles its own error, the resources queued behind it never get their start.&lt;/p&gt;

&lt;p&gt;A quick way to bisect this: start the server with only the framework, then add resources back in groups. The resource where the log stops is the one to fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical validation order
&lt;/h2&gt;

&lt;p&gt;Before you trust a config, check it in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does &lt;code&gt;server.cfg&lt;/code&gt; contain exactly one &lt;code&gt;exec&lt;/code&gt; of the resource list, and does the launch command not also exec it?&lt;/li&gt;
&lt;li&gt;Are all &lt;code&gt;set&lt;/code&gt; values present in the file that is actually being read?&lt;/li&gt;
&lt;li&gt;Does every resource that needs a framework declare it as a &lt;code&gt;dependency&lt;/code&gt; in its manifest?&lt;/li&gt;
&lt;li&gt;Do the &lt;code&gt;ensure&lt;/code&gt; lines follow a sane order anyway, so the file reads correctly to a human?&lt;/li&gt;
&lt;li&gt;Does the startup log show every resource you expect, exactly once, in a sensible order?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For step 5, and for the checks in step 2, the console is the source of truth, not the file on disk. A server that is currently running has a resolved configuration, and reading that is more reliable than reading your intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this bites hardest
&lt;/h2&gt;

&lt;p&gt;None of this is exotic. It is the daily mechanics of running a FiveM server, and it is the reason so many "my script is broken" reports turn out to be a config problem rather than a code problem. The &lt;a href="https://rpscripts.net/scripts/" rel="noopener noreferrer"&gt;free script archive on RPScripts&lt;/a&gt; keeps known-good &lt;code&gt;fxmanifest.lua&lt;/code&gt; files around for exactly this kind of comparison, and if you are validating a resource before you ship it, the &lt;a href="https://rpscripts.net/tools/fivem-script-tester/" rel="noopener noreferrer"&gt;script tester&lt;/a&gt; runs your manifest and Lua through the checks that catch most of the above.&lt;/p&gt;

&lt;p&gt;If your &lt;code&gt;server.cfg&lt;/code&gt; is more than a handful of lines, it is worth having it validated mechanically rather than by reading, because the failure modes above are all invisible in a diff. The &lt;a href="https://rpscripts.net/tools/server-cfg-generator/" rel="noopener noreferrer"&gt;server.cfg builder and checker&lt;/a&gt; parses the file, verifies that every &lt;code&gt;exec&lt;/code&gt; target exists, and flags the duplicate-exec case before it costs you a restart. Once the config is clean, the next thing worth automating is the resource itself: a manifest validator and a Lua checker catch the errors that would otherwise show up as a broken server at 2 AM.&lt;/p&gt;

&lt;p&gt;If you have hit the "works Tuesday, broken Wednesday" case, look at the exec structure first. It is the cause more often than not, and it is the fastest thing to check.&lt;/p&gt;

</description>
      <category>lua</category>
      <category>fivem</category>
      <category>programming</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Debug a FiveM resource in three passes: configuration, code, then runtime</title>
      <dc:creator>RPScripts</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:49:17 +0000</pubDate>
      <link>https://dev.to/rpscripts/debug-a-fivem-resource-in-three-passes-configuration-code-then-runtime-j1k</link>
      <guid>https://dev.to/rpscripts/debug-a-fivem-resource-in-three-passes-configuration-code-then-runtime-j1k</guid>
      <description>&lt;p&gt;A resource can have valid Lua and still fail on a FiveM server. The server might not have discovered its folder, a dependency might be missing, or the code might expect a framework API your installation does not provide.&lt;/p&gt;

&lt;p&gt;Treat these as separate checks. It makes the next change easier to choose and the result easier to explain.&lt;/p&gt;

&lt;p&gt;Disclosure: this post is from RPScripts. The two browser tools linked below are ours and free to use. You can also follow the workflow manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pass 1: Check what the server is being asked to start
&lt;/h2&gt;

&lt;p&gt;Before editing code, write down the resource's exact folder name, required framework, dependencies and installation instructions. Compare that list with the resources actually installed on your test server.&lt;/p&gt;

&lt;p&gt;Look for an accidental extra directory level after extracting a ZIP. The resource folder should contain its manifest; a download folder containing another folder containing the manifest deserves a closer look. Check path casing when moving files between Windows and Linux.&lt;/p&gt;

&lt;p&gt;Read the active configuration, including any files it loads. Keep dependencies ahead of the resources that use them, according to the resource author's instructions. A line in server.cfg does not install a framework or create database tables.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://rpscripts.net/tools/server-cfg-generator/" rel="noopener noreferrer"&gt;RPScripts server.cfg Builder &amp;amp; Checker&lt;/a&gt; can help review an existing configuration or create an annotated starter. It runs in the browser. A clean report cannot confirm that your resource files, database or license are correct; those still need a local check. Use placeholders when sharing configuration for support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pass 2: Inspect the resource before loading it into your server
&lt;/h2&gt;

&lt;p&gt;Separate syntax problems from integration problems. A parser can identify malformed Lua, but it cannot establish that a database exists or that a particular vehicle appears correctly in the game.&lt;/p&gt;

&lt;p&gt;For each resource, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the manifest reference the scripts and UI files you actually shipped?&lt;/li&gt;
&lt;li&gt;Are client scripts and server scripts assigned to the intended side?&lt;/li&gt;
&lt;li&gt;Do required dependency names match the installed folders?&lt;/li&gt;
&lt;li&gt;Does an integration call an API supported by your installed framework version?&lt;/li&gt;
&lt;li&gt;Does server code validate permissions and derive important values itself, rather than trusting values supplied by a client?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://rpscripts.net/tools/fivem-script-tester/" rel="noopener noreferrer"&gt;RPScripts FiveM Script Tester&lt;/a&gt; accepts a resource ZIP, a Lua file or pasted code. Its static checks and CfxLua sandbox run in the browser. The separate "Open in RPScripts AI" action sends files to your account, so distinguish that optional action from the local checks.&lt;/p&gt;

&lt;p&gt;Read the scope of the result. Simulated frameworks and events help isolate some failures, but game-world natives, OneSync and real database behaviour still require a real server. A successful simulation is one piece of evidence, not a deployment certificate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pass 3: Run one controlled test on a staging server
&lt;/h2&gt;

&lt;p&gt;Back up the resource and configuration first. Use a staging server with the dependencies and framework version you intend to deploy.&lt;/p&gt;

&lt;p&gt;The official &lt;a href="https://docs.fivem.net/docs/server-manual/server-commands/" rel="noopener noreferrer"&gt;Cfx server-command reference&lt;/a&gt; distinguishes these operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;refresh&lt;/code&gt; rescans resource manifests so newly added resources can be discovered.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;start resource_name&lt;/code&gt; starts a stopped resource.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ensure resource_name&lt;/code&gt; starts a stopped resource or restarts one that is already running.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last distinction matters when other resources depend on state held by the resource you restart. Use a controlled maintenance or staging workflow instead of repeatedly issuing commands on a busy server.&lt;/p&gt;

&lt;p&gt;Capture the first relevant server-console error and the corresponding client F8 output. Reproduce one action, change one cause, and repeat the same action. If it works, restart the staging server and test again: success after a manual start does not establish that a cold start has the right order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep a short test record
&lt;/h2&gt;

&lt;p&gt;Record the artifact version, framework and dependency versions, the action you tried, the result and the relevant log lines. Redact credentials before sharing anything.&lt;/p&gt;

&lt;p&gt;Configuration checks answer whether the setup looks consistent. Resource checks answer what the code and simulation reveal. A staging test answers what happens in your actual environment. Keeping all three results makes support requests clearer and future updates easier to verify.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Your FiveM resource won't load? Check these fxmanifest.lua fields first</title>
      <dc:creator>RPScripts</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:38:51 +0000</pubDate>
      <link>https://dev.to/rpscripts/your-fivem-resource-wont-load-check-these-fxmanifestlua-fields-first-5dmf</link>
      <guid>https://dev.to/rpscripts/your-fivem-resource-wont-load-check-these-fxmanifestlua-fields-first-5dmf</guid>
      <description>&lt;p&gt;Every FiveM server owner has seen it: &lt;code&gt;ensure my_resource&lt;/code&gt; prints &lt;em&gt;Could not find resource&lt;/em&gt;, or the resource starts and then does nothing. Before you touch a single line of Lua, check the manifest — most of these failures live there, and the console error rarely points at the actual line.&lt;/p&gt;

&lt;p&gt;These are the six things I check first, in this order.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;code&gt;fx_version&lt;/code&gt; is missing or misspelled
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;fx_version&lt;/span&gt; &lt;span class="s1"&gt;'cerulean'&lt;/span&gt;
&lt;span class="n"&gt;game&lt;/span&gt; &lt;span class="s1"&gt;'gta5'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;fx_version&lt;/code&gt;, no resource. It is not optional, it is not inferred, and a typo (&lt;code&gt;fx_verison&lt;/code&gt;) gives you the same generic failure as a missing file. &lt;code&gt;cerulean&lt;/code&gt; is the current value; older manifests use &lt;code&gt;adamant&lt;/code&gt; or &lt;code&gt;bodacious&lt;/code&gt; and still load, but there is no reason to start a new resource on a retired version.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The &lt;code&gt;game&lt;/code&gt; line is absent
&lt;/h2&gt;

&lt;p&gt;Without &lt;code&gt;game 'gta5'&lt;/code&gt; the resource may load and then behave strangely: natives resolve, entities spawn, and nothing works the way it does in every tutorial you followed. Cheap to check, expensive to debug.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Path casing in &lt;code&gt;client_scripts&lt;/code&gt; and &lt;code&gt;server_scripts&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The classic "works on my machine". You develop on Windows, where &lt;code&gt;client/Client.lua&lt;/code&gt; and &lt;code&gt;client/client.lua&lt;/code&gt; are the same file, and deploy to a Linux host where they are two different paths and only one exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;client_scripts&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'client/main.lua'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;-- must match the real filename exactly&lt;/span&gt;
    &lt;span class="s1"&gt;'client/ui.lua'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same rule for &lt;code&gt;shared_scripts&lt;/code&gt;, &lt;code&gt;files&lt;/code&gt; and &lt;code&gt;server_scripts&lt;/code&gt;. If a resource loads but one feature silently never runs, suspect casing before logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;code&gt;lua54&lt;/code&gt; is still in the manifest
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;lua54&lt;/span&gt; &lt;span class="s1"&gt;'yes'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This flag does nothing today — every FiveM Lua script runs on Lua 5.4 and the manifest documentation marks the opt-in as deprecated. It is not the bug itself, it is a fossil: a manifest nobody has revisited. Where it shows up, look for the neighbours of an old setup — a &lt;code&gt;__resource.lua&lt;/code&gt; that was renamed instead of converted, &lt;code&gt;node_version&lt;/code&gt; values that no longer exist, or code that still assumes Lua 5.3 number semantics.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;code&gt;dependencies&lt;/code&gt; instead of hoping for the best
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'ox_lib'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'oxmysql'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without it, your resource starts in whatever order &lt;code&gt;server.cfg&lt;/code&gt; happens to load, and every call into a dependency that has not started yet throws at runtime. Declaring dependencies makes FiveM refuse the start with a clear message instead of letting you debug a nil export at 2 a.m.&lt;/p&gt;

&lt;p&gt;Two gotchas: the name must match the dependency's folder, not its display name, and an optional integration should not be listed — declare only what the resource cannot run without.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. &lt;code&gt;escrow_ignore&lt;/code&gt; when the resource is sold
&lt;/h2&gt;

&lt;p&gt;If the resource is protected with escrow, any file a customer is supposed to edit — &lt;code&gt;config.lua&lt;/code&gt;, locale files, framework bridges — has to be listed in &lt;code&gt;escrow_ignore&lt;/code&gt;. Miss one and the customer edits a file that never executes, reports a bug, and nobody can reproduce it because the developer's own copy is unencrypted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two-minute pre-flight
&lt;/h2&gt;

&lt;p&gt;Before every restart:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;fxmanifest.lua&lt;/code&gt; sits at the resource root, and is not secretly &lt;code&gt;fxmanifest.lua.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fx_version&lt;/code&gt; and &lt;code&gt;game&lt;/code&gt; are present and spelled correctly.&lt;/li&gt;
&lt;li&gt;Every path in &lt;code&gt;client_scripts&lt;/code&gt;, &lt;code&gt;server_scripts&lt;/code&gt;, &lt;code&gt;shared_scripts&lt;/code&gt; and &lt;code&gt;files&lt;/code&gt; exists with exact casing.&lt;/li&gt;
&lt;li&gt;A glob in &lt;code&gt;files&lt;/code&gt; matches at least one file — an empty glob is silent.&lt;/li&gt;
&lt;li&gt;Dependencies are declared by folder name, not assumed.&lt;/li&gt;
&lt;li&gt;Escrow-protected resources list every editable file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I got tired of checking this by hand, so I wrote a dependency-free linter that reads manifest syntax as text and never executes Lua: &lt;a href="https://github.com/Livvux/fivem-fxmanifest-lint" rel="noopener noreferrer"&gt;fivem-fxmanifest-lint&lt;/a&gt;. Python 3.10+, no third-party packages, no network access, non-zero exit code for CI.&lt;/p&gt;

&lt;p&gt;For a quick check in the browser without cloning anything, there is a hosted &lt;a href="https://rpscripts.net/tools/fxmanifest-generator/" rel="noopener noreferrer"&gt;fxmanifest.lua validator and generator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Either way: fix the manifest first. Most of the time, the Lua was fine.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>lua</category>
      <category>fivem</category>
    </item>
  </channel>
</rss>
