Project structure — server vs client
The most important thing to understand is what stays on the server and what players download. The layout is the same as RAGE:MP's.
The server folder
server/
├─ altv-server.exe the server
├─ nethost.dll .NET hosting (required next to the exe)
├─ conf.json server config
├─ packages/ ── SERVER-side JavaScript ─────────────────────────
│ └─ <name>/index.js one folder = one package, runs on V8 (Node.js-style)
├─ dotnet/ ── SERVER-side C# ─────────────────────────────────
│ ├─ runtime/ bundled .NET 8 + Bootstrapper.dll (GTANetworkAPI)
│ └─ resources/
│ └─ <Name>/meta.xml one folder = one C# resource (meta.xml → the built .dll)
├─ client_packages/ ── CLIENT-side, downloaded by players ──────────────
│ ├─ index.js the client entry point
│ ├─ ... your client scripts, CEF UI (html/css/js), images, sounds
│ └─ game_resources/
│ └─ dlcpacks/ DLC packs (cars, clothes): <pack>/dlc.rpf
├─ loadingscreen/ optional custom loading screen (downloaded by players)
├─ f1menu/ optional custom F1 panel (downloaded by players)
└─ cache/ data/ logs/ server working folders
What players download — and what they never see
| Folder | Runs on | Sent to players? |
|---|---|---|
packages/ | server | ❌ never |
dotnet/ | server | ❌ never |
conf.json, dlcpack.key, the exe and dlls | server | ❌ never |
client_packages/ (including game_resources/dlcpacks) | client | ✅ yes, encrypted |
loadingscreen/, f1menu/ | client | ✅ yes, encrypted |
Only those last two rows ever reach a player. Your gamemode logic, database access and secrets stay on the server.
Building client code
If you write your client in modules or a framework, build it into client_packages/ and keep the
sources outside it, for example:
src_client/ --(webpack / your build)--> client_packages/main.js
src_cef/ --(your UI build)--------> client_packages/interface/
Only the built output in client_packages/ is downloaded. Players get only the files that changed
since their last visit.