# NetCraftGames: full site text > Concatenated Markdown of every public page on https://netcraftgames.com, generated 2026-10-03. Draft legal pages are omitted. Source of truth for facts: https://netcraftgames.com/facts/. --- # We do the heavy lifting so you don't have to. > NetCraftGames is managed dedicated server hosting for indie multiplayer games that already work, on Unity, Unreal, Godot and the browser. You build the server; we read it, configure it, deploy it and run it. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/* ## What is NetCraftGames? **NetCraftGames (NCG) is a managed multiplayer game server hosting service for game developers and studios.** The owner of a game, which is how we say customer, submits a game that already has working multiplayer networking. NetCraftGames reads the submission, produces the connection configuration the game's players need, deploys the server on an isolated machine and operates it. - **Who it is for:** indie developers and small studios who have a Unity Mirror, Unity Netcode for GameObjects, Unreal, Godot or browser multiplayer game that already works and do not want to run servers. - **What you submit:** a Linux x64 dedicated server build that you or your AI have already built and tested (or an existing WebRTC adapter), plus the engine and transport you use. - **What you get:** a connection configuration, a running server, automatic shutdown of empty servers, and a plain-English email with a concrete fix if something does not connect. > **What must already exist** > > We do not write multiplayer. Before you submit, your game needs working multiplayer and a server program that runs without a window on Linux. Single-player games, games where one player hosts, and games built on an online service such as Photon or PlayFab are not a fit today. [Check if your game qualifies](https://netcraftgames.com/can-you-host-my-game/) in about two minutes: nothing is uploaded. Your customers are players. Ours are owners. [Read how it works](https://netcraftgames.com/how-it-works/) or check the [fact sheet](https://netcraftgames.com/facts/) for exact limits. ## From submission to players in five steps Every step has a deterministic check behind it. AI helps read and explain; it never decides whether your server is safe, never touches billing and never bans a player. 1. **Submit your game.** Upload your Linux x64 server build, or connect an existing WebRTC adapter, and tell us your engine and transport. 2. **AI-assisted code reading.** A static reader that never runs your code finds ports, protocol and settings. An optional AI layer explains the findings. Deterministic checks decide pass or fail. 3. **You get a connection config.** You receive the address, port and protocol your game client needs, in a file you can paste into your project. 4. **Deployed in 24 hours.** Our target: your server runs on an isolated machine within 24 hours, or you get an email with the exact problem and a concrete fix. 5. **Players join.** Players connect. Servers with no players shut down by themselves after ten minutes, so you do not pay for empty servers. The 24 hours start when a complete submission is received, and pause only while the next move is yours. See [the conditions in full](https://netcraftgames.com/24-hour-promise/). ## Engines and transports we host Each page below explains the real setup, the ports, and the honest gaps. No engine is certified yet; certification needs real test evidence that has not been published. - [Hosting a Unity Mirror dedicated server](https://netcraftgames.com/engines/unity-mirror/): Linux Server build over KCP, Telepathy or WebSocket transports. - [Hosting a Unity Netcode for GameObjects server](https://netcraftgames.com/engines/unity-netcode-for-gameobjects/): Linux Server build with Unity Transport over UDP. - [Hosting an Unreal Engine dedicated server](https://netcraftgames.com/engines/unreal-engine/): Packaged Linux server from a source-built engine, UDP 7777. - [Hosting a Godot ENet dedicated server](https://netcraftgames.com/engines/godot-enet/): Dedicated server export, run headless, ENet over UDP. - [Hosting a Godot WebSocket multiplayer server](https://netcraftgames.com/engines/godot-websocket/): WebSocketMultiplayerPeer for web exports, behind a wss gateway. - [Hosting a browser WebSocket (WSS) game server](https://netcraftgames.com/engines/browser-websocket/): Your own authoritative WebSocket server in Node, Python, Go or Rust. - [WebRTC signaling for browser and Godot games](https://netcraftgames.com/engines/browser-webrtc/): Room signaling for peer-to-peer games. No TURN relay. ## Pricing in plain numbers Plans are monthly and built on weighted server hours, not a vague promise of unlimited. A standard server uses one hour per hour it is running; startup is free; unused base hours expire at renewal. | Plan | Price per month | Published games | Standard server hours | Transfer | Storage | Connection ceiling | | --- | ---: | ---: | ---: | ---: | ---: | ---: | | Creator | $49 | 10 | 40 | 10 GiB | 10 GiB | 50 | | Maker | $79 | 25 | 80 | 25 GiB | 25 GiB | 100 | | Studio | $99 | 50 | 120 | 40 GiB | 50 GiB | 150 | The **capacity boost** costs $19 one time and adds 20 standard server hours and 5 GiB of transfer ($0.95 per hour). Boost balances carry forward while your subscription is active. Hosting requires an active subscription. Prices are launch settings and nobody is being charged yet. [See the full pricing explanation](https://netcraftgames.com/pricing/), including what a plan hour does and does not buy. ## What we will not pretend Trust is the product. These are the limits today, stated before you ask. - **Not open yet.** NetCraftGames is not accepting customers until its launch checks pass. Today you can join the waitlist. - **Linux x64 servers only.** Dedicated servers must be Linux x64 builds. Windows or macOS server builds are not hosted. - **No TURN relay yet.** Browser WebRTC games get room signaling, not media relay. Restrictive networks may fail to connect peer to peer. - **No universal anti-cheat.** We do not ban players automatically or claim to stop cheating. Player reports go to a review queue. - **We do not write your netcode.** Your game must already have working networking. We host and configure it; we do not invent multiplayer. - **No unlimited always-on.** Every plan includes weighted server hours. Keeping a server awake spends them, and unused base hours expire at renewal. More detail: [what the AI reads and never does](https://netcraftgames.com/trust/), [what happens when a connection fails](https://netcraftgames.com/connection-failures/) and [how we compare to alternatives](https://netcraftgames.com/compare/). ## Guides for owners building multiplayer Short, practical and written for the problems that stop a multiplayer build from going live: Linux server exports, ports and firewalls, transports, idle cost and connection config. - [How to build a Linux dedicated server from Unity](https://netcraftgames.com/guides/build-linux-dedicated-server-unity/): Step by step: build a headless Linux dedicated server from Unity 6 with Build Profiles, bind it correctly, test it and pack it for hosting. - [Host a Node.js WebSocket game server: what to prepare](https://netcraftgames.com/guides/node-websocket-server/): Get a Node.js 24 WebSocket game server ready for NetCraftGames: the one command that packs it, the WebSocket path setting, socket.io and what does not work. - [Mirror server on the cloud: ports and firewall checklist](https://netcraftgames.com/guides/mirror-server-ports-firewall-checklist/): A practical ports and firewall checklist for running a Mirror dedicated server on a cloud machine: KCP, Telepathy and SimpleWeb ports, binding and testing. - [Host a Python WebSocket game server: what to prepare](https://netcraftgames.com/guides/python-websocket-server/): Get a Python 3.12 WebSocket game server ready for NetCraftGames: the command that vendors Linux wheels, the WebSocket path setting and what does not work. - [Godot dedicated server export checklist](https://netcraftgames.com/guides/godot-dedicated-server-export-checklist/): A checklist for exporting a Godot 4 dedicated server for Linux: export mode, headless start, ENet versus WebSocket, ports, saves and packing. - [Idle shutdown: why paying for empty servers is waste](https://netcraftgames.com/guides/idle-shutdown-empty-servers/): Why paying for empty game servers is waste, how much it costs in hours, how idle shutdown works safely, and what your server must report for it to work. [All guides](https://netcraftgames.com/guides/) and the [glossary](https://netcraftgames.com/glossary/). ## Questions owners ask ### What is NetCraftGames? NetCraftGames is a managed multiplayer game server hosting service. An owner submits a game that already has working networking; NetCraftGames reads it, produces a connection configuration, deploys it on a Linux server and operates it. The service is pre-launch and not accepting customers yet. You can join the waitlist. ### Is NetCraftGames available today? No. NetCraftGames is pre-launch and is not accepting customers or charging anyone. Checkout and server provisioning stay disabled until a published list of launch checks passes. You can join the waitlist by email, and the status page says exactly what remains before the doors open. ### Which game engines does NetCraftGames host? It is designed for Unity Mirror, Unity Netcode for GameObjects, Unreal Engine replication, Godot ENet and WebSocket, and browser games using WSS or WebRTC signaling. Dedicated servers must be Linux x64 builds. No engine is certified yet, because certification requires real client and server test evidence that has not been published. ### What does the 24 hour promise mean? After launch, NetCraftGames aims to get a submission online within 24 hours of receiving it, or to email you the exact problem and a concrete fix. It is a processing target, not a guarantee. The clock pauses only while the next step is yours, and the remedy for a missed target will be published in the Terms. ### Do I pay for servers when nobody is playing? Not for long. If your server reports player counts, it is saved and shut down after ten continuous minutes with zero players, and hosting hours stop being used. Servers that cannot report player counts must be put to sleep explicitly. Startup time is not counted against your hours. More answers on the [FAQ page](https://netcraftgames.com/faq/). ## Join the waitlist **Join the waitlist:** email contact@cbullsoftware.click (subject "NetCraftGames waitlist") with your engine and transport. No form and no account. See https://netcraftgames.com/waitlist/. --- # Can NetCraftGames host my game? > We host multiplayer games that already work and have a server program that runs without a window. Five questions tell you which side of that line your game is on, and what to ask your AI to change. Nothing is uploaded and your answers stay in your browser. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/* ## The short answer **NetCraftGames hosts a multiplayer game that already works.** It needs a server program, one that runs on its own machine without a window, on Linux. We do not write multiplayer, we do not turn a single-player game into a multiplayer one, and we do not host games that run on an online service such as Photon or PlayFab. If an AI built your game, read this page before you build anything else for hosting. You get one of three answers: - **Yes, ready.** Your game has the pieces we need. Next you run a check on your own computer, then submit. - **Almost.** One change is missing. You get the change in one sentence and a prompt to give your AI. - **Not yet.** We cannot host this today. We tell you why now, instead of after you upload. > **What this check is, and is not.** NetCraftGames has not hosted a customer game yet, so no 24-hour result exists. This is a quick check of your answers, not a certification: we have not seen your code, and nothing has been run. > > NetCraftGames aims to have a valid submission online within 24 hours. That is a processing target, not a guarantee, and the clock pauses while we wait for a fix that only you can make. The clock starts when we receive a complete submission. This quick check, and the time you spend building and testing your server, are not part of it. A brand-new submission after a closed one starts a new clock. See https://netcraftgames.com/24-hour-promise/ for the conditions. ## Check your game Pick the answer that fits best. **Not sure** is always fine: it leads to a way to find out. 1. **What is your game built with?** Unity; Unreal Engine; Godot; A browser game (JavaScript or TypeScript); Python; Something else (Go, Rust, C#, C++, Java); I do not know. If you pick a browser game or Python, you are also asked which networking library the server uses. 2. **Can two people play together over the internet right now?** Yes, and I tested it with two players; It is supposed to, but I never tested it; No, it is single-player; Not sure. 3. **How do players connect to each other?** To a server program that I run (a dedicated server); One player hosts and the others join that player (host, listen server or peer to peer); Through an online service (Photon, PlayFab, Steam, Epic, Firebase, Supabase or a lobby service); Not sure. 4. **Does the game have a server mode that runs without opening a window?** Yes, I already run it that way; Yes, but only on Windows or Mac; No, the server only runs inside the game window or the editor; Not sure. For a browser or Python game this question reads: is your server a Node.js or Python program that you start from a terminal? 5. **Which of these does your server already do?** It listens on a port I can change with a setting; It answers a health check page; It saves and exits cleanly when told to stop. Asked only if you have a dedicated server that already runs without a window on Linux. If you picked Something else, a fourth tick asks whether your server sends a fixed hello line, or answers a simple web page, to prove a player could join. ## Not sure? Ask your AI to find out This prompt makes your AI read your project, change nothing and print one JSON answer. Paste that answer into the box above, and every "Not sure" is filled in. The answer is checked inside this page and never sent anywhere. **Find out what my project is** ```text TASK: Read this project and tell me what it is. Do not change any file. Answer by printing ONE JSON object and nothing else, in exactly this shape (schema ncg.qualify-answers/1): { "schema": "ncg.qualify-answers/1", "engine": "unity" | "unreal" | "godot" | "browser-js" | "python" | "other", "language": "
", "networking": "none" | "dedicated-server" | "host-or-p2p" | "third-party-service", "networkingLibrary": "", "twoPlayerTestExists": true | false, "serverModeWithoutWindow": "yes-linux" | "yes-windows-or-mac-only" | "no", "hasHealthEndpoint": true | false, "readsPortFromSetting": true | false, "handlesSigtermAndSaves": true | false, "evidence": [""] } Rules: base every answer on files you actually opened. If you cannot tell, use the most cautious value (for example "none" or false) and say why in evidence. Do not include secrets or file contents beyond one short line per evidence item. ``` ## What we host and what we do not We would rather tell you now than after you have spent a weekend on it. The [glossary](https://netcraftgames.com/glossary/) explains any word you do not know. - **We do not write multiplayer.** NetCraftGames runs servers for games that already have multiplayer working. We never add networking to a game, and a single-player game is held when it is uploaded. - **Games where one player is the server.** The thing we run is a dedicated server program that you own, one that runs on its own machine without a window. A game where one player hosts the others (a listen server, host mode or peer to peer) needs a dedicated server mode first. The one exception is a browser game that already uses WebRTC: we offer room signaling for it, but we do not relay the game traffic itself. - **Games built on an online service.** Photon, PlayFab, Steam, Epic Online Services, Firebase and Supabase realtime run their own cloud. Our lane runs a server program that you wrote and own. If your game also has its own server code, that part can qualify. - **Colyseus and other frameworks that need web requests before the WebSocket.** Our gateway passes WebSocket connections only. Colyseus asks for a room over plain HTTP first, so it does not work through the gateway and we say so before you submit. socket.io does work, but only with WebSocket-only transport (long polling is not passed) and the fixed path you declare in the manifest. - **Servers whose WebSocket path changes for every room or player.** The gateway connects to your server at one fixed path: the root path "/" unless you declare a wsPath in the manifest (for example "/ws" or "/socket.io/?EIO=4&transport=websocket"). It cannot follow a path that changes for each room or each player, it does not forward anything a player puts in the address, and it passes WebSocket connections only, never plain web requests. - **Other Node versions, Deno, Bun and servers that call other websites.** Our servers run Node.js 24.21.0 and Python 3.12. Nothing is installed on our side, so your packages travel inside your upload, built for Linux x64 (ncg pack does this on your own computer). Another Node version, Deno or Bun must be shipped inside the upload as a Linux x86-64 program. A server cannot look up other websites by name: DNS is closed to game servers on purpose, so a game that calls an outside address by name will fail. Node.js 26 is planned after it becomes a long-term-support release, with no date and no promise. - **Windows or macOS servers and servers that need a screen.** Dedicated servers must be Linux x86-64 builds that run without a window or a graphics card. Windows, macOS and ARM server builds are not hosted. - **A "Yes" here is not a certification.** This page checks your answers. We have not seen your code and nothing has been run. A real server start and a real player join are checked only after you submit a build. ## The decision table This is the whole check as a table, for readers who skip the buttons and for search tools. Read down it: the first row that describes your game is your result. | Row | If this describes your game | Result | The one change | Prompt | | ---: | --- | --- | --- | --- | | 1 | You said the game is single-player. | Not yet | None. We do not write multiplayer. | [Plan multiplayer for my game (a plan, not code)](https://netcraftgames.com/can-you-host-my-game/#p-plan-multiplayer) (planning only) | | 2 | Players connect through an online service such as Photon, PlayFab, Steam or Firebase. | Not yet | Add a server program you own, or choose another host. | [Plan multiplayer for my game (a plan, not code)](https://netcraftgames.com/can-you-host-my-game/#p-plan-multiplayer) | | 3 | One player hosts or it is peer to peer, in Unity, Unreal or Godot, and two-player play is tested. | Almost: one change | Add a dedicated-server mode: same networking code, no local player. | [the prompt for your engine or language](https://netcraftgames.com/can-you-host-my-game/prompts/) | | 4 | One player hosts or it is peer to peer, in a browser game, and two-player play is tested. | Almost: one change | If the players connect with WebRTC, our room signaling can host the rooms. | [Browser game with WebRTC: use NetCraftGames room signaling](https://netcraftgames.com/can-you-host-my-game/prompts/webrtc-signaling/) | | 5 | One player hosts or it is peer to peer in any other case. | Not yet | A dedicated server design comes first. | [Plan multiplayer for my game (a plan, not code)](https://netcraftgames.com/can-you-host-my-game/#p-plan-multiplayer) | | 6 | Browser game that uses Colyseus. | Not yet | Move to plain WebSocket rooms or choose another lane. | [Move from Colyseus (or python-socketio) to plain WebSocket](https://netcraftgames.com/can-you-host-my-game/#p-node-migrate-to-ws) | | 7 | Two-player play over the internet was never tested. | Almost: one change | Test with two real players first. | [Prove two players can play together](https://netcraftgames.com/can-you-host-my-game/#p-two-player-test) | | 8 | The server only runs inside the game window or the editor. | Almost: one change | Add a server mode that runs without a window. | [the prompt for your engine or language](https://netcraftgames.com/can-you-host-my-game/prompts/) | | 9 | The server mode exists, but only on Windows or Mac. | Almost: one change | Build the server for Linux x86-64. | [the prompt for your engine or language](https://netcraftgames.com/can-you-host-my-game/prompts/) | | 10 | Browser or Python game that uses socket.io. | Almost: one change | JavaScript: switch to WebSocket-only transport and declare the socket.io path in the manifest. Python: move to plain WebSocket. | [Node.js with socket.io (WebSocket only)](https://netcraftgames.com/can-you-host-my-game/prompts/node-socketio/) (JavaScript), [Move from Colyseus (or python-socketio) to plain WebSocket](https://netcraftgames.com/can-you-host-my-game/#p-node-migrate-to-ws) (Python) | | 11 | You answered "Not sure" to any of questions 1 to 4 and nothing above decided it. | Not sure yet | Find out first: run ncg check, or give your AI the discover prompt. | [Find out what my project is](https://netcraftgames.com/can-you-host-my-game/#p-discover) | | 12 | You ticked every server basic in question 5. | Yes, ready | Next: run ncg check, then ncg pack. | none | | 13 | One or more server basics in question 5 are missing. | Almost: one change | Add the missing server basics. | [the prompt for your engine or language](https://netcraftgames.com/can-you-host-my-game/prompts/) | ## Prompts that set up your server Each prompt tells your AI exactly what the host needs: a port that can be set, a health probe, a join probe, a clean stop on SIGTERM, no secrets in code, and an `ncg.json` file with the exact settings. Every setting in them is checked against the real validator before this site is built. A prompt marked "Manifest checked" has passed that check; none of them has yet been tried against a real AI, so read what your AI changes. | Prompt | What it makes your AI do | Status | | --- | --- | --- | | [Node.js WebSocket server (ws)](https://netcraftgames.com/can-you-host-my-game/prompts/node-ws-hosting-basics/) | Gets a Node.js server that uses the ws library ready: health page, clean stop, packaging with ncg pack, ncg.json. | Manifest checked | | [Node.js with socket.io (WebSocket only)](https://netcraftgames.com/can-you-host-my-game/prompts/node-socketio/) | Makes a socket.io server work through the gateway: WebSocket-only transport and a fixed path in the manifest. | Draft | | [Python WebSocket server (websockets or FastAPI)](https://netcraftgames.com/can-you-host-my-game/prompts/python-ws-hosting-basics/) | Gets a Python server ready: health page, clean stop, packaging with ncg pack, ncg.json. | Draft | | [Unity: add a dedicated-server mode](https://netcraftgames.com/can-you-host-my-game/prompts/unity-dedicated/) | Makes your AI add a headless Linux server mode to a Unity project that uses Netcode for GameObjects or Mirror, and build it. | Manifest checked | | [Unity: build the server I have for Linux](https://netcraftgames.com/can-you-host-my-game/prompts/unity-linux-build/) | For a Unity dedicated server that exists only for Windows or Mac: makes your AI build it for Linux x86-64. | Draft | | [Unreal Engine: package a Linux dedicated server](https://netcraftgames.com/can-you-host-my-game/prompts/unreal-dedicated/) | Makes your AI package the Linux server target and add the health page and clean stop. | Draft | | [Godot 4: run as a dedicated server](https://netcraftgames.com/can-you-host-my-game/prompts/godot-dedicated/) | Makes your AI add a headless server start path for ENet or WebSocket, export it for Linux and add the health page. | Draft | | [Go, Rust, C#, C++ or Java server with its own protocol](https://netcraftgames.com/can-you-host-my-game/prompts/native-custom/) | Prepares a server with its own TCP or UDP protocol for the limited Custom native lane. | Draft | | [Browser game with WebRTC: use NetCraftGames room signaling](https://netcraftgames.com/can-you-host-my-game/prompts/webrtc-signaling/) | Connects a browser game that already uses WebRTC to our room signaling. We do not relay the game traffic. | Draft | | [Node.js with Express or Fastify and WebSocket](https://netcraftgames.com/can-you-host-my-game/prompts/node-hosting-basics-generic/) | Same as the ws prompt, with the Express and Fastify details. | Manifest checked | The [prompts page](https://netcraftgames.com/can-you-host-my-game/prompts/) lists them all, including one for socket.io (WebSocket only, with a fixed path in the manifest). ### Test it with two players first **Prove two players can play together** ```text TASK: Prove that two real players can play together before anything is hosted. Do not change gameplay. 1. Add a script (an npm script, or the equivalent for this engine) that starts the server on your own computer and connects two clients, headless or scripted. Each client sends a move or an action, and the script checks that each client receives the other's state. 2. Run it and show me the real output. If it fails, tell me which part of multiplayer does not work yet. Do not paper over it. 3. Add the result to the project README in two lines. ``` ### Plan multiplayer, with no code **Plan multiplayer for my game (a plan, not code)** ```text TASK: Do not write multiplayer code yet. Write MULTIPLAYER-PLAN.md for this game covering: 1. Which parts of the game state must be shared, who is authoritative (the server), how often the server updates, and what a client may send (inputs, not positions). 2. Which networking library fits this engine and language, and how a dedicated server can run without a window on Linux. 3. What changes in the client: a list of files and a realistic size estimate in days of work. 4. A test plan with two real clients. Be honest that adding multiplayer to a single-player game is a large change. Show me the plan and wait. ``` ### Move from Colyseus to plain WebSocket **Move from Colyseus (or python-socketio) to plain WebSocket** ```text TASK: This project uses Colyseus or python-socketio. The hosting service passes WebSocket connections only, to one fixed path. It cannot pass HTTP long polling or HTTP matchmaking, which Colyseus and the default python-socketio mode need before the WebSocket opens. (socket.io for JavaScript does not need this move: it has its own prompt.) First write a short migration plan in MIGRATION.md: list every event, room and message the game uses, how rooms and reconnection will work on plain WebSocket (JSON messages with a "type" field), and which client files change. Show me the plan and WAIT for my approval before you edit any code. After my approval: replace the realtime layer with the "ws" package on one HTTP server (JavaScript) or the "websockets" library (Python), keep the game rules unchanged, update the client to use new WebSocket(url), and add a test with two clients that proves two players see each other. Do not add features. Then ask me to run the hosting prompt for this stack. ``` ## What happens to your answers Nothing. The check runs in your browser with the same code the dashboard and the command line use. The page tells your browser, through its security policy, that it may not make any network request, so even a bug could not send your answers away. There are no cookies, no analytics and no stored answers. The page also works with JavaScript turned off: the questions, the decision table and every prompt are plain text you can select and copy. ## How to find out if your game qualifies 1. **Answer five questions.** Say what your game is built with, whether two people can play together over the internet, how players connect, whether the server runs without a window, and which server basics it already has. The page gives Yes, Almost or Not yet. 2. **Make the one change.** If the answer is Almost, copy the prompt to your AI. It changes only what the prompt lists. Test the result with two real players. 3. **Check it on your own computer.** When you have the `ncg` tool, `ncg check` reads your files locally and tells you what the service would say. It uploads nothing. 4. **Submit when we open.** NetCraftGames is not accepting customers yet. Join the waitlist, keep your `ncg.json`, and submit when the doors open. ## Frequently asked questions ### Do you see my code or my answers when I use this check? No. The check runs in your browser and the page is not allowed to make network requests, so nothing is uploaded, stored or sent. We only see the files you submit later, and only when you submit them. Without JavaScript the page still works as plain text. ### Does a Yes mean you will host my game? No. A Yes means your answers describe a game with the pieces we need. We have not seen your code and nothing was run. A real server start and a real player join are checked after you submit a build, and NetCraftGames has not hosted a customer game yet. ### My game is single-player. What can I do? We cannot host it, because we do not add multiplayer. If you want to build it later, the planning prompt makes your AI write a design document first, with no code. Adding multiplayer to a single-player game is a large change, and we promise nothing about hosting the result. ### Why is my Node.js or Python game only "Almost"? Our servers run Node.js 24 and Python 3.12, but they install nothing, so your packages have to travel inside your upload, built for Linux. The command `ncg pack . --node --install` (or `--python`) does that on your own computer, and the prompts for your stack add the health page, the clean stop and the manifest. If your WebSocket answers at a path such as /ws, one line in the manifest names it. ## Related pages - [How NetCraftGames takes your game online](https://netcraftgames.com/how-it-works/): How NetCraftGames takes your multiplayer game from submission to a running server in 24 hours: submit, AI reads, connection config, deploy, players join. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. - [The 24-hour promise, with the conditions stated plainly](https://netcraftgames.com/24-hour-promise/): What NetCraftGames means by "online and server ready in 24 hours": a processing target, when the clock starts and pauses, exclusions and open questions. --- # How NetCraftGames takes your game online > You submit a multiplayer game that already works; an AI-assisted intake reads it, deterministic checks verify it, you receive a connection configuration, and we deploy and operate the server within 24 hours of a complete submission. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/how-it-works/* ## The short answer NetCraftGames turns a finished multiplayer game build into a running, monitored server. The owner submits the build and says which engine and transport it uses. The service inspects the submission without running it, works out the connection settings, deploys the server on an isolated Linux machine in `us-east-1`, and gives players an address to join. If something is wrong, the owner gets an email that names the problem and the fix. > **Launch status** > > NetCraftGames is pre-launch and is not accepting customers. This page describes the designed flow. Parts of it are built and tested locally; none of it has run for a paying customer. See [launch status](https://netcraftgames.com/status/). ## Before you start: what must already exist NetCraftGames starts where your game ends. These must be true before step 1: - **Multiplayer already works.** Two people can play together over the internet. We never write or fix networking. - **There is a server program.** It runs on its own machine, without a window, on Linux x86-64. A game where one player is the server needs a dedicated server mode first. - **It does not depend on an online service for its server.** Photon, PlayFab, Steam, Firebase and similar services run their own cloud. - **Browser games** send WebSocket connections through our gateway. A Node.js 24 or Python 3.12 server is prepared with `ncg pack`, because our servers run your code but never install packages. [Check if your game qualifies](https://netcraftgames.com/can-you-host-my-game/): five questions, about two minutes, nothing uploaded. If something is missing, it gives you the one change and a prompt for your AI. ## The five steps 1. **Submit your game.** Choose your engine and transport, then upload a Linux x64 server build as a `.tar.gz`, or connect an existing WebRTC adapter. Your game must already have working multiplayer networking; NetCraftGames hosts and configures it but does not write it. 2. **We read your code without running it.** A static, bounded reader inspects the archive and files for unsafe paths, size, embedded credentials, and the networking surface: engine, transports, ports, settings and health endpoint. An optional AI layer can explain what was found but cannot override the reader. Nothing you submit runs on the NetCraftGames control servers. 3. **You receive a connection configuration.** You get the address, port and protocol your game client must use, plus any proposed changes to your own config files. You review and apply them; nothing is changed in your project behind your back. 4. **We deploy within 24 hours.** The server starts on an isolated Linux machine in us-east-1. We verify the installed file hash, a health check and a game-level join probe. If a step fails, you receive an email with the problem and a concrete fix, and you resubmit. 5. **Players join.** Players connect with the configuration. Empty servers shut down automatically after ten minutes with no players when your server reports player counts, so you do not pay for idle hours. ## What you do and what we do | Stage | You | NetCraftGames | | --- | --- | --- | | Before submitting | Build a working Linux x64 dedicated server (or a WebRTC adapter) and test it with a client | Nothing. We do not write or fix your networking | | Intake | Upload the build and state engine and transport | Read the archive and files without running them, find ports and settings | | Configuration | Review and apply the proposed connection config in your project | Propose allowlisted changes only; you approve them | | Deploy | Rebuild your client with the config if needed | Start the server on an isolated machine, verify the installed hash, check health and a join probe | | Operate | Decide when it is awake or asleep, read reports | Meter usage, shut down empty servers, save state, email incidents | ## What happens after the server is live - **Wake and sleep.** You can wake or sleep a server from the dashboard. Waking reserves capacity first; sleeping saves your state and stops the machine. - **Idle shutdown.** If your server reports its player count, it is saved and shut down after ten continuous minutes with zero players. See [idle shutdown](https://netcraftgames.com/guides/idle-shutdown-empty-servers/). - **Usage.** Hours are weighted by server size. A standard server uses one hour per hour; startup is not counted. [Pricing](https://netcraftgames.com/pricing/) has the details. - **Incidents and player reports.** Failed health checks, failed saves and similar events become incidents. Player reports go to a review queue; there are no automatic bans. ## What it does not do NetCraftGames does not create multiplayer for a game that has none, does not certify that a game is bug-free or secure, does not run Windows or macOS servers, and does not relay WebRTC media. The [fact sheet](https://netcraftgames.com/facts/) lists every limit in one place. ## Where to go next Pick your engine on the [engines page](https://netcraftgames.com/engines/), read what [the AI reads and never does](https://netcraftgames.com/trust/), or see [what happens when a connection fails](https://netcraftgames.com/connection-failures/). ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [The 24-hour promise, with the conditions stated plainly](https://netcraftgames.com/24-hour-promise/): What NetCraftGames means by "online and server ready in 24 hours": a processing target, when the clock starts and pauses, exclusions and open questions. - [What the AI reads, and what it never does](https://netcraftgames.com/trust/): The exact boundaries of AI in NetCraftGames: what a static reader and optional AI see in your submission, and the things that never happen, with limits stated. - [What happens when a connection fails](https://netcraftgames.com/connection-failures/): When your game does not connect, NetCraftGames emails the exact problem and a concrete fix, then you resubmit. The 19 failures it detects and how each is fixed. --- # The 24-hour promise, with the conditions stated plainly > After launch, NetCraftGames aims to have a submission online and server ready within 24 hours of receiving it, or to email you the exact problem and fix. It is a processing target, not a guarantee, and the clock pauses only while the next move is yours. Draft wording until the Terms are published. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/24-hour-promise/* ## The promise in one sentence "Submit your multiplayer game and in 24 hours have it online and server ready." That is the NetCraftGames sub-line. This page says what it commits us to, and the answer is deliberately careful: the 24 hours is **a target for our processing time, counted from your submission**. It is paused while we wait for you to fix something only you can fix, and it keeps running if the problem is on our side. It is not a guarantee, and it depends on the launch checks being passed. > **Pre-launch: nothing has been measured** > > NetCraftGames has not deployed a customer game. No 24-hour result exists, and none is claimed. The conditions below are the design the product is built to, and the final wording will be set in the published Terms before launch. ## What happens inside the 24 hours A submission moves through five stages, and the owner can see which one it is in: **Received**, **Reading your code**, **Connection config ready**, **Deploying and checking**, and **Online and server ready**. Two more states exist for problems: **Waiting for your fix** (the clock is paused) and **Closed**. The operator is alerted when a submission nears its deadline, passes it or looks stuck. ## When the clock starts The clock starts at the moment of submission and never restarts. Time spent paused is added back to the deadline exactly, so you lose nothing and we gain nothing. ## When the clock pauses The clock pauses only when every blocking problem is the owner's to fix. These intake and verification failures are classed as the owner's: | Problem found | What it means in plain words | | --- | --- | | Archive invalid or unsafe | The upload is not a clean `.tar.gz`: unsafe paths, links or special permission bits | | Manifest invalid | The deployment manifest is malformed or names something unsupported | | No Linux x64 server | No Linux x86-64 server program was found in the upload | | Port not listening | The server did not open the port the manifest declares | | Health check failed | The server answered, but not with the declared health response | | Join check failed | The game-level join probe did not get the expected reply | | Hash mismatch | The uploaded file does not match its declared digest | | Server crashed at startup | The process exited while starting | | Wrong transport or engine | The declared engine or transport does not match your code | | Credentials in the upload | A secret was found inside the archive | | Build too large | The upload exceeds the size we accept | When you fix the problem and send a new release, the clock resumes from where it paused, and the dashboard is designed to show the exact time remaining. A failed submission can only be reopened by the operator, and submissions abandoned for a long time are closed. ## When the clock does not pause Problems on our side do not pause the clock. Timeouts and install failures whose cause is not yet known are treated as undetermined: they do not pause it either, and we escalate them to a human operator. ## What the promise is not - **Not a certification.** A running server does not prove your game is bug-free, fair or secure. No engine is certified by NetCraftGames until real test evidence is published. - **Not a guarantee.** It is a processing target. - **Not a guarantee that any build works.** If your networking is incomplete, the join check fails and you get a fix list instead of a running server. - **Not a capacity guarantee beyond your plan.** Hours, transfer and connection ceilings come from your plan. - **Not an uptime promise.** The 24 hours are about getting online. No uptime percentage is promised or published. ## What is still undecided - **The remedy for a missed window** is not defined yet. It will be published in the Terms before launch. - **Support hours** and response targets are an open launch gate. ## What you can do to hit the window 1. Build and test a Linux x64 dedicated server locally before submitting. The guides for [Unity](https://netcraftgames.com/guides/build-linux-dedicated-server-unity/), [Godot](https://netcraftgames.com/guides/godot-dedicated-server-export-checklist/) and [Unreal](https://netcraftgames.com/guides/unreal-linux-dedicated-server-checklist/) cover the common mistakes. 2. Make the server listen on `0.0.0.0` on the port you declare. 3. Add a health reply and a join probe so we can prove players can actually join. 4. Keep secrets out of the archive and read them from the environment. 5. Check the [connection config checklist](https://netcraftgames.com/guides/connection-config-file-contents/). ## Frequently asked questions ### When does the 24 hour clock start? At the moment you submit, and it never restarts. Time spent paused while you fix something is added back to the deadline exactly. It is a target for NetCraftGames processing time, not a guarantee. This is draft wording until the Terms are published, and NetCraftGames has not launched yet. ### Does the clock stop if my build has a problem? It pauses only when every blocking problem is yours to fix, such as an invalid archive, a wrong port or a failed join check. You receive an email with the problem and a concrete fix, and the clock resumes when your new release arrives. Problems on our side never pause it. ## Related pages - [What happens when a connection fails](https://netcraftgames.com/connection-failures/): When your game does not connect, NetCraftGames emails the exact problem and a concrete fix, then you resubmit. The 19 failures it detects and how each is fixed. - [How NetCraftGames takes your game online](https://netcraftgames.com/how-it-works/): How NetCraftGames takes your multiplayer game from submission to a running server in 24 hours: submit, AI reads, connection config, deploy, players join. - [Launch status: not accepting customers yet](https://netcraftgames.com/status/): NetCraftGames is pre-launch. See the 16 public launch checks that must pass, with real evidence, before checkout and server provisioning are switched on. --- # Pricing built on honest server hours > Three monthly plans, $49, $79 and $99, each include a fixed number of weighted server hours, transfer and storage. There is no unlimited always-on offer. Nobody is being charged yet: NetCraftGames is pre-launch. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/pricing/* ## The plans | Plan | Price per month | Published games | Standard server hours | Transfer | Storage | Connection ceiling | | --- | ---: | ---: | ---: | ---: | ---: | ---: | | Creator | $49 | 10 | 40 | 10 GiB | 10 GiB | 50 | | Maker | $79 | 25 | 80 | 25 GiB | 25 GiB | 100 | | Studio | $99 | 50 | 120 | 40 GiB | 50 GiB | 150 | > **Not yet purchasable** > > These are the plan settings built into the product today. Checkout is disabled until the launch checks pass, no charge has ever been made, and the numbers may change before launch. Join the [waitlist](https://netcraftgames.com/waitlist/) to be told when they are final. ## All plans at a glance | Plan | Price per month | Published games | Standard server hours | Transfer | Storage | Connection ceiling | | --- | ---: | ---: | ---: | ---: | ---: | ---: | | Creator | $49 | 10 | 40 | 10 GiB | 10 GiB | 50 | | Maker | $79 | 25 | 80 | 25 GiB | 25 GiB | 100 | | Studio | $99 | 50 | 120 | 40 GiB | 50 GiB | 150 | The connection ceiling is the number of simultaneous player connections a plan allows across browser WebSocket gateway sessions and WebRTC signaling. ## How weighted server hours work An hour is spent only while a server is running and verified ready. Startup time is not counted. A bigger server spends hours faster: | Server profile | Resources | Hours used per wall-clock hour | | --- | --- | ---: | | Standard | 2 vCPU, 4 GiB memory | 1 | | Large | 4 vCPU, 8 GiB memory | 2 | So 40 standard hours on the Creator plan is one standard server running about 1.3 hours a day for a month, or two or three servers for a short test weekend. It is not a month of always-on hosting. Plans with more hours cost less per hour, so the Studio plan is cheaper per hour than Creator if you use them. ## The capacity boost The **capacity boost** costs $19 one time and adds 20 standard server hours and 5 GiB of transfer ($0.95 per hour). Boost balances carry forward while your subscription is active. Hosting requires an active subscription. A boost costs more per hour than moving up a plan, on purpose: if you need extra hours every month, a bigger plan is cheaper. ## Rules that surprise people, stated up front - **Unused base hours expire** at renewal. Boost hours carry forward while the subscription is active. - **Hosting requires an active subscription.** Without one there is no capacity. - **No automatic overage purchase.** When hours run out, servers are saved and stopped rather than silently billed. - **No unlimited always-on.** Keeping a game awake spends prepaid hours. - **Idle shutdown protects your hours.** If your server reports player counts, it stops after ten continuous minutes with zero players. See [the idle shutdown guide](https://netcraftgames.com/guides/idle-shutdown-empty-servers/). - **Region.** Servers run in `us-east-1` only. ## Limits you should know about | Limit | Current value | | --- | --- | | Browser WebSocket gateway: largest frame | 64 KiB | | Browser WebSocket gateway: rate per connection | up to 120 messages and 2 MiB per second | | WebRTC signaling: largest message | 16 KiB | | WebRTC room size | 2 to 16 peers; rooms expire after two hours | | Idle shutdown | after 10 continuous minutes with zero players (needs player-count reporting) | | Region | us-east-1 only | ## Is this cheaper than renting a server yourself? Per raw hour, no. A bare cloud virtual machine costs less per hour than a plan hour, and if you are comfortable operating Linux servers, self-hosting can be the cheaper path. What the plan buys is the work around the machine: reading your submission, producing the connection config, deploying and verifying it, shutting down empty servers, saving state and emailing a concrete fix when something fails. See [alternatives compared](https://netcraftgames.com/compare/) and the [cheap hosting guide](https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/) for the trade-offs. ## What is not decided yet Refund and cancellation terms, tax handling and the support commitments will be in the Terms before launch. The draft [Terms](https://netcraftgames.com/terms/) are not final. ## Frequently asked questions ### How much does NetCraftGames cost? The plans are Creator at $49 a month, Maker at $79 and Studio at $99, plus a one-time $19 capacity boost. They are product settings, not live prices: nobody can buy them yet because NetCraftGames is pre-launch. Join the waitlist to be told when pricing is final. ### What is a weighted server hour? It is one hour of a running, verified-ready server, multiplied by the server's size. A standard server of 2 vCPU and 4 GiB uses one hour per hour; a large server of 4 vCPU and 8 GiB uses two. Startup time is not counted, and sleeping servers use nothing. ### Is there an unlimited plan? No. Every plan has a fixed number of weighted server hours, and keeping a game awake spends them. Unused base hours expire at renewal. When hours run out, servers are saved and stopped instead of being billed automatically, because no automatic overage purchase exists. ## Related pages - [Idle shutdown: why paying for empty servers is waste](https://netcraftgames.com/guides/idle-shutdown-empty-servers/): Why paying for empty game servers is waste, how much it costs in hours, how idle shutdown works safely, and what your server must report for it to work. - [How to host a multiplayer game server cheaply](https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/): Honest ways to host a multiplayer game server cheaply: stop idle hours, right-size, mind egress, use free tiers and decide when managed hosting is worth it. - [Multiplayer hosting alternatives, compared fairly](https://netcraftgames.com/compare/): A fair, dated comparison of NetCraftGames with Unity Multiplay, Edgegap, Amazon GameLift, PlayFab, Photon and self-hosting, using only sourced facts. --- # Multiplayer hosting alternatives, compared fairly > NetCraftGames is a small, managed lane for already-networked indie games. Larger platforms scale further and several are cheaper per hour. This page compares what each does using only facts we could source, each dated October 3, 2026. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/compare/* ## How to read this page Providers are listed by what they actually are, because "game server hosting" covers four different jobs: running your dedicated server for you, providing a networking library, orchestrating fleets, and renting raw machines. Prices are quoted only where the provider published them, in the provider's own units, with the access date. Units are not equivalent, so do not divide one by another. Where a fact could not be verified, it is left out. > **Our bias** > > NetCraftGames is one of the services compared. We have tried to say plainly where it is the wrong choice. If a statement here is out of date, the [source](#sources-h) is linked so you can check it. ## At a glance | Option | What it is | You manage | Billing basis (as published) | | --- | --- | --- | --- | | NetCraftGames | Managed hosting and configuration for an already-networked game; pre-launch | Your game build and client; we do config, deploy, operate | Monthly plans of weighted server hours, $49 to $99 (not yet charged) | | Unity Multiplay Game Server Hosting | Unity's hosting service, wound down | n/a | Operated through March 31, 2026 | | Edgegap | Orchestration and on-demand hosting at many locations | Container build, integration | Per vCPU-minute and egress, plus a limited free trial | | Amazon GameLift Servers | AWS managed fleets, containers or your own machines | Server SDK integration, fleet and scaling setup | Per instance duration, billed per second with a one-minute minimum | | PlayFab Multiplayer Servers | Azure-based pool of custom game servers | Server build, scaling settings | VM hours and network egress, with a limited free evaluation | | Photon (PUN, Fusion, Realtime) | Networking library plus cloud relay | Your game uses their networking | Concurrent connected users (CCU) | | Self-hosting on a VM | Rent a machine yourself | Everything | Provider's hourly VM and bandwidth rates | ## What each one is good at ### Unity Multiplay Game Server Hosting Unity announced it was winding down direct support for Multiplay Game Server Hosting and operated the service through March 31, 2026. Unity said it licensed the Multiplay Game Server Hosting software to Rocket Science Group, and that Matchmaker, Relay, Lobby and Distributed Authority are unaffected. If you were a Multiplay customer, you need a new host; NetCraftGames can be one only after it launches and only for builds in the [supported lanes](https://netcraftgames.com/engines/). ### Edgegap Edgegap's published pay-as-you-go rates were $0.00115 per vCPU per minute and $0.10 per GB of egress per month, with no idle charge, on its pricing page dated October 2, 2026. Its free trial lists one app with two versions, up to 1.5 vCPU and 3 GB, one concurrent deployment and a 60-minute uptime cap per deployment. It is the better choice when you need many global locations and orchestration at match scale. ### Amazon GameLift Servers GameLift offers managed EC2 fleets, container deployments and an "Anywhere" option for machines you manage. AWS documents that you integrate the GameLift server SDK into your game server. Instances are billed by duration, per second, with a one-minute minimum. It is the better choice for large-scale, autoscaling, multi-region fleets and teams already on AWS. ### PlayFab Multiplayer Servers PlayFab's billing documentation says Multiplayer Servers are billed on consumption: VM instance hours and network egress, with a limited free evaluation (750 Dasv4 core hours in East US and North Europe and a 24-core cap). Microsoft notes that standby capacity typically adds about 20 percent to required compute hours. It is a strong fit for Azure and Xbox-adjacent teams that want scaling pools. ### Photon Photon is a different category: a networking library and cloud relay. The PUN pricing page lists a free tier of 20 concurrent connected users and paid tiers priced by concurrent users rather than server hours. If you build on Photon, you do not need dedicated server hosting for that networking. If your game uses Mirror, NGO, Unreal or Godot networking, Photon does not replace it. ### Self-hosting on a VM Renting a cloud or VPS machine is usually the cheapest per hour and the most flexible. You also own patching, firewalls, the process supervisor, TLS for WebSockets, idle shutdown, backups and being awake when it breaks. The [cheap hosting guide](https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/) covers this path honestly. ## When NetCraftGames is the wrong choice - You need **Windows or macOS** server builds, or **arm64**. NetCraftGames hosts Linux x64 only. - You need **many regions** or match-scale autoscaling. NetCraftGames runs in `us-east-1` only. - You need a **TURN relay** for restrictive networks. We offer signaling only. - You need **universal anti-cheat** or automatic bans. We provide neither. - You need a **published uptime commitment today**. We have no measurements to publish. - You need to start **now**. NetCraftGames is not accepting customers yet. ## When it may be the right choice - You have a working Linux server build and no appetite for operating servers. - You want a connection config and an explanation of any failure, not a dashboard of knobs. - Your game is small enough that weighted hours per month, not match-scale fleets, is the right unit. ## Frequently asked questions ### What are good alternatives to Unity Multiplay? Unity wound down Multiplay Game Server Hosting on March 31, 2026 and licensed the software to Rocket Science Group. Alternatives include Edgegap, Amazon GameLift, PlayFab Multiplayer Servers and renting your own machine. NetCraftGames is a small managed option for Linux x64 builds, but it is not accepting customers yet. ### Is NetCraftGames cheaper than Edgegap or GameLift? Not per hour. Edgegap and GameLift publish per-minute or per-second compute rates, and bare machines cost less per hour than a NetCraftGames plan hour. NetCraftGames sells configuration, deployment, idle shutdown and failure help bundled into monthly plans. Units differ, so compare your own expected hours before deciding. ## Sources - [Unity Discussions: End of services (Multiplay wind-down)](https://discussions.unity.com/t/end-of-services/1698428), accessed 2026-10-03 - [Edgegap pricing](https://edgegap.com/resources/pricing), accessed 2026-10-03 - [Amazon GameLift Servers FAQs](https://aws.amazon.com/gamelift/servers/faqs/), accessed 2026-10-03 - [Amazon GameLift Servers pricing](https://aws.amazon.com/gamelift/servers/pricing/), accessed 2026-10-03 - [Microsoft Learn: Billing for PlayFab Multiplayer Servers 2.0](https://learn.microsoft.com/en-us/gaming/playfab/multiplayer/servers/billing-for-thunderhead), accessed 2026-10-03 - [Photon PUN pricing](https://www.photonengine.com/pun/pricing), accessed 2026-10-03 ## Related pages - [Pricing built on honest server hours](https://netcraftgames.com/pricing/): NetCraftGames plans are $49, $79 and $99 a month for weighted server hours, with a $19 boost. What an hour buys, what expires and what is not included. - [How to host a multiplayer game server cheaply](https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/): Honest ways to host a multiplayer game server cheaply: stop idle hours, right-size, mind egress, use free tiers and decide when managed hosting is worth it. - [Frequently asked questions about NetCraftGames](https://netcraftgames.com/faq/): Direct answers to 27 questions about NetCraftGames: engines, pricing, the 24-hour target, safety, AI, TURN, Windows servers and launch status. --- # What happens when a connection fails > If your server will not start, will not answer or players cannot join, NetCraftGames does not just say "failed". It emails the specific problem, likely causes, concrete fix steps and an example, tells you whether the clock is paused, and you resubmit a new release. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/connection-failures/* ## The short answer Every failure NetCraftGames can detect maps to a fixed, tested piece of advice: the problem in plain words, likely causes, numbered fix steps, a code or command example and exactly how to resubmit. The advice is pre-written and fixed, not generated by a model on the fly, so it is the same every time and cannot be talked into saying something wrong. An optional AI layer may add an explanation on top, but never replaces it. ## What the email contains Each failure email is written to be read on a phone with no context. It says: 1. What it is about: which game and release. 2. Progress so far: which stages passed and which failed. 3. Why we are writing: what we need from you. 4. Full context: the problem, the likely causes and the evidence. 5. Options and a recommendation: what to fix first. 6. What happens next: how to resubmit and what the clock is doing. It never contains credential values. It is built only from failure codes, sanitized context, file names that passed a path sanitizer and fixed advice text, and a final check rejects anything shaped like a secret. ## The failures it detects | Failure | What it means | The usual fix | | --- | --- | --- | | Upload is not a safe `.tar.gz` | Unsafe paths, links, special permission bits, or too many entries | Repack with GNU tar from a clean folder with no links | | Manifest rejected | A required field is wrong or a probe uses an undeclared port | Copy the template for your engine and list every port | | No Linux x86-64 server found | Windows, macOS, ARM, source only, or a client build | Build a Linux x64 dedicated server and set the executable bit | | Port not listening | The server bound to `127.0.0.1`, or uses another port or protocol | Bind `0.0.0.0` on the declared port | | Health check failed | The server answers, but not with the declared reply | Add a cheap route or UDP reply and declare it exactly | | Join check failed | The game-level probe did not return the declared answer | Add an unauthenticated "accepting players" reply | | Hash mismatch | The file differs from the declared SHA-256 | Use the digest of the exact uploaded file | | Crash at startup | Missing library, wrong architecture, needs a display or GPU | Reproduce in a clean Linux container; use headless flags | | Wrong transport | Declared transport differs from the code | Declare what the server really listens on | | Engine mismatch | Declared engine differs from the code | Declare the engine you ship | | Credentials in the upload | A secret was packed into files | Rotate it, remove it, read it from the environment | | Build too large | Client assets, symbols or caches packed | Use a server build target and strip the folder | | Unsupported engine | An engine id that is not on the supported list | Use a listed lane; for your own raw TCP or UDP protocol choose Custom native TCP/UDP (direct) | | Declared stack not found (advice, never blocks) | A Unity build declared as Mirror or NGO holds none of those assemblies, a WebSocket declaration shows no WebSocket server, or the code is a custom native server | Declare Custom native TCP/UDP (direct) and supply a join probe, or ship the library you declared | | Needs a newer glibc than the worker image | A shipped Linux program or add-on was linked against a glibc newer than 2.39 | Rebuild on Ubuntu 24.04 or in an `ubuntu:24.04` container | | Networking not found | No server networking in what we could read | Upload the dedicated server build and declare ports by hand | | Unsafe startup script | Download-and-run, privileged or destructive commands | Launch a plain executable; ship everything in the archive | | WebSocket path unsupported | The code serves its WebSocket at a path such as `/ws` and the manifest declares no `wsPath` | Add `wsPath` (for example `"/ws"`) to the manifest, or accept upgrades at `/` | | WebSocket path does not match | The manifest's `wsPath` differs from the path the code serves (for socket.io, the fixed query is missing) | Make the two agree | | Project folder uploaded | Source files with `package.json` or `requirements.txt` and no start script | Run `ncg pack . --node --install` (or `--python`) and upload what it builds | | Packages missing (Node) | `package.json` lists dependencies but there is no `node_modules` | `ncg pack . --node --install` | | Packages missing (Python) | `requirements.txt` lists packages but no vendored wheels | `ncg pack . --python --install` | | Node version not supported | `engines.node` cannot be satisfied by Node 24 | Change `engines` to allow 24, or ship your own node in the archive | | Add-on built for another system | A `.node` or Python extension is for Windows, macOS, ARM or musl | Install with `ncg pack`, which asks for Linux x64 glibc builds only | | Add-on built for another Node | A native add-on (uWebSockets.js) was built for a different Node ABI | Use the add-on version that supports Node 24, or use `ws` | | Start script points at nothing | The launcher starts a file that is not in the archive | Fix the path in the launcher, or pack again | | Python wheel for another system | A Python extension is not cp312 manylinux x86_64 | `ncg pack . --python --install` | | Framework needs plain web requests | Colyseus (matchmaking over HTTP) | Move to plain WebSocket, or use a lane that fits | | Install scripts present (advice) | `package.json` has install or postinstall scripts | They never run on our servers; make sure the game does not depend on them | | Timeout | The server took too long to become ready | Open the socket first, load content after; reply if it repeats | ## A worked example: nothing was listening on UDP 7777 **Problem.** Your server process started, but UDP port 7777 did not accept traffic. **Likely causes.** It binds `127.0.0.1` instead of `0.0.0.0`; it uses a different port than the manifest declares; the manifest says UDP but the game opens TCP; or it needs longer than the wait time to load before opening its socket. **Fix.** Bind all interfaces on the declared port, make the start command pass the same port the code listens on, open the socket early in startup, and reproduce locally in a clean Linux container. For a Node server: ```javascript const port = Number(process.env.PORT ?? 7777); const wss = new WebSocketServer({ host: '0.0.0.0', port }); ``` ## Who has to fix it, and the clock Each failure is classed as the owner's, the platform's or undetermined. Only when every blocking problem is the owner's does the 24-hour clock pause; platform and undetermined problems keep it running and alert a human operator. See [the 24-hour promise](https://netcraftgames.com/24-hour-promise/). ## How to resubmit 1. Rebuild your server with the fix and upload the new `.tar.gz` to the same game. 2. Create a new release version, for example 1.0.3 to 1.0.4, with the new upload's digest, then choose Check. 3. Your clock resumes when the new release is received, and the dashboard shows the exact time remaining. ## What is not proven yet > **Pre-launch** > > Email delivery to real inboxes has not been observed end to end, and no customer has received one of these emails. Both are launch checks that must pass before NetCraftGames opens. See [launch status](https://netcraftgames.com/status/). ## Frequently asked questions ### What happens if my game server will not connect? NetCraftGames emails you the specific problem, the likely causes, numbered fix steps with an example, and whether the 24 hour clock is paused. You fix the build, upload a new release and the clock resumes. The advice comes from a fixed table of known failures, so it is consistent and never invents a diagnosis. ### Do failure emails ever include my passwords or keys? No. Failure emails are built only from failure codes, sanitized context, vetted file names and fixed advice, and a final check blocks anything shaped like a secret. If credentials are found in your upload, the email names the kind and file, never the value, and tells you to rotate them. ## Related pages - [The 24-hour promise, with the conditions stated plainly](https://netcraftgames.com/24-hour-promise/): What NetCraftGames means by "online and server ready in 24 hours": a processing target, when the clock starts and pauses, exclusions and open questions. - [What the AI reads, and what it never does](https://netcraftgames.com/trust/): The exact boundaries of AI in NetCraftGames: what a static reader and optional AI see in your submission, and the things that never happen, with limits stated. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. --- # What the AI reads, and what it never does > A static reader that never runs your code is the source of truth about your submission. An optional AI layer can only add explanations on top. The AI cannot execute code, change your game, spend money, ban a player or certify safety, and it sees only bounded, redacted facts. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/trust/* ## The short answer NetCraftGames separates **reading** from **deciding**. Reading your submission is done by a static, bounded reader that matches fixed patterns and executes nothing. An optional AI layer sits on top: it can explain what the reader found, but the reader is the source of truth. Every pass or fail decision, every limit and every charge is made by ordinary deterministic code. The AI has no tools. > **Plain wording on "AI reads your code"** > > Our tagline flow says an AI reads your code. Precisely: a static reader extracts the networking surface (engine, transports, ports, settings, health endpoint, save paths); AI may explain what it found. We would rather say that than overstate what an AI does. ## What is read | Reader | What it looks at | How it is bounded | | --- | --- | --- | | Static reader | Archive entries, config and script text, embedded strings in binaries, file names that show a Unity player layout, and the glibc version numbers a Linux program declares it needs; engine, transports, ports, settings, health route, save paths, admin interface, embedded credentials | Limits on entries, file sizes, lines and findings; never extracts to disk, compiles, executes or fetches over a network | | Archive inspector | Archive metadata without extraction | Blocks traversal, links, special permission bits, oversize and compression bombs; text scan limited to selected files | | Optional AI layer | Bounded, redacted facts | Needs account opt-in and operator enablement; no tools; output validated against a strict schema | ## What the AI never does - **Never executes your code** on the NetCraftGames control servers, and has no way to run anything. - **Never changes your game or your project.** Configuration changes are proposals touching an allowlist of existing network and runtime settings, and you apply them. Proposals never add scripts or networking code. - **Never buys capacity, spends money or sends email.** Billing, reservations and notifications are deterministic code. - **Never bans or reports a player.** Player reports go to a review queue for a human. - **Never certifies that your game is safe, fair or bug-free.** Output that claims code safety is rejected, and a passed static scan is not a sandbox or an antivirus guarantee. - **Never gets high confidence.** Its results can only be marked low or medium, and are shown as advisory next to the original evidence. - **Never has the last word.** Original evidence stays authoritative. ## What the AI is shown When you opt in to AI analysis of an incident, the model receives at most twelve short facts: a redacted incident title and recorded facts, each limited to 1,000 characters. You can preview the exact text before anything is sent. It is **not** sent: email addresses, account names, payment data, build archives, source files, manifests, command lines, environment variables, runtime credentials, artifact URLs or raw log collections. Redaction removes URLs, common credential assignments, private-key blocks, tokens, email and IP addresses, but pattern redaction cannot catch everything, so do not paste secrets into incident text. Opting out stops new disclosure; it cannot recall a request already sent. ## Secrets you did not mean to ship If a credential is found in your upload, the report names its kind, file and variable, never its value. Values are not stored. You are told to rotate it, and where your code reads a secret from an environment variable, you supply the value in a write-only slot. If your game declares an admin or RCON interface that reads its credential from a declared variable, one random credential is created for the game and shown to you once. It stays the same every time your server wakes until you rotate it. We keep a hash to check it and an encrypted copy so every start can use the same value; the copy is deleted when you rotate or erase the game, and it is never shown again, emailed or sent to an AI model. If you lose it, rotate to get a new one. ## Isolation, as designed - One isolated virtual machine per running game; no customer code runs on the controller. - Game processes run unprivileged with resource limits; workers carry no cloud role and cannot read instance metadata. - Customer records are scoped by tenant. Uploads and probes use bounded, validated inputs. ## What is not proven yet > **Be skeptical of any security claim that has no evidence** > > These designs are implemented and tested locally. They have **not** been through an independent penetration test, and the guest isolation, firewall and storage-limit controls still need acceptance testing on real Linux machines. NetCraftGames holds no security certification. The launch checks that cover this are listed on the [status page](https://netcraftgames.com/status/). ## Frequently asked questions ### Does an AI read my game's source code? A static reader reads the files you submit to find your networking setup, and it never executes anything. An optional AI layer can add explanations on top, but the reader is the source of truth. Nothing you submit runs on NetCraftGames control servers, and AI never decides whether a build passes. ### Can the AI change my game or spend my money? No. The AI has no tools. Configuration changes are proposals limited to allowlisted network settings that you review and apply. Billing, capacity and notifications are deterministic code with their own limits. The AI cannot buy hours, ban players, send email or certify that your game is safe. ## Related pages - [What happens when a connection fails](https://netcraftgames.com/connection-failures/): When your game does not connect, NetCraftGames emails the exact problem and a concrete fix, then you resubmit. The 19 failures it detects and how each is fixed. - [How NetCraftGames takes your game online](https://netcraftgames.com/how-it-works/): How NetCraftGames takes your multiplayer game from submission to a running server in 24 hours: submit, AI reads, connection config, deploy, players join. - [NetCraftGames fact sheet](https://netcraftgames.com/facts/): The canonical, dated fact sheet for NetCraftGames: what it is, who it is for, prices, limits, supported engines, what is not supported, SLA wording and contact. --- # The owner API, so your AI can act for you > NetCraftGames has built an owner API with scoped, revocable keys so the owner's own AI assistant can upload builds, check releases and wake or sleep servers, plus an OpenAPI description and a local MCP server. Money, account and secret actions stay with the human. None of it is live yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/owner-api/* ## The short answer Owners increasingly run their game with an AI assistant. NetCraftGames is designed so that assistant can do real work without being handed the keys to the business. An owner creates a scoped API key; the key can do only what its scopes allow; risky actions can require the owner's approval in the dashboard; and some things no key can ever do. The API exists in the product source and is tested locally. It is **not live**, because NetCraftGames is pre-launch. > **What is and is not available** > > Built and tested locally in the product source: the scoped key system, 45 API operations under /api/v1, human approvals, idempotency, an audit log, signed webhooks, a generated OpenAPI 3.1 description, a typed client and a local MCP server. **Not live:** there is no public endpoint, because NetCraftGames is pre-launch. The OpenAPI file and the MCP server are not published on this site or as packages yet. The API can also turn on the public [share page](https://netcraftgames.com/guides/share-your-game-with-players/) for a game, set its title and website link, and replace the link. Setting the website link or replacing the link asks the owner first under the default key settings. ## What a key can be allowed to do Keys carry one or more of six scopes: | Scope | What it allows | | --- | --- | | `read:games` | Read games, releases, runtime status, connection configuration, build inventory and the service-level view | | `write:releases` | Create games, upload builds, submit releases, run release checks, publish, archive and prepare configuration changes | | `runtime:control` | Wake and sleep games (this spends prepaid hours) and manage the server admin credential where enabled | | `read:usage` | Read plan, prepaid balance, reservations and the usage ledger | | `read:incidents` | Read incidents, player reports, activity and notification history; request AI analysis of an incident | | `manage:settings` | Change notification and automation preferences, allowed client origins, report triage and webhooks | ## What no key can do There is no route for these, so no scope can reach them: - Buy capacity or boosts, or start a checkout or billing portal session. - Change the account email, password or multi-factor settings. - Delete the account or a game. - Create, edit or list API keys. - Read session cookies or any agent, provider or encryption secret. - Download builds or saved game data. ## Safety rails around every key - **Shown once, stored hashed.** A key is displayed a single time when created. Keys start with `ncg_live_` so secret scanners can recognise them. - **Narrowed on purpose.** A key can be limited to chosen games and to an IP allowlist, and it expires. - **Limits.** Per-minute rate limits, a daily cap on counted actions, and a daily cap on how much prepaid time the key can spend. - **Human approval.** For irreversible, high-risk or time-spending calls, the API answers that approval is required instead of acting. The owner opens the dashboard, reads a plain-language summary and approves or denies. On approval the **server** runs exactly the parameters stored at request time, so the AI cannot change them afterwards. - **Idempotency.** Every mutating request needs an idempotency key, so a retry cannot buy or wake twice. - **Audit.** Calls are recorded in an audit log the owner can read. - **Untrusted text is labelled.** Incident titles, player reports and similar free text are marked untrusted in the API description, so an AI client does not follow instructions hidden in them. - **Signed webhooks.** Events such as release checks passing or failing, servers going online or stopping, incidents and service-level warnings can be delivered to the owner's endpoint, signed with a timestamp tolerance. ## How an AI finds and learns the API | Mechanism | Status | | --- | --- | | `llms.txt` and per-page Markdown on this site | Available now: [llms.txt](https://netcraftgames.com/llms.txt) | | Machine-readable fact sheet | Available now: [fact sheet](https://netcraftgames.com/facts/) and [facts.json](https://netcraftgames.com/facts.json) | | OpenAPI 3.1 description, generated from the same route table the server uses | Built; will be served by the application at launch, not published here | | MCP server | Built as a local stdio server that runs on the owner's own machine with their key; not yet published | | Typed client | In the repository; not yet published as a package | ## The MCP server in plain words The MCP server lets an assistant such as Claude Desktop, Claude Code or Codex work with an owner's account through the same API and the same key limits. It has read tools (games, status, connection config, usage, incidents, activity, audit), write tools (create a game, upload a build, create and check a release, publish, wake and sleep, propose and apply configuration changes, set allowed origins) and two admin tools that are **off by default**. It can be started in read-only mode. Third-party text such as player reports is labelled as data the assistant must not obey, and an "owner approval required" answer is passed to the human and never retried. Because it is a local program and not a hosted service, it has no network address, so there is no remote MCP endpoint and no `/.well-known` discovery file on this site. We will publish a discovery file only if a remote MCP endpoint ever exists. ## What it means for you Give an assistant a key with the narrowest scopes it needs, set approvals to cover anything that spends hours, and keep the owner dashboard as the place where money and account decisions are made. See [what the AI reads and never does](https://netcraftgames.com/trust/) for the platform-side boundaries. ## Frequently asked questions ### Can my AI assistant buy more server hours with an API key? No. There is no API route that buys capacity or boosts, or that starts a checkout, so no scope can reach it. A key can wake and sleep servers, which spends prepaid hours already in your plan, and those calls have daily caps and can require your approval in the dashboard. ### Does NetCraftGames have an MCP server? Yes, in the product source: a local stdio MCP server that an owner runs on their own machine with an API key, exposing the same operations and limits as the owner API. It is not published yet and the API is not live, because NetCraftGames is pre-launch. There is no remote MCP endpoint. ## Related pages - [What the AI reads, and what it never does](https://netcraftgames.com/trust/): The exact boundaries of AI in NetCraftGames: what a static reader and optional AI see in your submission, and the things that never happen, with limits stated. - [How NetCraftGames takes your game online](https://netcraftgames.com/how-it-works/): How NetCraftGames takes your multiplayer game from submission to a running server in 24 hours: submit, AI reads, connection config, deploy, players join. - [NetCraftGames fact sheet](https://netcraftgames.com/facts/): The canonical, dated fact sheet for NetCraftGames: what it is, who it is for, prices, limits, supported engines, what is not supported, SLA wording and contact. --- # Frequently asked questions about NetCraftGames > Short, direct answers about what NetCraftGames does, what it costs, what it will not do and where it stands. Each answer is written to stand alone, and every number comes from the product itself. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/faq/* ## Basics ### What is NetCraftGames? NetCraftGames, also written NCG, is a managed multiplayer game server hosting service. An owner submits a game that already has working networking; NetCraftGames reads it, produces a connection configuration, deploys it on an isolated Linux server and operates it. It is run by Charging Bull Software and is pre-launch. ### Who is NetCraftGames for? It is for game developers and studios, called owners in the product, whose game already has working multiplayer networking and who would rather not run servers. Their customers are players. It suits small and indie games on Unity, Unreal, Godot or the browser, not match-scale titles that need many regions. ### Is NetCraftGames available today? No. It is pre-launch and not accepting customers or charging anyone. Checkout and server provisioning stay disabled until a published list of launch checks passes. You can join the waitlist by email, and the status page lists what remains before the doors open. ### Which game engines does NetCraftGames support? It is designed for Unity Mirror, Unity Netcode for GameObjects, Unreal Engine replication, Godot ENet and WebSocket, browser WSS servers and WebRTC signaling. Dedicated servers must be Linux x64 builds. No engine is certified yet, because certification needs real client and server test evidence that has not been published. ### Can NetCraftGames host a Unity Mirror server? Yes, by design, for a Mirror server built as a Linux x64 Unity dedicated server. It can use TCP, UDP or WebSocket transports. You declare the ports and add a health reply and join probe. It is not certified yet, and a real client join remains the proof you still need. ### Can NetCraftGames host an Unreal Engine dedicated server? Yes, by design, for a packaged Linux dedicated server. Epic requires a source build of Unreal Engine and a C++ project to produce one, so that work happens before you submit. Servers are often heavier, so the large profile, which counts as two hours per hour, may be needed. ### Can I host a Godot multiplayer server? Yes, by design. Export a Linux x86_64 server with Godot's dedicated server mode and run it headless. ENet over UDP suits native clients; WebSocketMultiplayerPeer suits browsers behind a wss gateway. WebRTC games use signaling rooms instead. The Godot lanes are not certified yet. ### Can NetCraftGames host a browser game server? Yes, if your game already talks to its own authoritative WebSocket server. Ship a Node.js 24 project, a Python 3.12 project or a Linux x64 program; `ncg pack` prepares the packages. Players connect over wss to our gateway, which ends TLS and checks the exact browser origins you list. The path you name in the manifest is fixed. ### Does NetCraftGames provide a TURN server for WebRTC? No. It provides room signaling only: offers, answers and ICE messages for rooms of two to sixteen peers. STUN discovers addresses but cannot relay data, so peers behind restrictive networks may fail to connect. TURN will not be offered until metering and real connectivity testing exist. ### Will my game work with NetCraftGames? It will if its multiplayer already works and it has a server program that runs without a window on Linux. Single-player games, games where one player hosts, and games built on Photon or PlayFab are not a fit today. [Five questions](https://netcraftgames.com/can-you-host-my-game/) give Yes, Almost with one change, or Not yet. Nothing is uploaded. ### How do I give players a link to my game? Turn on Share with players on your game's page in the dashboard. You get a link and a QR code to a page that shows whether the game is online and how many players are in it. It links to your game's website and does not host it. It is built and tested locally, not live. See the [share guide](https://netcraftgames.com/guides/share-your-game-with-players/). ### What do I need to submit? A Linux x64 dedicated server build packed as a tar.gz, the engine and transport you use, and a manifest naming the start command, ports, health check and ideally a join probe. Browser WebRTC games submit no archive. Your game must already have working multiplayer networking. ### Does NetCraftGames write my multiplayer code? No. It hosts and configures networking that already works. It reads your submission, proposes allowlisted configuration changes that you review, and never adds scripts or networking code. If no server networking is found in what you submit, you receive an email explaining what to upload or declare instead. ### Can NetCraftGames run Windows or macOS servers? No. Dedicated servers run on Linux x64 virtual machines. Windows, macOS and arm64 server builds are not hosted. Client platforms such as Windows, Android and iOS can still connect to your Linux server. In Unity, build with the Linux Server platform; in Godot and Unreal, export for Linux. ### What does the 24 hour promise mean? After launch, NetCraftGames aims to get a submission online within 24 hours of receiving it, or to email you the exact problem and a concrete fix. It is a processing target, not a guarantee. The clock pauses only while the next step is yours, and the remedy for a missed target will be published in the Terms. ### How much does NetCraftGames cost? Plans are Creator at $49 a month, Maker at $79 and Studio at $99, with 40, 80 and 120 standard server hours, plus a one-time $19 boost of 20 hours. These are product settings, not live prices. Nobody can buy them yet because NetCraftGames is pre-launch. ### What is a weighted server hour? It is one hour of a running, verified-ready server multiplied by its size. A standard server with 2 vCPU and 4 GiB uses one hour per hour; a large server with 4 vCPU and 8 GiB uses two. Startup time is not counted, and a sleeping server uses nothing. ### Do I pay for servers when nobody is playing? Only until idle shutdown. If your server reports its player count, it is saved and stopped after ten continuous minutes with zero players, and hours stop being used. Servers that cannot report player counts must be put to sleep explicitly. The subscription itself is a fixed monthly price. ### Where are NetCraftGames servers located? Servers run in the AWS US East region, us-east-1, in northern Virginia. There is one region only. Players far from the eastern United States will see higher latency, and NetCraftGames is not the right choice if you need servers close to players on several continents. ### Does NetCraftGames run my code on its own systems? Never on the controller. Your build is inspected without being executed, and it runs only on an isolated virtual machine dedicated to your game, as an unprivileged process with resource limits. These controls are implemented and tested locally but still need acceptance testing on real Linux machines before launch. ### Does an AI read my game's code? A static reader reads your submission to find ports, settings and the networking surface, and it executes nothing. An optional AI layer can explain what was found, but the reader is the source of truth. The AI has no tools and cannot change your game, spend money or ban players. ### What happens if my game server will not connect? NetCraftGames emails you the specific problem, likely causes, numbered fix steps with an example and whether the 24 hour clock is paused. You fix the build, upload a new release, and the clock resumes. Advice comes from a fixed table of known failures, so it is consistent. ### Does NetCraftGames include anti-cheat? No. It does not claim universal anti-cheat and does not ban players automatically. Player reports go to a review queue for a person to decide. Your game's server logic remains responsible for fair play, so build authoritative checks into the server you submit. ### Can my AI assistant manage my servers? Yes, within limits, once the owner API is live. Scoped keys let an assistant upload builds, check releases and wake or sleep servers. No key can buy capacity, change account credentials, delete a game or download builds, and risky actions can require your approval in the dashboard. ### Is NetCraftGames a replacement for Unity Multiplay? It can be an alternative for builds in its supported lanes, after launch. Unity ended Multiplay Game Server Hosting on March 31, 2026 and says Relay, Lobby, Matchmaker and Distributed Authority are unaffected. NetCraftGames offers no matchmaking, it runs in one region, and it is not yet open. ### Does NetCraftGames offer matchmaking or lobbies? No. NetCraftGames runs your dedicated server and gives players its address. It does not provide matchmaking, lobbies or accounts for your players. Use your engine's services or your own for those. The WebRTC rooms it offers are signaling rooms for peer-to-peer games, not a matchmaking system. ### Can I use my own AWS account? No. NetCraftGames is self-service and runs your server on its own infrastructure; there are no customer AWS accounts to connect. If you need your servers inside your own cloud account, a bare virtual machine or a platform that supports bringing your own machines is a better fit. Not answered here? Read the [fact sheet](https://netcraftgames.com/facts/), the [glossary](https://netcraftgames.com/glossary/) or [contact us](https://netcraftgames.com/contact/). ## Related pages - [How NetCraftGames takes your game online](https://netcraftgames.com/how-it-works/): How NetCraftGames takes your multiplayer game from submission to a running server in 24 hours: submit, AI reads, connection config, deploy, players join. - [Pricing built on honest server hours](https://netcraftgames.com/pricing/): NetCraftGames plans are $49, $79 and $99 a month for weighted server hours, with a $19 boost. What an hour buys, what expires and what is not included. - [NetCraftGames fact sheet](https://netcraftgames.com/facts/): The canonical, dated fact sheet for NetCraftGames: what it is, who it is for, prices, limits, supported engines, what is not supported, SLA wording and contact. --- # Multiplayer hosting glossary > Short definitions of the terms used on this site, in plain English. In NetCraftGames, the owner is the game developer who is our customer, and players are the owner's customers. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/glossary/* ## Terms **Owner.** In NetCraftGames, the game developer or studio that is our customer. The owner submits the game and manages it. The owner's customers are players. **Player.** Someone who plays an owner's game. Players connect to the owner's server using a connection configuration. **Dedicated server.** A game server process that runs on its own machine with no player at its screen, and that all players connect to. Contrast with a listen server, where one player's game also acts as the server. **Listen server.** A multiplayer setup where one player's game instance is also the server. NetCraftGames does not host listen servers. **Headless.** Running without a window, graphics or audio device. Godot uses the `--headless` argument and Unity uses a Dedicated Server build or `-batchmode -nographics`. **Linux x64.** Linux on 64-bit x86 processors, also called x86-64. The only server platform NetCraftGames hosts. **Authoritative server.** A server that decides what really happened in the game, so clients cannot simply declare their own results. The basis of fair play. **Transport.** The network layer a game uses to send data: for example UDP, TCP, WebSocket or WebRTC. **UDP.** A network protocol that sends independent packets with no guaranteed delivery or order. Fast games use it because a lost packet does not delay newer ones. **TCP.** A network protocol that delivers data reliably and in order. A lost packet delays the data behind it. **WebSocket.** A browser-supported connection that runs over TCP and lets a page and a server exchange messages both ways. **WSS.** WebSocket over TLS, written `wss://`. A page served over HTTPS may only open WSS connections. **TLS termination.** Ending the encrypted connection at a gateway, so the server behind it can speak plain WebSocket. NetCraftGames' gateway terminates TLS for browser games. **Gateway.** The NetCraftGames service that accepts players' wss connections, checks the browser origin and forwards frames to the game server. **wsPath.** A setting in the manifest that names the path your WebSocket server answers at, such as /ws. You fix it when you release, and nothing a player sends can change it. See [the Node guide](https://netcraftgames.com/guides/node-websocket-server/). **Launcher.** The small start script, named server, that `ncg pack` writes for a Node or Python project. It starts your code with the server's Node or Python, and the manifest's command points at it. **Origin.** The scheme, host and port of the website a browser page was loaded from. The gateway allows only the exact origins an owner lists. **WebRTC.** A browser technology for direct peer-to-peer connections, including data channels that can be unreliable and unordered. **Signaling.** The exchange of offers, answers and ICE candidates that peers use to set up a WebRTC connection. It carries no game data. **ICE.** Interactive Connectivity Establishment, the process that tries to find a working network path between two peers, using STUN and TURN. **STUN.** A protocol that tells a client its public address and what kind of NAT it is behind. It does not relay data. **TURN.** A relay server that carries traffic between peers when a direct connection is impossible. NetCraftGames does not offer TURN yet. **NAT.** Network address translation, the router feature that lets many devices share one public address. Symmetric NATs often block direct peer connections. **ENet.** A reliable UDP networking library. Godot's `ENetMultiplayerPeer` uses it. **KCP.** A UDP-based reliable transport. It is the default transport in Mirror, typically on port 7777. **Mirror.** An open source networking library for Unity, with swappable transports such as KCP, Telepathy and SimpleWeb. **Netcode for GameObjects (NGO).** Unity's networking library for GameObjects. It uses the Unity Transport package, which runs over UDP. **Replication.** How Unreal Engine copies game state from the server to clients. **Manifest.** The deployment file that tells the host how to start and check your server: engine, transport, command, ports, probes, save path and shutdown. See [the config guide](https://netcraftgames.com/guides/connection-config-file-contents/). **Connection config.** What a player's client needs to reach the server: address, port, protocol, TLS and version, produced as a schema-checked JSON document that never contains secrets. **Health probe.** A declared check, over TCP, HTTP or UDP, that proves the server process is alive. **Join probe.** A game-level exchange with a known reply that proves a player could actually join, not just that a port is open. **Player probe.** A loopback endpoint returning a bounded player count as JSON, used for idle shutdown. **Idle shutdown.** Saving and stopping a server after ten continuous minutes with zero reported players, so empty servers do not use hours. **Standard profile.** A 2 vCPU, 4 GiB server that uses one plan hour per hour. **Large profile.** A 4 vCPU, 8 GiB server that uses two plan hours per hour. **Weighted server hour.** One hour of a running, verified-ready server multiplied by the profile's weight. Plans are measured in these. **Egress.** Data sent from the server out to the internet, which clouds usually charge for and plans cap. **Checkpoint.** A saved snapshot of a server's state taken during shutdown, verified before the machine is destroyed. **Protection hold.** A visible state where a machine is kept because a save or shutdown failed, instead of being deleted. **Launch gate.** A required check, with dated live evidence, that must pass before NetCraftGames accepts customers or provisions servers. **llms.txt.** A Markdown file at a site's root that tells AI systems what the site is and where its best pages are. **MCP.** Model Context Protocol, a standard way for AI assistants to call tools. NetCraftGames has a local MCP server for its owner API, not yet published. ## Related pages - [Frequently asked questions about NetCraftGames](https://netcraftgames.com/faq/): Direct answers to 27 questions about NetCraftGames: engines, pricing, the 24-hour target, safety, AI, TURN, Windows servers and launch status. - [Engines and transports NetCraftGames can host](https://netcraftgames.com/engines/): Which engines and transports NetCraftGames is built to host: Unity Mirror and NGO, Unreal, Godot ENet and WebSocket, browser WSS and WebRTC, with honest gaps. - [Guides for owners putting multiplayer online](https://netcraftgames.com/guides/): Practical, sourced guides for owners going live: Linux server builds, ports and firewalls, transports, idle cost, WebRTC signaling and connection configs. --- # NetCraftGames fact sheet > One canonical, dated page of exact facts about NetCraftGames for people and AI systems to quote: what it is, who it is for, plans and prices, limits, supported engines, what is not supported, service-level wording and contact. Last verified against the product source on October 3, 2026. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/facts/* ## How to cite this page Quote the table below exactly. Every number is read from the product's own plan and limit constants when this site is built, so it cannot drift from the product. The same data is available as [facts.json](https://netcraftgames.com/facts.json). If this page and any other page disagree, this page is correct and the other page has a bug; tell us at the contact address. ## Fact sheet | Fact | Value | | --- | --- | | Name | NetCraftGames (short name: NCG). Always written NetCraftGames, one word, capital N, C and G. | | What it is | A managed multiplayer game server hosting service. An owner submits an already-networked game; NetCraftGames reads the submission, produces a connection configuration, deploys it and operates it. | | Who it is for | Game developers and studios (called owners in the product) whose game already has working multiplayer networking and who do not want to run servers. Players are the owner's customers. | | Tagline | We do the heavy lifting so you don't have to. | | 24-hour target | Submit your multiplayer game and in 24 hours have it online and server ready. It is a processing target counted from submission, paused only while the owner fixes something, and not a guarantee. See the 24-hour promise page. | | Does my game qualify? | Five questions at https://netcraftgames.com/can-you-host-my-game/ give one of three answers: Yes, ready; Almost, with the one change to make; or Not yet. The answers are worked out in the visitor's browser and nothing is uploaded. Copy-paste prompts for the owner's AI are at https://netcraftgames.com/can-you-host-my-game/prompts/. It is a check of answers, not a certification. | | Launch status | Pre-launch. Not accepting customers. Checkout and provisioning stay disabled until the published launch gates pass. Waitlist only. | | Publisher | Charging Bull Software (https://cbullsoftware.click). | | Plans and prices (USD) | Creator $49/month (10 games, 40 standard hours, 10 GiB transfer, 10 GiB storage, 50 connection ceiling); Maker $79/month (25 games, 80 standard hours, 25 GiB transfer, 25 GiB storage, 100 connection ceiling); Studio $99/month (50 games, 120 standard hours, 40 GiB transfer, 50 GiB storage, 150 connection ceiling). Prices are product settings, not yet charged to anyone. | | Capacity boost | $19 one time: 20 standard server hours and 5 GiB transfer. Carries forward while the subscription is active. | | Weighted hours | A standard server (2 vCPU, 4 GiB) uses 1 hour per wall-clock hour. A large server (4 vCPU, 8 GiB) uses 2. Startup time is not counted. Unused base hours expire at renewal. No automatic overage purchase. No unlimited always-on plan. | | Idle shutdown | A server that reports zero players for 10 continuous minutes is saved and shut down. Servers that do not report player counts must be put to sleep explicitly. | | Region | us-east-1 (US East, N. Virginia) only. | | Supported lanes | Unity Netcode for GameObjects; Unity Mirror; Unreal replication; Godot ENet; Godot WebSocket / WebRTC; Browser WSS / WebRTC; Custom native TCP/UDP (direct). Dedicated servers must be Linux x64 builds. | | Custom native TCP/UDP lane | Supported as a direct TCP or UDP lane for configuration and deployment only. Players connect to the running server's public IP address and port. There is no gateway (no TLS termination, origin check or WebSocket relay). The owner supplies the application-level join probe, because an open port never certifies gameplay. Nothing about the game or its protocol is certified, and no custom native game has run on a live server yet. | | Owner API | Scoped-key owner API, an OpenAPI description and a local MCP server exist in the product source and are not live. No key can buy capacity, change account credentials, delete a game or download builds; risky actions can require human approval. | | WebRTC rooms | Managed signaling rooms of 2 to 16 peers. Signaling only: no TURN media relay is offered yet. | | Not supported | Windows or macOS server builds; arm64 server builds; TURN media relay; universal anti-cheat or automatic bans; host migration; writing or fixing your game's networking; unlimited always-on servers; customer-supplied cloud accounts; certification of any engine before real test evidence is published. | | Availability and SLA wording | No uptime percentage is promised and none is published, because no production measurements exist yet. Any service-level commitment will be published in the Terms before launch. | | Certifications | None. NetCraftGames holds no security or compliance certification and does not certify third-party games as safe. | | Customers and reviews | None yet. This site shows no customer quotes, star ratings or customer logos. | | Contact | contact@cbullsoftware.click | ## Limits | Limit | Current value | | --- | --- | | Browser WebSocket gateway: largest frame | 64 KiB | | Browser WebSocket gateway: rate per connection | up to 120 messages and 2 MiB per second | | WebRTC signaling: largest message | 16 KiB | | WebRTC room size | 2 to 16 peers; rooms expire after two hours | | Idle shutdown | after 10 continuous minutes with zero players (needs player-count reporting) | | Region | us-east-1 only | ## Plans | Plan | Price per month | Published games | Standard server hours | Transfer | Storage | Connection ceiling | | --- | ---: | ---: | ---: | ---: | ---: | ---: | | Creator | $49 | 10 | 40 | 10 GiB | 10 GiB | 50 | | Maker | $79 | 25 | 80 | 25 GiB | 25 GiB | 100 | | Studio | $99 | 50 | 120 | 40 GiB | 50 GiB | 150 | The **capacity boost** costs $19 one time and adds 20 standard server hours and 5 GiB of transfer ($0.95 per hour). Boost balances carry forward while your subscription is active. Hosting requires an active subscription. ## Supported lanes, as the product declares them | Engine or lane (from the product source) | Transports it can declare | Client platforms it can declare | | --- | --- | --- | | Unity Netcode for GameObjects | udp | windows, macos, linux, android, ios | | Unity Mirror | tcp, udp, websocket | windows, macos, linux, android, ios, web | | Unreal replication | udp | windows, macos, linux, android, ios | | Godot ENet | udp | windows, macos, linux, android, ios | | Godot WebSocket / WebRTC | websocket, wss, webrtc | windows, macos, linux, android, ios, web | | Browser WSS / WebRTC | wss, webrtc | web, android, ios | | Custom native TCP/UDP (direct) | tcp, udp | windows, macos, linux, android, ios | "Can declare" means the manifest validator accepts the combination. No lane is certified. The Custom native TCP/UDP (direct) row is a limited lane: configuration and deployment only, players connect directly to the running server's public IP and port with no gateway, and the owner supplies the application-level join probe because an open port never certifies gameplay. ## Entity naming The product is **NetCraftGames**, short form **NCG**. It is published by **Charging Bull Software**. In product language, the customer is the **owner** (the game developer) and the owner's customers are **players**. ## Machine-readable files - [llms.txt](https://netcraftgames.com/llms.txt) and [llms-full.txt](https://netcraftgames.com/llms-full.txt): site summary and full text for language models. - [facts.json](https://netcraftgames.com/facts.json): this fact sheet as JSON. - [sitemap.xml](https://netcraftgames.com/sitemap.xml) and robots.txt: crawling. - Every page has a Markdown twin: take its address, remove the trailing slash and add `.md`, for example `/pricing.md`. ## Related pages - [Pricing built on honest server hours](https://netcraftgames.com/pricing/): NetCraftGames plans are $49, $79 and $99 a month for weighted server hours, with a $19 boost. What an hour buys, what expires and what is not included. - [Launch status: not accepting customers yet](https://netcraftgames.com/status/): NetCraftGames is pre-launch. See the 16 public launch checks that must pass, with real evidence, before checkout and server provisioning are switched on. - [Engines and transports NetCraftGames can host](https://netcraftgames.com/engines/): Which engines and transports NetCraftGames is built to host: Unity Mirror and NGO, Unreal, Godot ENet and WebSocket, browser WSS and WebRTC, with honest gaps. --- # Launch status: not accepting customers yet > NetCraftGames is built and tested locally but is not accepting customers. Checkout and server provisioning stay off until sixteen launch checks pass with fresh, real evidence. On October 3, 2026, none has passed. This page is updated when that changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/status/* ## Where things stand > **Not open** > > NetCraftGames is **pre-launch**. No customer has been charged, no customer game has been hosted, and no uptime has been measured. You can join the [waitlist](https://netcraftgames.com/waitlist/). ## What exists today - A working application and its tests, run on a developer machine: dashboard, releases, checks, wake and sleep, usage, incidents, and reports. - Gated adapters for payments, email and cloud provisioning that refuse to act until launch checks pass. - A static reader for submissions, deterministic failure advice, and a 24-hour target tracker, tested locally. - A demo mode in which payments, machines, email and AI results are simulated and labelled as such. ## What does not exist yet - Any deployment to the internet, a purchased domain, or a live payment, email or cloud account. - Real tests with real engines and clients. Synthetic test results are not counted as evidence. - Uptime, support hours, a published remedy for a missed 24-hour target, or published Terms. ## The launch checks Each check needs recorded, hash-verified live evidence, tied to the exact release being launched, reviewed by a named person and no older than the stated limit. Expired evidence switches checkout and provisioning back off. A configuration switch alone cannot turn them on. | Launch check | Evidence must be no older than | Status on 2026-10-03 | | --- | ---: | --- | | Independent security testing: tenant isolation, upload attacks, sessions and virtual machine isolation | 7 days | Not yet passed | | Real cloud deployment: provisioning, joins, shutdown, saving and teardown on the approved account | 7 days | Not yet passed | | Real Unity NGO and Mirror dedicated servers with separate clients | 30 days | Not yet passed | | A real packaged Unreal Linux dedicated server with remote clients | 30 days | Not yet passed | | Real Godot ENet and WebSocket servers with separate clients | 30 days | Not yet passed | | Real browser sessions over wss, including origin and TLS checks | 30 days | Not yet passed | | Real Android and iOS devices, including network switching and rejoin | 30 days | Not yet passed | | Real payment, refund and cancellation handling, authorized by the owner | 7 days | Not yet passed | | Observed delivery of real account and incident emails | 7 days | Not yet passed | | A tested restore of the database and stored files | 7 days | Not yet passed | | Load and multi-day soak testing within declared limits | 7 days | Not yet passed | | External monitoring and a rehearsed incident response | 7 days | Not yet passed | | Terms, acceptable use and privacy disclosures approved | 90 days | Not yet passed | | Operating costs reviewed and a budget approved | 30 days | Not yet passed | | Data retention and deletion policy approved | 90 days | Not yet passed | | A support inbox, hours and response targets owned | 30 days | Not yet passed | | host-credential-delivery | 7 days | Not yet passed | | worker-runtime-policy | 30 days | Not yet passed | | metrics-capacity | 7 days | Not yet passed | | gateway-latency | 7 days | Not yet passed | | intake-sla | 7 days | Not yet passed | ## What will change this page When a check passes with real evidence, this table is updated with the date. Nothing here is a forecast of when that will be. If you want to be told, use the [waitlist](https://netcraftgames.com/waitlist/). ## Related pages - [The 24-hour promise, with the conditions stated plainly](https://netcraftgames.com/24-hour-promise/): What NetCraftGames means by "online and server ready in 24 hours": a processing target, when the clock starts and pauses, exclusions and open questions. - [Join the NetCraftGames waitlist](https://netcraftgames.com/waitlist/): Join the NetCraftGames waitlist by email. Tell us your engine and transport. No form, no account, no tracking. We will write when the doors open. - [NetCraftGames fact sheet](https://netcraftgames.com/facts/): The canonical, dated fact sheet for NetCraftGames: what it is, who it is for, prices, limits, supported engines, what is not supported, SLA wording and contact. --- # Join the NetCraftGames waitlist > NetCraftGames is not accepting customers yet. To be told when it opens, send one email naming your engine and transport. There is no form, no account and no tracking script on this site. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/waitlist/* ## How to join **Join the waitlist:** email contact@cbullsoftware.click (subject "NetCraftGames waitlist") with your engine and transport. No form and no account. See https://netcraftgames.com/waitlist/. Your email app opens with a message already addressed and a short template. Fill in your engine and rough peak player count, and send it. That is all. ## What we do with it - We use your address only to tell you when NetCraftGames opens, and we use the engines people name to decide which lanes to test first. - This site collects nothing itself: there is no form, cookie banner or analytics script, because there are none. Your email goes to a normal mailbox at Charging Bull Software. - Reply "remove me" at any time and we will delete your message. ## What the waitlist is not It is not a reservation, a place in a queue or a promise of a date. Pricing on the [pricing page](https://netcraftgames.com/pricing/) is not final, and the [status page](https://netcraftgames.com/status/) lists what has to pass first. ## Prefer to read first? Start with [how it works](https://netcraftgames.com/how-it-works/), the [engines](https://netcraftgames.com/engines/) or the [FAQ](https://netcraftgames.com/faq/). ## Related pages - [Launch status: not accepting customers yet](https://netcraftgames.com/status/): NetCraftGames is pre-launch. See the 16 public launch checks that must pass, with real evidence, before checkout and server provisioning are switched on. - [Pricing built on honest server hours](https://netcraftgames.com/pricing/): NetCraftGames plans are $49, $79 and $99 a month for weighted server hours, with a $19 boost. What an hour buys, what expires and what is not included. - [Engines and transports NetCraftGames can host](https://netcraftgames.com/engines/): Which engines and transports NetCraftGames is built to host: Unity Mirror and NGO, Unreal, Godot ENet and WebSocket, browser WSS and WebRTC, with honest gaps. --- # About NetCraftGames > NetCraftGames is a managed multiplayer game server hosting service published by Charging Bull Software. It exists so that a game developer with a working multiplayer build does not also have to become a server operator. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/about/* ## What we are NetCraftGames, also written NCG, is a product of **Charging Bull Software**, a software company that publishes tools and games. The logo is a hammer with NCG stamped into the head, because the job is heavy lifting: reading a submission, producing a connection configuration, deploying a server, watching it and explaining failures. Our tagline is "We do the heavy lifting so you don't have to." ## What we believe - **Say what is true.** The product is pre-launch, and every page says so. We do not publish customer counts, star ratings, customer quotes, uptime figures or certifications, because none exist. - **Name the limits first.** Linux x64 only, one region, no TURN relay, no universal anti-cheat, no unlimited always-on. - **Cite the sources.** Claims about other products carry a link and the date we read them. - **Deterministic code decides.** AI helps explain; it never decides pass or fail, never touches billing and never bans a player. ## Terminology The customer is the **owner**: the developer or studio that owns the game. The owner's customers are **players**. Marketing pages say "game developers" and "studios" so people searching can recognize themselves. ## Who publishes this This site is published by Charging Bull Software ([cbullsoftware.click](https://cbullsoftware.click)). Contact details are on the [contact page](https://netcraftgames.com/contact/). ## Related pages - [How NetCraftGames takes your game online](https://netcraftgames.com/how-it-works/): How NetCraftGames takes your multiplayer game from submission to a running server in 24 hours: submit, AI reads, connection config, deploy, players join. - [What the AI reads, and what it never does](https://netcraftgames.com/trust/): The exact boundaries of AI in NetCraftGames: what a static reader and optional AI see in your submission, and the things that never happen, with limits stated. - [Contact NetCraftGames](https://netcraftgames.com/contact/): Contact NetCraftGames by email for the waitlist, questions, corrections or press. Not accepting customers yet; support hours are not published. --- # Contact NetCraftGames > Email is the only channel. Use it for the waitlist, questions about the product, corrections to anything on this site, or press. Support hours and response targets are not published yet, because the service is not open. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/contact/* ## Email Write to **contact@cbullsoftware.click**, the Charging Bull Software contact mailbox, which is the address NetCraftGames uses until it has its own domain. Please do not send passwords, keys or private game files by email. ## What to expect - **Before launch:** replies are best effort. There is no support team or published response time yet. - **After launch:** support hours, severity targets and escalation will be published here and in the Terms. ## Found a mistake? If something on this site is out of date or wrong, tell us the page address and what is wrong. The [fact sheet](https://netcraftgames.com/facts/) is the page we keep most carefully current. ## Reporting a security problem Describe the problem in an email titled "Security". Do not include customer data and do not test against anything that is not yours: there is no live service to test yet. ## Related pages - [Join the NetCraftGames waitlist](https://netcraftgames.com/waitlist/): Join the NetCraftGames waitlist by email. Tell us your engine and transport. No form, no account, no tracking. We will write when the doors open. - [Launch status: not accepting customers yet](https://netcraftgames.com/status/): NetCraftGames is pre-launch. See the 16 public launch checks that must pass, with real evidence, before checkout and server provisioning are switched on. - [Frequently asked questions about NetCraftGames](https://netcraftgames.com/faq/): Direct answers to 27 questions about NetCraftGames: engines, pricing, the 24-hour target, safety, AI, TURN, Windows servers and launch status. --- # AI prompts to get your game ready for hosting > Each prompt is a block of plain text you paste into your AI coding assistant. It lists the facts about our servers, the exact changes to make and the proof to run. Start with the check, which tells you the one prompt that fits your game. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/* ## How to use a prompt 1. Answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/). It names the one prompt that fits. 2. Open that prompt, click inside the box to select the text and copy it. With JavaScript on there is also a copy button. 3. Paste it into your AI coding assistant, with your project open. Read what it changes. 4. Test with two real players. Then check again. Every prompt tells the AI to make only the listed changes, never to put a secret in code, to run the proof steps and show the real output, and to stop and ask when something would need a redesign. > **What "checked" means here** > > "Manifest checked" means the `ncg.json` settings inside the prompt pass the same validator the service uses, and every number in the text comes from the product's own constants. It does not mean an AI has followed the prompt and succeeded: that has not been measured yet. Prompts marked "Draft" also make claims about engine behaviour that no real build has proven. ## All prompts | Prompt | What it makes your AI do | Status | | --- | --- | --- | | [Find out what my project is](https://netcraftgames.com/can-you-host-my-game/#p-discover) | Makes your AI read the project, change nothing and print one JSON answer you can paste back into the checker. | Planning only | | [Node.js WebSocket server (ws)](https://netcraftgames.com/can-you-host-my-game/prompts/node-ws-hosting-basics/) | Gets a Node.js server that uses the ws library ready: health page, clean stop, packaging with ncg pack, ncg.json. | Manifest checked | | [Node.js with socket.io (WebSocket only)](https://netcraftgames.com/can-you-host-my-game/prompts/node-socketio/) | Makes a socket.io server work through the gateway: WebSocket-only transport and a fixed path in the manifest. | Draft | | [Move from Colyseus (or python-socketio) to plain WebSocket](https://netcraftgames.com/can-you-host-my-game/#p-node-migrate-to-ws) | Makes your AI write a migration plan first, wait for your approval, then replace the realtime layer with plain WebSocket. | Planning only | | [Python WebSocket server (websockets or FastAPI)](https://netcraftgames.com/can-you-host-my-game/prompts/python-ws-hosting-basics/) | Gets a Python server ready: health page, clean stop, packaging with ncg pack, ncg.json. | Draft | | [Unity: add a dedicated-server mode](https://netcraftgames.com/can-you-host-my-game/prompts/unity-dedicated/) | Makes your AI add a headless Linux server mode to a Unity project that uses Netcode for GameObjects or Mirror, and build it. | Manifest checked | | [Unity: build the server I have for Linux](https://netcraftgames.com/can-you-host-my-game/prompts/unity-linux-build/) | For a Unity dedicated server that exists only for Windows or Mac: makes your AI build it for Linux x86-64. | Draft | | [Unreal Engine: package a Linux dedicated server](https://netcraftgames.com/can-you-host-my-game/prompts/unreal-dedicated/) | Makes your AI package the Linux server target and add the health page and clean stop. | Draft | | [Godot 4: run as a dedicated server](https://netcraftgames.com/can-you-host-my-game/prompts/godot-dedicated/) | Makes your AI add a headless server start path for ENet or WebSocket, export it for Linux and add the health page. | Draft | | [Go, Rust, C#, C++ or Java server with its own protocol](https://netcraftgames.com/can-you-host-my-game/prompts/native-custom/) | Prepares a server with its own TCP or UDP protocol for the limited Custom native lane. | Draft | | [Browser game with WebRTC: use NetCraftGames room signaling](https://netcraftgames.com/can-you-host-my-game/prompts/webrtc-signaling/) | Connects a browser game that already uses WebRTC to our room signaling. We do not relay the game traffic. | Draft | | [Prove two players can play together](https://netcraftgames.com/can-you-host-my-game/#p-two-player-test) | Makes your AI write and run a test with two clients before anything is hosted. | Planning only | | [Plan multiplayer for my game (a plan, not code)](https://netcraftgames.com/can-you-host-my-game/#p-plan-multiplayer) | For single-player games or games on an online service: makes your AI write a design document, not code. | Planning only | | [Node.js with Express or Fastify and WebSocket](https://netcraftgames.com/can-you-host-my-game/prompts/node-hosting-basics-generic/) | Same as the ws prompt, with the Express and Fastify details. | Manifest checked | ## What no prompt can do A prompt cannot add multiplayer to a game that has none, cannot make a game that runs on an online service hostable, and cannot make Colyseus work through our gateway. The [check](https://netcraftgames.com/can-you-host-my-game/) says so before you start. The [glossary](https://netcraftgames.com/glossary/) explains the terms. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. - [How NetCraftGames takes your game online](https://netcraftgames.com/how-it-works/): How NetCraftGames takes your multiplayer game from submission to a running server in 24 hours: submit, AI reads, connection config, deploy, players join. --- # Engines and transports NetCraftGames can host > NetCraftGames hosts existing multiplayer games on two lanes: dedicated servers built for Linux x64 (plus a limited direct lane for custom TCP or UDP servers), and managed WebRTC signaling rooms. Seven engine and transport pages explain the real setup and the honest gaps. None is certified yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/engines/* ## The lanes **Dedicated server lane.** For Unity NGO or Mirror, Unreal replication, Godot ENet or WebSocket, and existing browser WSS servers. The server must already run on Linux x64 (a Node.js 24 or Python 3.12 project is packed with `ncg pack`) and accept players over the transport you declare. You upload an archive; we start it on an isolated machine, check its health and a game-level join probe, and give players an address. **Custom native TCP/UDP (direct), a limited dedicated lane.** For a server with its own raw TCP or UDP protocol and no supported engine library, for example a Unity game written on plain sockets with neither Mirror nor Netcode for GameObjects. It is supported for **configuration and deployment only**. Players connect straight to the running server's public IP address and port. There is no gateway: no TLS termination, no origin check and no WebSocket relay. You supply the join probe (a TCP banner probe where your server speaks first, or an HTTP or UDP exchange), because an open port never proves a player could join. Without that probe the release stays at "configuration needed". NetCraftGames does not certify the game, its protocol or its security, and no custom native game has been run on a live server yet. The [manifest guide](https://netcraftgames.com/guides/connection-config-file-contents/) shows the fields. **WebRTC signaling lane.** For existing browser and Godot WebRTC clients. We provide managed rooms and WebSocket signaling so peers can exchange offers, answers and ICE candidates. Your game owns the peer connection and the game state. **Signaling is not a TURN media relay**, and we do not claim restrictive-network connectivity. ## What the product can declare today | Engine or lane (from the product source) | Transports it can declare | Client platforms it can declare | | --- | --- | --- | | Unity Netcode for GameObjects | udp | windows, macos, linux, android, ios | | Unity Mirror | tcp, udp, websocket | windows, macos, linux, android, ios, web | | Unreal replication | udp | windows, macos, linux, android, ios | | Godot ENet | udp | windows, macos, linux, android, ios | | Godot WebSocket / WebRTC | websocket, wss, webrtc | windows, macos, linux, android, ios, web | | Browser WSS / WebRTC | wss, webrtc | web, android, ios | | Custom native TCP/UDP (direct) | tcp, udp | windows, macos, linux, android, ios | This table is generated from the product source. "Can declare" means the manifest validator accepts it. It does not mean it has been tested with a live game. ## Pick your engine - [Hosting a Unity Mirror dedicated server](https://netcraftgames.com/engines/unity-mirror/): Linux Server build over KCP, Telepathy or WebSocket transports. - [Hosting a Unity Netcode for GameObjects server](https://netcraftgames.com/engines/unity-netcode-for-gameobjects/): Linux Server build with Unity Transport over UDP. - [Hosting an Unreal Engine dedicated server](https://netcraftgames.com/engines/unreal-engine/): Packaged Linux server from a source-built engine, UDP 7777. - [Hosting a Godot ENet dedicated server](https://netcraftgames.com/engines/godot-enet/): Dedicated server export, run headless, ENet over UDP. - [Hosting a Godot WebSocket multiplayer server](https://netcraftgames.com/engines/godot-websocket/): WebSocketMultiplayerPeer for web exports, behind a wss gateway. - [Hosting a browser WebSocket (WSS) game server](https://netcraftgames.com/engines/browser-websocket/): Your own authoritative WebSocket server in Node, Python, Go or Rust. - [WebRTC signaling for browser and Godot games](https://netcraftgames.com/engines/browser-webrtc/): Room signaling for peer-to-peer games. No TURN relay. ## What "supported" means here > **Configuration is not certification** > > A release marked ready means its declared configuration passed static checks. Certification would need recorded clean-install, live-start, health, real player join and leave, save, idle, wake and shutdown evidence for that engine. That evidence has not been published for any engine, so NetCraftGames certifies none of them. Every engine page lists what you must provide and the gaps that remain. Common ones: the exact engine and package version, a headless start, a join probe, and a real client joining a real server. ## Things no lane does - Windows or macOS server builds, or arm64. - Writing or repairing your game's networking. - TURN media relay, host migration, or universal anti-cheat. - Running anything on a customer's own cloud account. See the [fact sheet](https://netcraftgames.com/facts/) for the full list and the [guides](https://netcraftgames.com/guides/) for build and port checklists. ## Get your server ready with an AI prompt Not sure your game fits? [Check if it qualifies](https://netcraftgames.com/can-you-host-my-game/) first. These copy-paste prompts make your AI add the server basics for each lane: [Unity](https://netcraftgames.com/can-you-host-my-game/prompts/unity-dedicated/), [Unity server built only for Windows or Mac](https://netcraftgames.com/can-you-host-my-game/prompts/unity-linux-build/), [Unreal Engine](https://netcraftgames.com/can-you-host-my-game/prompts/unreal-dedicated/), [Godot 4](https://netcraftgames.com/can-you-host-my-game/prompts/godot-dedicated/), [Node.js with ws](https://netcraftgames.com/can-you-host-my-game/prompts/node-ws-hosting-basics/), [Express or Fastify](https://netcraftgames.com/can-you-host-my-game/prompts/node-hosting-basics-generic/), [Python](https://netcraftgames.com/can-you-host-my-game/prompts/python-ws-hosting-basics/), [Node.js with socket.io](https://netcraftgames.com/can-you-host-my-game/prompts/node-socketio/), [browser WebRTC](https://netcraftgames.com/can-you-host-my-game/prompts/webrtc-signaling/) and [a server with its own protocol](https://netcraftgames.com/can-you-host-my-game/prompts/native-custom/). ## Related pages - [How NetCraftGames takes your game online](https://netcraftgames.com/how-it-works/): How NetCraftGames takes your multiplayer game from submission to a running server in 24 hours: submit, AI reads, connection config, deploy, players join. - [Frequently asked questions about NetCraftGames](https://netcraftgames.com/faq/): Direct answers to 27 questions about NetCraftGames: engines, pricing, the 24-hour target, safety, AI, TURN, Windows servers and launch status. - [Guides for owners putting multiplayer online](https://netcraftgames.com/guides/): Practical, sourced guides for owners going live: Linux server builds, ports and firewalls, transports, idle cost, WebRTC signaling and connection configs. --- # Hosting a Unity Mirror dedicated server > NetCraftGames is designed to host a Mirror server built as a Linux x64 Unity dedicated server, over TCP, UDP or WebSocket transports. It is not certified yet; a real client join remains the proof you still need. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/engines/unity-mirror/* ## Short answer Yes, for the design. A Mirror game can run on NetCraftGames if you ship a **Linux x64 dedicated server build** that already starts headless, listens on the port your transport uses, and accepts a real Mirror client. NetCraftGames deploys it on an isolated machine, checks health and a join probe, and gives players the address. Today it is pre-launch and no Mirror game has been certified. ## What Mirror transports mean for hosting Mirror lets you choose the transport, and the transport decides the protocol and port you declare. From the Mirror documentation: the KCP transport is UDP and defaults to port 7777, Telepathy is TCP, and the SimpleWeb transport carries WebSocket traffic for WebGL clients and defaults to port 7778. | Mirror transport | Protocol | Typical default port | Hosting note | | --- | --- | --- | --- | | KCP | UDP | 7777 | Declare UDP; give a UDP health reply or a TCP/HTTP join probe on another port | | Telepathy | TCP | set in the component | Declare TCP; the example manifest uses TCP 7777 and an HTTP join probe on 8080 | | SimpleWeb (WebSocket) | TCP, WebSocket | 7778 | Browser clients need `wss://`; see the [browser WSS page](https://netcraftgames.com/engines/browser-websocket/) | Declare only the port and protocol pairs your server really opens. A bare TCP connection does not prove a player can join, so provide a game-level join probe wherever you can. ## What you provide - A Linux x64 dedicated server build (see [the Unity build guide](https://netcraftgames.com/guides/build-linux-dedicated-server-unity/)), packed as `.tar.gz`. - The transport, the listen address `0.0.0.0` and the port, in your server code or `NetworkManager`. - A health reply, ideally a join probe, and optionally a loopback player-count endpoint so idle shutdown works. - No credentials inside the archive. Read secrets from the environment. ## Steps 1. **Build a Linux dedicated server.** In Unity open File > Build Profiles, add a Linux Server profile (Dedicated Server), switch to it and build. The result is a headless executable with no graphical interface. 2. **Bind to all interfaces on a fixed port.** Set your Mirror transport to listen on `0.0.0.0` and the port you will declare, for example UDP 7777 for KCP. Do not bind to `127.0.0.1`. 3. **Add a health reply and join probe.** Answer a health request on a declared port and add a game-level join probe that returns a known response, so we can prove a player could join rather than just that a port is open. 4. **Report player counts if you can.** Expose a loopback JSON endpoint such as `/players` returning a bounded count. Without it, idle shutdown cannot be confirmed and the server must be put to sleep explicitly. 5. **Pack and declare it.** Create a clean `.tar.gz` with no links or secrets, then declare the engine as Unity Mirror, the transport and the ports in the manifest. 6. **Submit and test with a real client.** After launch, submit the build, apply the proposed connection config to your client and join from a separate machine before telling players. ## Honest gaps - **Not certified.** Real Unity and Mirror versions, with separate clients, are still to be tested: install, concurrent join, state replication, reconnect and shutdown. - **Transport plugin compatibility** (for third-party Mirror transports) is not verified by a manifest check. - **WebGL clients** need SimpleWeb over TLS and are covered by the browser WSS lane, not by a UDP lane. - **Windows and macOS server builds** are not hosted. - **No anti-cheat.** Mirror's authority model is yours to get right. - **Not every Unity networking game is a Mirror game.** If your Linux build's `Managed/` folder holds no Mirror, Telepathy or kcp2k assembly because the server is written on plain sockets, declaring Mirror is wrong. The code reading says so in a non-blocking advisory, and the right choice is Custom native TCP/UDP (direct) on the [engines page](https://netcraftgames.com/engines/): configuration and deployment only, direct to the server's public IP and port with no gateway, and you supply the join probe. ## Frequently asked questions ### Which Mirror transport should I use for hosting? Use the transport your game already works with. KCP is UDP and suits most native clients; Telepathy is TCP; SimpleWeb carries WebSocket traffic for WebGL. NetCraftGames does not change your transport. Declare exactly the port and protocol pairs your server opens, and provide a join probe so a player join can be proven. ### Can NetCraftGames host a Mirror host-client game, not a dedicated server? No. NetCraftGames runs dedicated server builds on Linux x64, not player-hosted sessions. If your game only supports a listen server inside the client, you first need a headless dedicated server build. The Unity build guide explains how to produce one from the Linux Server platform. ## Sources - [Mirror documentation: Transports](https://mirror-networking.gitbook.io/docs/manual/transports), accessed 2026-10-03 - [Mirror documentation: KCP Transport](https://mirror-networking.gitbook.io/docs/manual/transports/kcp-transport), accessed 2026-10-03 - [Unity Manual: Build a Dedicated Server](https://docs.unity3d.com/6000.0/Documentation/Manual/dedicated-server-build.html), accessed 2026-10-03 ## Related pages - [Mirror server on the cloud: ports and firewall checklist](https://netcraftgames.com/guides/mirror-server-ports-firewall-checklist/): A practical ports and firewall checklist for running a Mirror dedicated server on a cloud machine: KCP, Telepathy and SimpleWeb ports, binding and testing. - [How to build a Linux dedicated server from Unity](https://netcraftgames.com/guides/build-linux-dedicated-server-unity/): Step by step: build a headless Linux dedicated server from Unity 6 with Build Profiles, bind it correctly, test it and pack it for hosting. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. --- # Hosting a Unity Netcode for GameObjects server > NetCraftGames is designed to host an NGO dedicated server built for Linux x64, using Unity Transport over UDP. NGO's matchmaking, Relay and Lobby services are separate and unaffected; this is about where the server process runs. Not certified yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/engines/unity-netcode-for-gameobjects/* ## Short answer Yes, by design. If your NGO game already runs as a **dedicated server on Linux x64** and listens with Unity Transport on a UDP port, NetCraftGames can host it: we deploy the build, verify it, and give your clients the address and port. Unity ended Multiplay Game Server Hosting on March 31, 2026, so NGO teams need somewhere else to run the server; NetCraftGames is one option once it launches. NGO, Relay, Lobby, Matchmaker and Distributed Authority are not affected by that change, per Unity. ## What to set in your project NGO reaches the network through the Unity Transport component. For a dedicated server you set the connection data so the server listens on all interfaces, for example: ```csharp var utp = NetworkManager.Singleton.GetComponent(); utp.SetConnectionData("0.0.0.0", 7777, "0.0.0.0"); NetworkManager.Singleton.StartServer(); ``` Clients connect to the public address and port from the connection configuration NetCraftGames gives you. Do not hard-code `127.0.0.1` in the server build. ## What you provide - A Linux Server build (File > Build Profiles > Linux Server), packed as `.tar.gz`. - The declared UDP port, a health reply and, ideally, a join probe. - A loopback player-count endpoint if you want automatic idle shutdown. - A save path under `/game/` if your server writes state we should preserve. ## Steps 1. **Build for Linux Server.** Use File > Build Profiles, add the Linux Server platform, switch the profile and build. The output is a headless executable such as `UnityServer.x86_64` with its data folder. 2. **Listen on 0.0.0.0.** Call `SetConnectionData("0.0.0.0", port, "0.0.0.0")` on the Unity Transport component in the server path and start with `StartServer()`. Pick one UDP port and keep it fixed. 3. **Add a health and join probe.** Reply to a small UDP or HTTP request on a declared port with a known answer, so a join is proven and not only a socket. 4. **Report players and saves.** Expose a loopback player-count endpoint, and write saves under `/game/saves`, so idle shutdown can save before it stops the machine. 5. **Pack it cleanly.** Run `tar -czf server.tar.gz .` from the build folder after confirming it contains no links, no executables you do not need and no secrets. 6. **Submit, apply the config, test.** After launch, submit the archive, apply the connection configuration to your client and join from another network before inviting players. ## Honest gaps - **Not certified.** The exact Unity and NGO package versions, a headless start, a client join and scene synchronization still need to be proven with real machines. - **UDP only in this lane.** The manifest example for NGO declares UDP. Unity WebGL clients using WebSockets are not a tested lane; see [browser WSS](https://netcraftgames.com/engines/browser-websocket/) for the browser path. - **Relay and Lobby** are Unity services you can keep using; NetCraftGames does not replace them. - **No anti-cheat** and no host migration. - **Not every Unity networking game uses Netcode for GameObjects.** If your Linux build's `Managed/` folder holds no `Unity.Netcode.Runtime` assembly because the server is written on plain sockets, the code reading raises a non-blocking advisory. The right choice is then Custom native TCP/UDP (direct) on the [engines page](https://netcraftgames.com/engines/): configuration and deployment only, direct to the server's public IP and port with no gateway, and you supply the join probe. ## Frequently asked questions ### Does NetCraftGames replace Unity Relay or Lobby? No. Relay, Lobby, Matchmaker and Distributed Authority are Unity services that Unity says are unaffected by the Multiplay wind-down. NetCraftGames only runs your dedicated server process on a Linux machine and gives clients its address. You can keep using Unity's services for matchmaking and lobbies alongside it. ### Which UDP port does an NGO server use? Whatever you configure. Samples commonly use 7777, but the port is set in your Unity Transport connection data and must match the port you declare to NetCraftGames. Keep it fixed, bind to 0.0.0.0, and make sure the declared UDP port is the one the server actually listens on. ## Sources - [Unity Manual: Build a Dedicated Server](https://docs.unity3d.com/6000.0/Documentation/Manual/dedicated-server-build.html), accessed 2026-10-03 - [Unity Discussions: End of services (Multiplay wind-down)](https://discussions.unity.com/t/end-of-services/1698428), accessed 2026-10-03 ## Related pages - [How to build a Linux dedicated server from Unity](https://netcraftgames.com/guides/build-linux-dedicated-server-unity/): Step by step: build a headless Linux dedicated server from Unity 6 with Build Profiles, bind it correctly, test it and pack it for hosting. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. - [How to host a multiplayer game server cheaply](https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/): Honest ways to host a multiplayer game server cheaply: stop idle hours, right-size, mind egress, use free tiers and decide when managed hosting is worth it. --- # Hosting an Unreal Engine dedicated server > NetCraftGames is designed to host a packaged Unreal Linux dedicated server over UDP. Epic requires a source build of the engine and a C++ project for dedicated servers, so the main work is yours before submitting. Not certified yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/engines/unreal-engine/* ## Short answer Yes, by design, for a **packaged Linux dedicated server** that already implements Unreal replication. Epic's documentation says a dedicated server needs a source build of Unreal Engine and a C++ project, with a `Server.Target.cs` file, and that a dedicated server listens on port 7777 by default. NetCraftGames deploys the packaged server, checks it, and gives clients the address. It has not been certified with a live Unreal game yet. ## What you must have before submitting - A source-built Unreal Engine and a C++ project with a server target. Blueprint-only projects cannot produce a dedicated server in the standard binary engine. - A Linux server package, cooked and staged, with a start script that takes the map and port. - Matching client and server versions. Replication across mismatched builds fails. - A UDP port declared in the manifest, usually 7777, plus a health reply and a join probe. Unreal servers tend to be heavier than a small Unity or Godot server. Our example manifest uses the large profile (4 vCPU, 8 GiB), which spends two plan hours per hour, so measure before you choose. ## Steps 1. **Build the engine from source and add a server target.** Follow Epic's dedicated server setup: use a source build of Unreal Engine, a C++ project and a `Server.Target.cs` file in the project Source folder. 2. **Package a Linux server.** Cook and stage the server for the Linux platform with the server-only option, then archive the output. Test the staged server with a separate client before moving on. 3. **Start with a fixed map and port.** Use a start script such as `./YourGameServer.sh /Game/Maps/Lobby -port=7777 -log`, and make sure the server is not bound to localhost. 4. **Add health and join probes.** Reply to a UDP health request and a join request with known answers on the declared port, so a join can be proven. 5. **Choose the profile.** Declare the standard profile if it runs well in 2 vCPU and 4 GiB, or the large profile if you measured a need. Large counts double against your hours. 6. **Pack, submit and test.** Pack the staged folder as a `.tar.gz` without links or secrets, submit after launch, and join from a client built from the same version. ## Honest gaps - **Not certified.** A packaged Linux server with remote replication clients, persistence and restart still needs real testing. - **We do not build your project.** You package it; we host the result. - **Map travel and large replicated worlds** are the owner's to verify. - **Client platforms** you declare are intent only; they are not tested by us. - **No anti-cheat**, no host migration, no Windows server builds. ## Frequently asked questions ### Can I host an Unreal dedicated server from a Blueprint-only project? Not with the standard launcher engine. Epic's dedicated server documentation requires a source build of Unreal Engine and a C++ project with a server target file. Once you have a packaged Linux server, NetCraftGames can host it, but producing that package is your step and is not something we do for you. ### Which port does an Unreal dedicated server use? By default, Epic's documentation says a dedicated server listens on port 7777. The transport is UDP. You can change the port with a launch argument such as -port, but whatever the server actually listens on must be the port you declare to NetCraftGames, and it must not be bound only to localhost. ## Sources - [Epic Games: Setting up dedicated servers in Unreal Engine](https://dev.epicgames.com/documentation/en-us/unreal-engine/setting-up-dedicated-servers-in-unreal-engine), accessed 2026-10-03 ## Related pages - [Unreal Engine Linux dedicated server checklist](https://netcraftgames.com/guides/unreal-linux-dedicated-server-checklist/): A checklist for packaging an Unreal Engine dedicated server for Linux: source build, server target, cook and stage, port 7777, start script, versions. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. - [Pricing built on honest server hours](https://netcraftgames.com/pricing/): NetCraftGames plans are $49, $79 and $99 a month for weighted server hours, with a $19 boost. What an hour buys, what expires and what is not included. --- # Hosting a Godot ENet dedicated server > NetCraftGames is designed to host a Godot 4 server exported for Linux x86_64 that uses ENetMultiplayerPeer over UDP. Export it in dedicated server mode, run it headless, and declare one UDP port. Not certified yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/engines/godot-enet/* ## Short answer Yes, by design. A Godot 4 game that already uses `ENetMultiplayerPeer` can run on NetCraftGames as a **Linux x86_64 headless server**: you export it with Godot's dedicated server mode, pack it, declare its UDP port, and we deploy it, check it and hand out the address. ENet is UDP, so browsers cannot use it; browser clients need the [WebSocket lane](https://netcraftgames.com/engines/godot-websocket/). ## What Godot gives you Godot's export documentation says to select the server export preset, open its Resources tab and choose "Export as dedicated server" mode, which adds the `dedicated_server` feature tag automatically. Since Godot 4.0 any binary also runs headless with the `--headless` argument. You can detect server mode in code with `OS.has_feature("dedicated_server")`. ## What you provide - A Linux x86_64 export in dedicated server mode, packed as `.tar.gz`. - A server that creates its peer on a fixed UDP port, for example `peer.create_server(8910, 32)`, then assigns it to `multiplayer.multiplayer_peer`. - A health and join reply on the declared UDP port, and a loopback player-count endpoint if you want idle shutdown. - The same Godot version for client and server. ## Steps 1. **Export a dedicated server.** In Project > Export add a Linux preset, open its Resources tab, choose Export as dedicated server, and export a Linux x86_64 binary with the export templates matching your editor version. 2. **Create the server on a fixed UDP port.** In the server path create an `ENetMultiplayerPeer`, call `create_server(port, max_clients)`, assign it to `multiplayer.multiplayer_peer` and skip all window, audio and input setup. 3. **Run headless and test locally.** Start `./server.x86_64 --headless` on a Linux machine and join with a real client from another computer before packing. 4. **Add health and join replies.** Answer a small UDP request on the declared port with a known string, so a join can be proven and not only a port. 5. **Report players and save under /game.** Expose a bounded loopback player-count endpoint and write saves under `/game/saves` so shutdown can checkpoint first. 6. **Pack and declare.** Archive the export folder as `.tar.gz` with no links or secrets, and declare the engine as Godot ENet with its UDP port and start command. ## Honest gaps - **Not certified.** The exact export template version, UDP reachability from real networks and an actual join still need live evidence. - **UDP only.** Players behind networks that block UDP cannot connect to an ENet server. - **Mobile.** Android and iOS clients are declared intent; suspension and rejoin are not tested. - **No anti-cheat** and no host migration. ## Frequently asked questions ### How do I export a Godot 4 dedicated server? Add a Linux preset in Project > Export, open the Resources tab and choose Export as dedicated server, which adds the dedicated_server feature tag. Export for Linux x86_64 with matching templates. Any Godot binary can also run headless with the --headless argument, which is how a server is started on a machine without a display. ### Can browsers connect to a Godot ENet server? No. ENet runs over UDP and browsers do not expose raw UDP to web exports. A Godot game with browser players needs WebSocket or WebRTC networking instead. NetCraftGames supports an existing Godot WebSocket server behind a wss gateway, and a WebRTC signaling lane, but it cannot convert ENet traffic for browsers. ## Sources - [Godot Docs: Exporting for dedicated servers](https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_dedicated_servers.html), accessed 2026-10-03 ## Related pages - [Godot dedicated server export checklist](https://netcraftgames.com/guides/godot-dedicated-server-export-checklist/): A checklist for exporting a Godot 4 dedicated server for Linux: export mode, headless start, ENet versus WebSocket, ports, saves and packing. - [WebSocket vs UDP for browser multiplayer](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/): Browsers cannot use raw UDP. Compare WebSocket, WebRTC data channels and native UDP for multiplayer games, and pick the right transport for your players. - [Hosting a Godot WebSocket multiplayer server](https://netcraftgames.com/engines/godot-websocket/): Host a Godot 4 WebSocket multiplayer server on NetCraftGames for browser and native clients: WebSocketMultiplayerPeer, wss through a gateway, and honest gaps. --- # Hosting a Godot WebSocket multiplayer server > NetCraftGames is designed to host a Godot 4 server that uses WebSocketMultiplayerPeer, so web exports can play. Browsers must connect over wss, and the gateway terminates TLS for you. Godot WebRTC games use the separate signaling lane. Not certified yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/engines/godot-websocket/* ## Short answer Yes, by design, for a Godot 4 server exported for Linux x86_64 that uses `WebSocketMultiplayerPeer`. Players on web exports connect over `wss://` to a NetCraftGames gateway, which terminates TLS and forwards frames to your server. Native clients can use WebSocket too, but ENet is the better transport for them. Godot WebRTC (`WebRTCMultiplayerPeer`) is a different lane: see [browser WebRTC](https://netcraftgames.com/engines/browser-webrtc/). ## Why WebSocket for the browser Browsers cannot open raw UDP sockets, so ENet is out for web exports. WebSocket works over TCP and is allowed from a page, but a page served over HTTPS may only open `wss://` connections. Godot's `create_server()` accepts a port, an optional bind address and optional TLS server options, which lets you terminate TLS yourself; on NetCraftGames the gateway does that for you, so your server can focus on the game. Read [WebSocket vs UDP](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/) for the trade-offs. ## What you provide - A Linux x86_64 dedicated server export that creates a `WebSocketMultiplayerPeer` server on a fixed TCP port. - A health reply (HTTP or TCP) and a join probe. - The exact browser origins that may connect, such as `https://yourgame.example`. Origin matching is exact. - A client that connects to the `wss://` address from your connection configuration. ## Steps 1. **Export a dedicated server.** Use Export as dedicated server in a Linux preset and export Linux x86_64, as in the ENet checklist. 2. **Create the WebSocket server.** Create a `WebSocketMultiplayerPeer`, call `create_server(port)` on a fixed TCP port, and assign it to `multiplayer.multiplayer_peer`. Leave TLS to the gateway unless your own setup needs it. 3. **Make the browser client use wss.** Connect with `create_client("wss://...")` using the address from your connection configuration. A plain `ws://` connection from an HTTPS page is blocked by the browser. 4. **Declare allowed origins.** List the exact website origins of your game page, for example `https://play.example.com`. Wildcards are not accepted. 5. **Add health and join probes.** Answer an HTTP request on a declared port with a known body so we can prove a join, then pack the export as a clean `.tar.gz`. 6. **Test in a real browser.** After launch, open your game page from a different network in more than one browser and join. ## Limits of the gateway | Limit | Current value | | --- | --- | | Browser WebSocket gateway: largest frame | 64 KiB | | Browser WebSocket gateway: rate per connection | up to 120 messages and 2 MiB per second | | WebRTC signaling: largest message | 16 KiB | | WebRTC room size | 2 to 16 peers; rooms expire after two hours | | Idle shutdown | after 10 continuous minutes with zero players (needs player-count reporting) | | Region | us-east-1 only | ## Honest gaps - **Not certified.** TLS termination, browser compatibility and a real browser join still need live evidence. - **Higher latency than UDP.** WebSocket is TCP, so a lost packet delays the packets behind it. - **Frame limits** apply to every message: keep game messages small. - **No anti-cheat**; origin checks stop other websites from using your server, not cheaters. ## Frequently asked questions ### Why does my Godot web export need wss? A page loaded over HTTPS can only open secure WebSocket connections, so a plain ws address is blocked as mixed content. With NetCraftGames, players connect to a wss address on the gateway, which terminates TLS and forwards frames to your server, so the server itself does not have to hold certificates. ### Should I use WebSocket or WebRTC for a Godot browser game? Use WebSocket when a server is authoritative, because everyone connects to it and results are easy to reason about. Use WebRTC when you want peer-to-peer data channels and accept connectivity risk: NetCraftGames offers signaling but no TURN relay, so some restrictive networks will fail to connect peers. ## Sources - [Godot Docs: WebSocketMultiplayerPeer](https://docs.godotengine.org/en/stable/classes/class_websocketmultiplayerpeer.html), accessed 2026-10-03 - [Godot Docs: Exporting for dedicated servers](https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_dedicated_servers.html), accessed 2026-10-03 ## Related pages - [WebSocket vs UDP for browser multiplayer](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/): Browsers cannot use raw UDP. Compare WebSocket, WebRTC data channels and native UDP for multiplayer games, and pick the right transport for your players. - [WebRTC signaling for browser games, explained](https://netcraftgames.com/guides/webrtc-signaling-for-browser-games/): What a WebRTC signaling server does for a browser multiplayer game, why STUN is not a relay, when TURN is needed, and the offer, answer and ICE flow. - [WebRTC signaling for browser and Godot games](https://netcraftgames.com/engines/browser-webrtc/): NetCraftGames offers managed WebRTC room signaling for browser and Godot games: offers, answers and ICE only. There is no TURN relay yet. --- # Hosting a browser WebSocket (WSS) game server > NetCraftGames is designed to host an existing authoritative WebSocket game server, a Node.js 24 or Python 3.12 project or a Linux x64 program, behind a TLS wss gateway with exact browser-origin checks. It does not write your server or certify browser compatibility. Not certified yet, and no Node or Python game has run on our servers yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/engines/browser-websocket/* ## Short answer Yes, by design, if your browser game already talks to its own authoritative server over WebSocket. You ship that server as a Node.js 24 project, a Python 3.12 project, or a Linux x64 program (Go, Rust, Bun or anything that produces a runnable Linux binary), declare its TCP port, and list the exact website origins allowed to connect. Players connect over `wss://` to a NetCraftGames gateway path of the form `/play/`; TLS ends at the gateway and frames are forwarded to your server. ## Packaging a Node, Python, Go or Rust server The servers have Node.js 24 and Python 3.12 installed. They never run npm, pip or any other package manager, so the packages your server needs travel inside your upload, built for Linux. On your own computer, in the project folder: - **Node.js:** `ncg pack . --node --install`. It builds a folder with your code, the production packages for Linux x64 and a start script, then packs it. Nothing runs unless you pass `--install`. See the [Node.js guide](https://netcraftgames.com/guides/node-websocket-server/). - **Python:** `ncg pack . --python --install`, which downloads wheels for Linux and Python 3.12 only (no source builds). See the [Python guide](https://netcraftgames.com/guides/python-websocket-server/). - **Go:** `GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o build/server ./cmd/server` - **Rust:** `cargo build --release --target x86_64-unknown-linux-gnu` The image is Ubuntu 24.04, so a Linux program you build yourself must not need a newer glibc than 2.39. Whatever you use, the process must bind `0.0.0.0` on a fixed port, read secrets from the environment, and not start by downloading and running scripts. ## What you provide - The server archive as `.tar.gz` (for Node and Python, the folder `ncg pack` builds). - The declared TCP port, a health route and a join probe with a known reply. - Exact allowed browser origins, for example `https://play.example.com`. - A WebSocket server. By default the gateway connects to `ws://:/`. If your server answers at another path, such as `/ws`, you write that one path in the manifest as `wsPath`; you fix it, and nothing a player sends can change it. [Details in the guide](https://netcraftgames.com/guides/node-websocket-server/). - Not supported: Colyseus (it needs plain web requests before the WebSocket), and socket.io unless it is set to WebSocket only. - Optional: a loopback JSON player-count endpoint so empty servers can be shut down. ## Steps 1. **Build for Linux.** For Node or Python run `ncg pack . --node --install` (or `--python`), which builds the packages for Linux x64. For Go or Rust build a Linux x86-64 program and check it with `file build/server`, which should say ELF 64-bit LSB executable, x86-64. 2. **Bind 0.0.0.0 on a fixed port.** Listen on all interfaces and read the port from the environment with a default, for example `PORT=8080`. Declare your WebSocket port as the first TCP port in the manifest, because the gateway forwards to it. Never bind to `127.0.0.1` only. 3. **Add a health route and join probe.** Return a short known body from `/health` and a game-level join check, so a join can be proven rather than assumed. 4. **Declare exact origins.** List each website origin allowed to connect, with scheme and host. Requests from other origins are refused. 5. **Keep secrets out of the archive.** Read tokens from environment variables. Archives with embedded credentials are rejected and the values are never repeated back to you. 6. **Connect from the page with wss.** Use the `wss://` address from your connection configuration. Test in several real browsers after launch. ## Gateway limits | Limit | Current value | | --- | --- | | Browser WebSocket gateway: largest frame | 64 KiB | | Browser WebSocket gateway: rate per connection | up to 120 messages and 2 MiB per second | | WebRTC signaling: largest message | 16 KiB | | WebRTC room size | 2 to 16 peers; rooms expire after two hours | | Idle shutdown | after 10 continuous minutes with zero players (needs player-count reporting) | | Region | us-east-1 only | ## Honest gaps - **Not certified.** Origin handling, protocol compatibility and a real browser join across browsers still need live evidence. - **Application bytes are metered**, not the WebSocket and TLS overhead, so transfer figures are approximate. - **No DDoS or abuse guarantees** beyond the per-connection limits above. - **Mobile Safari and background tabs** can drop WebSockets; your client must reconnect. - **No anti-cheat.** Authoritative server logic is yours. ## Frequently asked questions ### Do I need my own TLS certificate for a browser game server? Not on NetCraftGames. Players connect to a wss address on the gateway, which terminates TLS and forwards frames to your server. Your server can speak plain WebSocket to the gateway. You still need to list the exact website origins allowed to connect, because the gateway checks the Origin header on every connection. ### Which languages can I use for a browser WebSocket server? Node.js 24 and Python 3.12 projects, or anything that produces a Linux x64 program, such as Go or Rust. NetCraftGames does not install dependencies or run package managers for you, so `ncg pack` prepares the packages for Linux on your computer first. The server must listen on 0.0.0.0, read secrets from the environment and answer a health check and join probe. ### Does my WebSocket have to be at the root path? No. Write the path your server answers at, for example /ws, as wsPath in your ncg.json. It is a fixed value that you choose, and the gateway never forwards a path or query from a player. A socket.io server works only when it is set to WebSocket transport and the path in the manifest includes its fixed query. Colyseus does not work, because it makes plain web requests first. ## Sources - [MDN: WebSockets API](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API), accessed 2026-10-03 ## Related pages - [Host a Node.js WebSocket game server: what to prepare](https://netcraftgames.com/guides/node-websocket-server/): Get a Node.js 24 WebSocket game server ready for NetCraftGames: the one command that packs it, the WebSocket path setting, socket.io and what does not work. - [Host a Python WebSocket game server: what to prepare](https://netcraftgames.com/guides/python-websocket-server/): Get a Python 3.12 WebSocket game server ready for NetCraftGames: the command that vendors Linux wheels, the WebSocket path setting and what does not work. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. - [WebRTC signaling for browser and Godot games](https://netcraftgames.com/engines/browser-webrtc/): NetCraftGames offers managed WebRTC room signaling for browser and Godot games: offers, answers and ICE only. There is no TURN relay yet. --- # WebRTC signaling for browser and Godot games > NetCraftGames offers managed room signaling for existing WebRTC games: rooms of two to sixteen peers and WebSocket exchange of offers, answers and ICE. Signaling is not a TURN relay, so peers on restrictive networks may fail to connect. Not certified yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/engines/browser-webrtc/* ## Short answer If your browser or Godot game already uses WebRTC peer connections and only lacks a place to exchange the handshake, NetCraftGames can provide that. It creates rooms with a short code, lets peers join, and relays `offer`, `answer` and `ice` messages between them over a room-scoped WebSocket. After the handshake your players talk to each other directly. **We do not relay game or media traffic, and we offer no TURN service yet.** ## What this lane includes - **Rooms** of 2 to 16 peers, created and joined with a short code. Rooms expire after two hours. - **Signaling over WSS**: peers connect with an opaque, room-scoped token and forward offer, answer and ICE messages to a target peer. - **A reference browser connector** that handles room requests and the signaling socket. Your game still owns `RTCPeerConnection`, offers, answers, ICE, game state and reconnects. - **Exact origin checks**, so only your listed websites can create rooms. - **Rate and size limits** on signaling messages. ## What it does not include - **No TURN media relay.** STUN only discovers a peer's public address. When a symmetric NAT or strict firewall blocks a direct path, a TURN server must relay the traffic. Without one, those players cannot connect. NetCraftGames will not offer TURN until metering and real connectivity testing exist. - **No dedicated server.** This lane runs no game process, so there is no command, port or health probe. - **No Unity support.** Unity is not listed for this lane because no verified Unity WebRTC integration exists. ## Limits | Limit | Current value | | --- | --- | | Browser WebSocket gateway: largest frame | 64 KiB | | Browser WebSocket gateway: rate per connection | up to 120 messages and 2 MiB per second | | WebRTC signaling: largest message | 16 KiB | | WebRTC room size | 2 to 16 peers; rooms expire after two hours | | Idle shutdown | after 10 continuous minutes with zero players (needs player-count reporting) | | Region | us-east-1 only | ## Steps 1. **Declare the relayed WebRTC lane.** In the manifest set the mode to relayed and the transport to webrtc, and state that your signaling adapter is implemented. No archive, command or ports are needed. 2. **Create or join a room.** The client requests a room, or joins one with a short code, and receives a room id, a peer id, a token and the signaling WebSocket address. 3. **Connect the signaling socket.** Open the WebSocket address with the room-scoped token. Never log or store that address or token; treat it like a password. 4. **Exchange offers, answers and ICE.** Forward offer, answer and ice messages to the target peer id. Peers announce themselves with peers, peer-joined and peer-left events. 5. **Handle failure honestly.** If ICE fails, show the player a clear message and a retry. Do not promise connectivity on every network, because there is no relay. 6. **Test with two real networks.** Join from two different home or mobile networks and confirm data flows before launch. ## Honest gaps - A published signaling configuration is **not** a certified peer connection. Two real clients, on different networks, must complete ICE and exchange data before you can claim compatibility. - One controller process routes signals today, so rooms are not spread across machines. - Peer-to-peer games have no authoritative server, so cheating and desync are your design problem. ## Frequently asked questions ### Does NetCraftGames include a TURN server for WebRTC? No. It provides room signaling only: offers, answers and ICE messages. STUN can discover addresses but cannot relay media, and without TURN, peers behind symmetric NATs or strict firewalls may not connect. NetCraftGames will not offer TURN until metering and real connectivity testing exist, and says so on this page. ### How many players fit in a WebRTC room? Rooms hold two to sixteen peers and expire after two hours. Each admitted peer, including one still opening its socket, uses one connection slot against your plan's connection ceiling. Larger rooms depend on your game's own peer-to-peer design, because every peer connects to the others directly. ## Sources - [MDN: WebRTC protocols (ICE, STUN, TURN)](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Protocols), accessed 2026-10-03 ## Related pages - [WebRTC signaling for browser games, explained](https://netcraftgames.com/guides/webrtc-signaling-for-browser-games/): What a WebRTC signaling server does for a browser multiplayer game, why STUN is not a relay, when TURN is needed, and the offer, answer and ICE flow. - [WebSocket vs UDP for browser multiplayer](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/): Browsers cannot use raw UDP. Compare WebSocket, WebRTC data channels and native UDP for multiplayer games, and pick the right transport for your players. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Guides for owners putting multiplayer online > Practical guides on the problems that stop a multiplayer build going live: Linux dedicated server exports for Unity, Godot and Unreal, Node.js and Python WebSocket servers, ports and firewalls, WebSocket versus UDP, WebRTC signaling, idle cost and what a connection config must contain. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/* ## All guides - [How to build a Linux dedicated server from Unity](https://netcraftgames.com/guides/build-linux-dedicated-server-unity/): Step by step: build a headless Linux dedicated server from Unity 6 with Build Profiles, bind it correctly, test it and pack it for hosting. - [Host a Node.js WebSocket game server: what to prepare](https://netcraftgames.com/guides/node-websocket-server/): Get a Node.js 24 WebSocket game server ready for NetCraftGames: the one command that packs it, the WebSocket path setting, socket.io and what does not work. - [Mirror server on the cloud: ports and firewall checklist](https://netcraftgames.com/guides/mirror-server-ports-firewall-checklist/): A practical ports and firewall checklist for running a Mirror dedicated server on a cloud machine: KCP, Telepathy and SimpleWeb ports, binding and testing. - [Host a Python WebSocket game server: what to prepare](https://netcraftgames.com/guides/python-websocket-server/): Get a Python 3.12 WebSocket game server ready for NetCraftGames: the command that vendors Linux wheels, the WebSocket path setting and what does not work. - [Godot dedicated server export checklist](https://netcraftgames.com/guides/godot-dedicated-server-export-checklist/): A checklist for exporting a Godot 4 dedicated server for Linux: export mode, headless start, ENet versus WebSocket, ports, saves and packing. - [Idle shutdown: why paying for empty servers is waste](https://netcraftgames.com/guides/idle-shutdown-empty-servers/): Why paying for empty game servers is waste, how much it costs in hours, how idle shutdown works safely, and what your server must report for it to work. - [WebSocket vs UDP for browser multiplayer](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/): Browsers cannot use raw UDP. Compare WebSocket, WebRTC data channels and native UDP for multiplayer games, and pick the right transport for your players. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. - [Unreal Engine Linux dedicated server checklist](https://netcraftgames.com/guides/unreal-linux-dedicated-server-checklist/): A checklist for packaging an Unreal Engine dedicated server for Linux: source build, server target, cook and stage, port 7777, start script, versions. - [How to host a multiplayer game server cheaply](https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/): Honest ways to host a multiplayer game server cheaply: stop idle hours, right-size, mind egress, use free tiers and decide when managed hosting is worth it. - [WebRTC signaling for browser games, explained](https://netcraftgames.com/guides/webrtc-signaling-for-browser-games/): What a WebRTC signaling server does for a browser multiplayer game, why STUN is not a relay, when TURN is needed, and the offer, answer and ICE flow. - [Share your game with players: a link, a QR code and a live status](https://netcraftgames.com/guides/share-your-game-with-players/): How the NetCraftGames share page works for a first-time publisher: one link and QR code, what players see, what it does not do, and how to replace it. ## How these guides are written Each guide starts with the direct answer, then the steps, then the mistakes that waste the most time. Facts about engines come from the engine vendors' own documentation, linked at the bottom of each guide with the date we read it. Where something depends on your engine version, the guide says so instead of guessing. Everything is written for owners: game developers who already have, or are close to having, a working multiplayer build. ## Start here by problem - **"I need a Linux server build."** [Unity](https://netcraftgames.com/guides/build-linux-dedicated-server-unity/), [Godot](https://netcraftgames.com/guides/godot-dedicated-server-export-checklist/) or [Unreal](https://netcraftgames.com/guides/unreal-linux-dedicated-server-checklist/). - **"Players cannot connect."** The [Mirror ports checklist](https://netcraftgames.com/guides/mirror-server-ports-firewall-checklist/) applies to any UDP or TCP game, then see [when a connection fails](https://netcraftgames.com/connection-failures/). - **"My server is Node.js or Python."** [Node.js](https://netcraftgames.com/guides/node-websocket-server/) or [Python](https://netcraftgames.com/guides/python-websocket-server/): what the host provides and the one command that packs your project. - **"Browser players."** [WebSocket vs UDP](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/) and [WebRTC signaling](https://netcraftgames.com/guides/webrtc-signaling-for-browser-games/). - **"It costs too much."** [Idle shutdown](https://netcraftgames.com/guides/idle-shutdown-empty-servers/) and [hosting cheaply](https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/). - **"How do I give friends a link?"** [Share your game with players](https://netcraftgames.com/guides/share-your-game-with-players/): one link, a QR code and a live status. - **"What does the host need from me?"** [Connection config contents](https://netcraftgames.com/guides/connection-config-file-contents/). ## Related pages - [Engines and transports NetCraftGames can host](https://netcraftgames.com/engines/): Which engines and transports NetCraftGames is built to host: Unity Mirror and NGO, Unreal, Godot ENet and WebSocket, browser WSS and WebRTC, with honest gaps. - [Frequently asked questions about NetCraftGames](https://netcraftgames.com/faq/): Direct answers to 27 questions about NetCraftGames: engines, pricing, the 24-hour target, safety, AI, TURN, Windows servers and launch status. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # How to build a Linux dedicated server from Unity > In Unity 6, open File > Build Profiles, add the Linux Server platform, switch to the profile and build. The result is a headless executable. Then make it listen on 0.0.0.0, test it on Linux and pack it as a clean .tar.gz. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/build-linux-dedicated-server-unity/* ## The short answer Unity builds a dedicated server as a sub-target of the desktop platforms. In Unity 6 you add a **Linux Server** build profile, switch to it and press Build. Unity strips audio, textures, meshes, shaders and rendering code that a headless server does not need, which cuts size, memory and CPU use. The output is a Linux x86-64 executable with a data folder. ## Before you build - **Install the module.** If the Linux Server platform is missing from the Platform Browser, choose Install with Unity Hub and add the Linux Dedicated Server module for your editor version. - **Separate server code from client code.** Dedicated Server builds define the `UNITY_SERVER` scripting symbol, so you can write `#if UNITY_SERVER` to start networking and skip UI, audio and input. - **Use a fixed port and bind all interfaces.** A server bound to `127.0.0.1` is invisible to the world. - **Plan for logs and exit codes.** A server that quits silently is hard to diagnose. Log startup errors to standard output. ## Build steps 1. **Open Build Profiles.** In the Unity Editor choose File > Build Profiles. 2. **Add the Linux Server platform.** Select Add Build Profile to open the Platform Browser and choose Linux Server. If it is not listed, select Install with Unity Hub and add the module for your editor version. 3. **Switch to the profile.** Select Switch Profile so the new profile becomes active. A Dedicated Server build is a headless executable with no graphical interface. 4. **Set server behavior in code.** Use `#if UNITY_SERVER` to start your networking in server mode, bind to `0.0.0.0` and a fixed port, and skip UI, audio and input setup. 5. **Build.** Select Build and choose an empty output folder. Keep the whole folder, since the executable needs its data directory. 6. **Test on Linux and pack.** Run it headless on Linux, join from another machine, set the executable bit, then archive the folder with `tar -czf server.tar.gz .` with no symbolic links or secrets inside. ## Test the build the way a host will run it On a Linux x86-64 machine or container, extract the archive and run the server with the same arguments you will declare: ```bash mkdir game && tar -xzf server.tar.gz -C game chmod +x game/UnityServer.x86_64 ./game/UnityServer.x86_64 -batchmode -nographics ``` In a second terminal check that the port is open (`ss -lunp` for UDP, `ss -ltnp` for TCP) and join with a client from another machine. If the server exits immediately, read its log; exit code 127 usually means a missing library or the wrong architecture, and 139 a crash inside the program. ## Common mistakes | Mistake | Symptom | Fix | | --- | --- | --- | | Built the Windows server by accident | "No Linux x86-64 program found" | Check the profile says Linux Server and the file type is ELF 64-bit x86-64 | | Bound to `127.0.0.1` | Port open locally, unreachable remotely | Listen on `0.0.0.0` | | Executable bit lost | Exit code 126 | `chmod +x` before packing | | Secrets in the build | Upload rejected | Read tokens from environment variables | | Server waits for a display or input | Hangs at startup | Guard with `#if UNITY_SERVER` or `-batchmode` | | Built on a newer Linux than the host | The code reading holds the build for glibc | The worker image has glibc 2.39 (Ubuntu 24.04); build there or in an `ubuntu:24.04` container | | Declared Mirror or NGO for a game with its own sockets | A non-blocking advisory says no Mirror or Netcode assembly was found | Declare Custom native TCP/UDP (direct) and supply a join probe | ## Next Pick the networking page that matches you: [Unity Mirror](https://netcraftgames.com/engines/unity-mirror/) or [Unity NGO](https://netcraftgames.com/engines/unity-netcode-for-gameobjects/), then use the [ports and firewall checklist](https://netcraftgames.com/guides/mirror-server-ports-firewall-checklist/). If your server uses neither and speaks its own TCP or UDP protocol, read the custom native section of the [manifest guide](https://netcraftgames.com/guides/connection-config-file-contents/): a direct, limited lane where you supply the join probe. ## Frequently asked questions ### Can I build a Linux server from Windows? Yes. Install the Linux Dedicated Server module for your editor version with Unity Hub, add the Linux Server profile in Build Profiles and build from your Windows machine. You still need a Linux machine or container to test it, because a build that starts on Windows tooling may fail on Linux libraries or permissions. ## Sources - [Unity Manual: Build a Dedicated Server](https://docs.unity3d.com/6000.0/Documentation/Manual/dedicated-server-build.html), accessed 2026-10-03 - [Unity Manual: Dedicated Server introduction](https://docs.unity3d.com/6000.0/Documentation/Manual/dedicated-server-introduction.html), accessed 2026-10-03 ## Related pages - [Hosting a Unity Mirror dedicated server](https://netcraftgames.com/engines/unity-mirror/): How to host a Unity Mirror dedicated server on NetCraftGames: Linux Server build, KCP or Telepathy ports, health and join probes, and the honest gaps. - [Hosting a Unity Netcode for GameObjects server](https://netcraftgames.com/engines/unity-netcode-for-gameobjects/): Host a Unity Netcode for GameObjects (NGO) dedicated server on NetCraftGames: Linux Server build, Unity Transport UDP, listen address, probes and honest gaps. - [Mirror server on the cloud: ports and firewall checklist](https://netcraftgames.com/guides/mirror-server-ports-firewall-checklist/): A practical ports and firewall checklist for running a Mirror dedicated server on a cloud machine: KCP, Telepathy and SimpleWeb ports, binding and testing. --- # Host a Node.js WebSocket game server: what to prepare > Our servers run Node.js 24, but they never install packages, so your project has to be packed on your own computer first. One command does that. This guide covers it, the setting for a WebSocket that is not at the root path, and the cases that cannot work. It is built and tested locally; no Node game has run on our servers yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/node-websocket-server/* ## The short answer Open a terminal in your project folder and run `ncg pack . --node --install`, then `ncg check .ncg/build` and `ncg submit`. The first command builds a folder with your code, the packages built for Linux and a small start script, and packs it into the archive we upload. It installs nothing unless you give it `--install`, and it never changes your own `node_modules`. ## What the host provides - **Node.js 24, the long-term-support line.** One exact version is installed on every server and checked against the official signed release before it is used. When we move to a newer line, this guide changes the same day. - **No npm and no package install.** Everything your server needs at run time must be in the archive. That is why the packages are built for Linux x64 (glibc) on your computer, whatever your computer runs. - **A start script named `server`.** `ncg pack` writes it. It starts your file with `node` and a memory ceiling that fits the profile you chose. Your manifest's command is that script, because a command must be a file inside your archive. - **Ubuntu 24.04.** Anything you build for Linux yourself must not need a newer glibc than 2.39. If you would rather use a different Node version, you can put your own Linux x64 `node` in the archive and start it from your own script. The check then judges that program instead. ## Steps 1. **Make the server listen on all addresses.** Bind `0.0.0.0`, read the port from the environment with a default, and never bind `127.0.0.1` only. 2. **Add a health page and a join check.** A small route such as `/health` that answers `ok`, and one that proves a player could join. The [Node prompt](https://netcraftgames.com/can-you-host-my-game/prompts/node-ws-hosting-basics/) makes your AI add both. 3. **Handle SIGTERM.** Save and exit within the grace time when the host asks you to stop. 4. **Run `ncg init .`.** It reads the project and writes `ncg.json`, marking what it could not find. 5. **Run `ncg pack . --node --install`.** The exact command it runs is printed first. It needs npm 10.3 or newer and a `package-lock.json`. No package install script runs. If the lockfile points at git, a web address, a folder or a link instead of the npm registry, `ncg` stops before npm starts and says which package; replace it with a registry version (or use `--bundle`). 6. **Run `ncg check .ncg/build`.** This is what the service would say about your upload, before anything leaves your computer. ## If your WebSocket is not at the root path By default the gateway connects to `ws://:/`. If your server only accepts upgrades at `/ws`, write that in `ncg.json`: ```json "wsPath": "/ws" ``` The path is fixed by you when you release. Nothing a player sends (path, query or headers) becomes part of the address the gateway connects to, so a player cannot reach another path on your server or on anyone else's. A path uses letters, digits and `. _ ~ - /`, up to 128 characters, with an optional fixed query of up to eight `key=value` pairs. ## socket.io socket.io works only in WebSocket-only mode. In the browser, connect to the gateway address with `transports: ['websocket']` and `addTrailingSlash: false` (socket.io-client 4.6 or newer), and put the fixed query in the manifest: ```json "wsPath": "/socket.io/?EIO=4&transport=websocket" ``` Long polling does not pass through the gateway, and neither does the client `query` option. Send tokens in the `auth` option instead. The [socket.io prompt](https://netcraftgames.com/can-you-host-my-game/prompts/node-socketio/) makes your AI change exactly that. ## What does not work - **Colyseus.** It starts with plain web requests for matchmaking before the WebSocket. We say so before you upload, and the [check](https://netcraftgames.com/can-you-host-my-game/) says so before you start. - **Packages for the wrong system.** A package with a native add-on built for Windows, macOS, ARM or Alpine is refused with the package named. `ncg pack --install` asks for Linux x64 builds only. - **uWebSockets.js for a different Node.** Its add-ons are built per Node version. Use the build for Node 24, or the `ws` library. - **Install scripts.** They never run on our servers. If your game needs one, move that work into the build. - **TypeScript as the start file.** Compile it first and point `ncg pack` at the output with `--entry`. - **A source folder.** Uploading a project with `package.json` and no start script is held with the command to run. ## Mistakes that waste the most time | Mistake | What you see | Fix | | --- | --- | --- | | Packed on Windows without `--install` | A Windows add-on in `node_modules` is refused | Pack with `--install`, which builds for Linux | | `engines.node` says 20 only | Node version not supported | Allow 24 in `engines`, for example `>=20` | | Server binds `127.0.0.1` | The health check never passes | Bind `0.0.0.0` | | WebSocket only at `/ws`, no `wsPath` | The check holds the build | Add `wsPath` to the manifest | | Port in the code differs from the manifest | Timeout at start | Use the same number in both | ## Frequently asked questions ### Do I need to ship my own Node.js binary? No. The servers have Node.js 24. You only ship your own if you need a different version, and then you start it from your own script. ### Does NetCraftGames run npm install for me? No. Nothing on our servers installs packages. The command `ncg pack . --node --install` does it on your computer and puts the Linux packages in the archive. ### Can I use TypeScript? Yes, compile it to JavaScript first. The start script runs a JavaScript file, and a TypeScript entry is refused with that advice. ### Is there a Node.js game running on NetCraftGames today? Not yet. The preparation, the checks and the gateway path setting are built and tested locally with real libraries, but no Node game has run on our servers, and nothing here is certified. ## Sources - [Node.js: previous releases (Node 24 long-term support line)](https://nodejs.org/en/about/previous-releases), accessed 2026-10-05 - [MDN: WebSockets API](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API), accessed 2026-10-03 ## Related pages - [Hosting a browser WebSocket (WSS) game server](https://netcraftgames.com/engines/browser-websocket/): Host an existing authoritative browser game server on NetCraftGames: a Node 24, Python 3.12 or Linux x64 WebSocket server behind a wss gateway. - [Host a Python WebSocket game server: what to prepare](https://netcraftgames.com/guides/python-websocket-server/): Get a Python 3.12 WebSocket game server ready for NetCraftGames: the command that vendors Linux wheels, the WebSocket path setting and what does not work. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. --- # Mirror server on the cloud: ports and firewall checklist > Open the one port your Mirror transport really uses, with the right protocol: UDP for KCP, TCP for Telepathy, TCP with TLS for browser WebSocket. Bind the server to 0.0.0.0, allow that port in the machine's firewall and cloud rules, and test from outside. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/mirror-server-ports-firewall-checklist/* ## The short answer "Players cannot connect" in a cloud-hosted Mirror game is almost always one of five things: the wrong protocol (TCP opened for a UDP transport), the wrong port, a server bound to `localhost`, a firewall rule on the machine or in the cloud account, or a client pointed at the wrong address. This checklist walks them in the order that finds the problem fastest. ## Which port and protocol | Mirror transport | Protocol | Common default | Open in the firewall | | --- | --- | --- | --- | | KCP | UDP | 7777 | UDP 7777 | | Telepathy | TCP | as configured | TCP on that port | | SimpleWeb (WebSocket) | TCP | 7778 | TCP 7778, and put TLS in front for `wss://` | | Multiplex (several at once) | each | each | one rule per transport | The numbers come from the Mirror documentation and are defaults you can change. The rule is simple: open exactly the pairs your server opens, nothing broader. ## The checklist 1. **Confirm which transport you use.** Open the NetworkManager and read the transport component. KCP means UDP, Telepathy means TCP, SimpleWeb means WebSocket over TCP. 2. **Pick one fixed port per transport.** Write the port and protocol down. Do not let the port be chosen randomly at startup. 3. **Bind to all interfaces.** Make sure the server listens on `0.0.0.0`, not `127.0.0.1`. Confirm on the machine with `ss -lunp` for UDP or `ss -ltnp` for TCP. 4. **Open the port in every firewall layer.** Allow the exact protocol and port inbound on the operating system firewall and in any cloud security group or network ACL. UDP and TCP are separate rules. 5. **Test from outside the network.** From another network, use a UDP-capable test or a real client. A successful TCP connect proves nothing about a UDP game. 6. **Add a health reply and join probe.** Answer a small request with a known string so you can prove a player could really join, not just that a socket is open. 7. **Retest after every change.** Re-run the outside test after rebuilding, changing a port or moving regions. ## If your server is not Mirror at all A Unity server with its own raw TCP or UDP protocol uses the same port and protocol rules, but it is not a Mirror game, and declaring Mirror for it is misleading. Declare it as Custom native TCP/UDP (direct): players reach the server's public IP address and port directly, with no gateway, and you supply a game-level join probe, because an open port never proves a player could join. See the [manifest guide](https://netcraftgames.com/guides/connection-config-file-contents/). ## What NetCraftGames does for you On NetCraftGames you declare the port and protocol pairs in your manifest. The platform controls the firewall on its side and never opens broad port ranges, and a TCP-only probe cannot certify a UDP game. You do not edit cloud security groups. You still must bind to `0.0.0.0` and answer a health check and join probe, which are part of the [connection config](https://netcraftgames.com/guides/connection-config-file-contents/). ## Troubleshooting table | Symptom | Most likely cause | Check | | --- | --- | --- | | Works on LAN, not from the internet | Firewall or security group | Allow the right protocol and port inbound | | TCP test succeeds, game cannot join | Transport is UDP | Use a UDP test, not `telnet` | | Port closed on the server itself | Not listening or bound to localhost | `ss -lunp` or `ss -ltnp` | | WebGL client fails, native works | WebSocket needs TLS from an HTTPS page | Serve `wss://` through a TLS endpoint | | Fails only on some networks | NAT or carrier restrictions | Test on another network; UDP can be blocked | ## Frequently asked questions ### Which ports does a Mirror server need open? Only the ports your transport actually listens on, with the matching protocol. KCP uses UDP, with 7777 as its common default. Telepathy uses TCP. SimpleWeb carries WebSocket over TCP and commonly defaults to 7778. Open exactly those pairs and nothing broader, and remember UDP and TCP are separate firewall rules. ## Sources - [Mirror documentation: Transports](https://mirror-networking.gitbook.io/docs/manual/transports), accessed 2026-10-03 - [Mirror documentation: KCP Transport](https://mirror-networking.gitbook.io/docs/manual/transports/kcp-transport), accessed 2026-10-03 ## Related pages - [Hosting a Unity Mirror dedicated server](https://netcraftgames.com/engines/unity-mirror/): How to host a Unity Mirror dedicated server on NetCraftGames: Linux Server build, KCP or Telepathy ports, health and join probes, and the honest gaps. - [How to build a Linux dedicated server from Unity](https://netcraftgames.com/guides/build-linux-dedicated-server-unity/): Step by step: build a headless Linux dedicated server from Unity 6 with Build Profiles, bind it correctly, test it and pack it for hosting. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. --- # Host a Python WebSocket game server: what to prepare > Our servers run Python 3.12, but they never install packages, so your libraries have to travel inside the upload as wheels built for Linux. One command prepares them on your own computer. It is built and tested locally; no Python game has run on our servers yet. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/python-websocket-server/* ## The short answer In your project folder run `ncg pack . --python --install`, then `ncg check .ncg/build` and `ncg submit`. The first command downloads wheels for Linux x86-64 and Python 3.12 only, writes them into a `vendor` folder, adds a start script named `server`, and packs everything. It installs nothing unless you pass `--install`, and it never touches your own virtual environment. ## What the host provides - **Python 3.12 and the standard library.** Nothing else. There is no pip on the servers and no network install at start. - **Your libraries, as wheels.** The command asks for `cp312` and `manylinux` x86-64 wheels with no source builds (`--only-binary=:all:`), so no library is compiled and no install script runs. `ncg` also refuses, before pip starts, any `requirements.txt` line that is a folder, a web address, a repository or a pip option such as `--index-url` or `--no-binary`, because pip would build those with their own build code on your computer. Use plain lines such as `websockets==14.1`; pip is given a cleaned copy. - **A start script named `server`.** It sets `PYTHONPATH` to your `vendor` folder, then runs your file with `python3`. Your manifest's command is that script. - **Ubuntu 24.04**, so shipped Linux libraries must not need a newer glibc than 2.39. ## Steps 1. **List every library in `requirements.txt`**, pinned if you can. 2. **Listen on `0.0.0.0`** and read the port from the environment with a default. 3. **Add a health route and a join check** that answers with a known reply. The [Python prompt](https://netcraftgames.com/can-you-host-my-game/prompts/python-ws-hosting-basics/) makes your AI add them, and the clean stop on SIGTERM. 4. **Run `ncg init .`**, then `ncg pack . --python --install`, then `ncg check .ncg/build`. ## If your WebSocket is not at the root path A FastAPI or Starlette route such as `/ws` is not the root. Declare it in `ncg.json` as `"wsPath": "/ws"`. The path is fixed by you at release. A player's path and query never reach your server. See the [Node guide](https://netcraftgames.com/guides/node-websocket-server/) for the allowed characters. ## What does not work - **A library with no Linux wheel.** If a package only ships source, `--only-binary` stops with the package named. Pick a version that has a wheel, or another library. - **Extensions built for Windows, macOS, ARM or Alpine.** Only `cp312` `manylinux` x86-64 is accepted. - **Designs that need a plain web request before the WebSocket.** The gateway passes WebSocket connections only, so long polling and HTTP matchmaking do not work. - **A source folder.** A project with `requirements.txt` and no vendored packages is held with the command to run. ## Mistakes that waste the most time | Mistake | What you see | Fix | | --- | --- | --- | | Zipped your own virtual environment | Windows or macOS extensions refused | Run `ncg pack --python --install` instead | | Wheel for Python 3.11 | Wheel for another system | The host runs 3.12; install for 3.12 | | Missing `requirements.txt` entry | Import error at start | Add it and pack again | | Listening on `127.0.0.1` | Health check never passes | Bind `0.0.0.0` | ## Frequently asked questions ### Does NetCraftGames run pip for me? No. Nothing on our servers installs packages. `ncg pack . --python --install` downloads Linux wheels on your computer and puts them in the archive. ### Can I use FastAPI? A FastAPI WebSocket route works, with the route declared as the WebSocket path. It was run through the gateway locally with uvicorn. Plain web endpoints beyond the health and join checks are not served to players. ### Is there a Python game running on NetCraftGames today? Not yet. The preparation, the checks and the path setting are built and tested locally with real libraries, but no Python game has run on our servers, and nothing here is certified. ## Sources - [MDN: WebSockets API](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API), accessed 2026-10-03 ## Related pages - [Hosting a browser WebSocket (WSS) game server](https://netcraftgames.com/engines/browser-websocket/): Host an existing authoritative browser game server on NetCraftGames: a Node 24, Python 3.12 or Linux x64 WebSocket server behind a wss gateway. - [Host a Node.js WebSocket game server: what to prepare](https://netcraftgames.com/guides/node-websocket-server/): Get a Node.js 24 WebSocket game server ready for NetCraftGames: the one command that packs it, the WebSocket path setting, socket.io and what does not work. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. --- # Godot dedicated server export checklist > Export a Linux x86_64 preset with the Export as dedicated server mode, start it with --headless, create your ENet or WebSocket peer on a fixed port, and test a real client before packing. Godot adds the dedicated_server feature tag for you. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/godot-dedicated-server-export-checklist/* ## The short answer Godot's documentation says to open the server export preset, go to the Resources tab and pick "Export as dedicated server", which adds the `dedicated_server` feature tag automatically. Since Godot 4.0, any binary can also run without a window using `--headless`. Pair that with a fixed port and an honest test and you have a server a host can run. ## Detect server mode in code Godot gives you three ways to know you are the server: ```gdscript func _ready() -> void: if OS.has_feature("dedicated_server"): start_server() elif DisplayServer.get_name() == "headless": start_server() elif "--server" in OS.get_cmdline_user_args(): start_server() ``` Use one on purpose. A server that quietly starts as a client waits forever for a window. ## ENet or WebSocket? | | ENet | WebSocket | | --- | --- | --- | | Protocol | UDP | TCP (WebSocket) | | Browser web export | Not possible | Yes, over `wss://` | | Latency under packet loss | Better | Worse | | Peer class | `ENetMultiplayerPeer` | `WebSocketMultiplayerPeer` | Native-only games should use ENet. Games with browser players need WebSocket or WebRTC. Read [WebSocket vs UDP](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/). ## The checklist 1. **Match versions.** Install export templates that match your editor version exactly, and use the same Godot version for client and server. 2. **Create a Linux x86_64 preset.** In Project > Export add a Linux preset and choose the x86_64 architecture. 3. **Choose dedicated server mode.** On the Resources tab pick Export as dedicated server. This adds the `dedicated_server` feature tag and lets you strip visuals. 4. **Start the right peer on a fixed port.** Create `ENetMultiplayerPeer.create_server(port, max_clients)` for UDP or `WebSocketMultiplayerPeer.create_server(port)` for browsers, then assign it to `multiplayer.multiplayer_peer`. 5. **Run it headless on Linux.** Execute `./server.x86_64 --headless`, check the port with `ss`, and join from a real client on another network. 6. **Keep saves under one path.** Write state under `/game/saves` or another single known folder so a shutdown can checkpoint it. 7. **Pack cleanly.** Archive the export folder as `.tar.gz` with no symbolic links and no embedded tokens, then record the SHA-256 of the file you will upload. ## Stripping the export The export dialog lets each resource be exported with visuals replaced by placeholders, kept, or removed. Stripping textures and materials on the server shrinks the package and memory. Do not strip anything your server logic reads, such as collision shapes, navigation data or scene scripts. ## Test it the way a host will run it On a Linux x86-64 machine, extract the archive and start the server with the exact command you will declare. Check the port with `ss -lunp` for ENet (UDP) or `ss -ltnp` for WebSocket (TCP), then join from a Godot client on another computer or network. If the server prints errors about missing display or audio drivers, you started the normal binary without the dedicated server tag or `--headless`. ## Common mistakes | Mistake | Symptom | Fix | | --- | --- | --- | | Export templates do not match the editor version | Export fails or the server crashes at start | Install the matching templates from the editor's export dialog | | Client and server built on different Godot versions | Peers connect, then disconnect or desync | Rebuild both with one version | | Server created only inside a UI scene | Nothing listens when run headless | Start the peer from an autoload or a scene that runs without a window | | Stripped a resource the server reads | Missing node or script errors at startup | Mark only visual resources as stripped | | Hard-coded `127.0.0.1` or a random port | Reachable only locally | Bind the fixed declared port on all interfaces | | Saved files written next to the executable | Lost on shutdown | Write under one declared save folder | ## What a host needs from you A declared start command such as `/game/server.x86_64 --headless`, the port and protocol (UDP for ENet, TCP for WebSocket), a health reply and, ideally, a join probe. The [connection config guide](https://netcraftgames.com/guides/connection-config-file-contents/) lists each field, and the [Godot ENet](https://netcraftgames.com/engines/godot-enet/) and [Godot WebSocket](https://netcraftgames.com/engines/godot-websocket/) pages cover the hosting side. ## Frequently asked questions ### How do I run a Godot server without a window? Start the exported binary with the --headless command-line argument; since Godot 4.0 this works on any platform. If you export with Export as dedicated server mode, the dedicated_server feature tag is added automatically, which you can test with OS.has_feature, and the project can start in server mode without extra arguments. ## Sources - [Godot Docs: Exporting for dedicated servers](https://docs.godotengine.org/en/stable/tutorials/export/exporting_for_dedicated_servers.html), accessed 2026-10-03 - [Godot Docs: WebSocketMultiplayerPeer](https://docs.godotengine.org/en/stable/classes/class_websocketmultiplayerpeer.html), accessed 2026-10-03 ## Related pages - [Hosting a Godot ENet dedicated server](https://netcraftgames.com/engines/godot-enet/): Host a Godot 4 ENet dedicated server on NetCraftGames: dedicated server export, headless start, UDP port, health and join probes, and the honest gaps. - [Hosting a Godot WebSocket multiplayer server](https://netcraftgames.com/engines/godot-websocket/): Host a Godot 4 WebSocket multiplayer server on NetCraftGames for browser and native clients: WebSocketMultiplayerPeer, wss through a gateway, and honest gaps. - [WebSocket vs UDP for browser multiplayer](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/): Browsers cannot use raw UDP. Compare WebSocket, WebRTC data channels and native UDP for multiplayer games, and pick the right transport for your players. --- # Idle shutdown: why paying for empty servers is waste > A game server with zero players still consumes machine time. Shutting it down after a short grace period, after saving its state, removes that waste. It only works safely if the server reports its player count honestly and can save and restart. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/idle-shutdown-empty-servers/* ## The short answer Most indie multiplayer games are empty most of the day. A server left running 24 hours a day for a 30-day month uses 720 server hours. If your players are online for three hours a day, only 90 of those hours do anything. The other 630 are an empty room with the lights on. Idle shutdown stops the machine when nobody is playing and starts it again when someone wants to. ## The arithmetic | Pattern (one standard server, 30-day month) | Server hours used | | --- | ---: | | Always on | 720 | | On during a 6-hour evening window only | 180 | | Players present about 3 hours a day | 90 | | Weekend test sessions, 8 hours on two days a week | about 64 | NetCraftGames plans include 40, 80 and 120 standard hours a month. That is deliberate: it only makes sense if empty servers are not left running, which is why [pricing](https://netcraftgames.com/pricing/) states there is no unlimited always-on offer. ## What safe idle shutdown requires 1. **A real player count.** The server must report how many players are connected, for example as bounded JSON from a loopback endpoint such as `/players` returning `{ "players": 2 }`. If the count is unknown or stale, the idle clock resets rather than guesses. 2. **A grace period.** NetCraftGames waits for ten continuous minutes of zero players before acting, so a brief gap between matches does not tear down a server. 3. **Save before stop.** A graceful stop sends a termination signal, waits for your configured grace seconds, uploads a snapshot, and verifies the stored copy before the machine is destroyed. If the save fails, the machine is held for protection and the incident is visible. 4. **Fast, safe restart.** Your server must start cleanly from its saved state. Test it by stopping and starting it ten times. ## What to implement in your server - Count connections after authentication, not raw sockets. - Handle `SIGTERM`: stop accepting players, flush saves under your save path, then exit with code 0. - Write state under one folder (`/game/saves` in the example manifests). - Start fast: open the port first, load heavy content after. ## What idle shutdown does not do - It does not protect you if your server reports zero players while people are connected. Test the endpoint with real clients. - It does not replace sleeping a server explicitly. Servers that cannot report player counts must be put to sleep from the dashboard. - It is not an anti-abuse tool. Someone holding a connection open keeps the server awake. ## Frequently asked questions ### How long does idle shutdown wait? NetCraftGames waits for ten continuous minutes of zero reported players before it begins a graceful stop. If the player count is unknown or stale, the idle clock resets instead of assuming the server is empty. After the grace period the server is signalled to stop, saved, verified and then terminated. ### Does shutting a server down lose my game's data? It should not. Shutdown first stops the game, then uploads a snapshot of your declared save path, and the controller hashes the stored bytes before destroying the machine. If the save or drain fails, the machine is kept in a visible protection hold instead of being deleted. Test restart from saves before launch. ## Related pages - [Pricing built on honest server hours](https://netcraftgames.com/pricing/): NetCraftGames plans are $49, $79 and $99 a month for weighted server hours, with a $19 boost. What an hour buys, what expires and what is not included. - [How to host a multiplayer game server cheaply](https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/): Honest ways to host a multiplayer game server cheaply: stop idle hours, right-size, mind egress, use free tiers and decide when managed hosting is worth it. - [Hosting a Unity Netcode for GameObjects server](https://netcraftgames.com/engines/unity-netcode-for-gameobjects/): Host a Unity Netcode for GameObjects (NGO) dedicated server on NetCraftGames: Linux Server build, Unity Transport UDP, listen address, probes and honest gaps. --- # WebSocket vs UDP for browser multiplayer > A browser cannot open a raw UDP socket, so browser games use WebSocket (reliable, ordered, over TCP) or WebRTC data channels (can be unreliable and unordered). Native games should prefer UDP. Choose by who your players are, not by habit. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/* ## The short answer If any of your players use a web browser, you need WebSocket or WebRTC. Native clients on Windows, macOS, Linux, Android and iOS can use UDP, which handles packet loss more gracefully. Many teams run both: UDP for native, WebSocket for web, one authoritative server behind them. ## How they differ | | Native UDP (ENet, KCP, Unity Transport) | WebSocket | WebRTC data channel | | --- | --- | --- | --- | | Runs in a browser | No | Yes | Yes | | Transport underneath | UDP | TCP | UDP (DTLS/SCTP) | | Ordering and reliability | Your choice per message | Always reliable and ordered | Configurable | | Effect of a lost packet | Only that packet | Delays everything behind it | Depends on settings | | Needs a server | Yes (dedicated) | Yes (dedicated) | Signaling server, peers connect directly | | Network traversal | Server has a public address | Server has a public address | ICE; may need a TURN relay | | From an HTTPS page | n/a | Must be `wss://` | Allowed | ## Head-of-line blocking, in plain words TCP delivers bytes in order. If one packet is lost, later packets wait until it is retransmitted, even if they already arrived. For a turn-based or slower game that is invisible. For a fast action game on a flaky connection it shows up as stutter. UDP lets you drop stale state and send the newest, which is why fast games prefer it. ## Choosing - **Turn-based, card, puzzle, or slow co-op in the browser:** WebSocket to an authoritative server is the simplest and the most reliable to host. - **Fast action in the browser:** consider WebRTC data channels, accepting connectivity risk, or keep WebSocket messages small and use client prediction. - **Native only:** use UDP and skip the browser lane. - **Both:** run one authoritative server that speaks both transports, or one server per transport. ## What this means on NetCraftGames - Native UDP games run on the dedicated server lane ([Mirror](https://netcraftgames.com/engines/unity-mirror/), [NGO](https://netcraftgames.com/engines/unity-netcode-for-gameobjects/), [Unreal](https://netcraftgames.com/engines/unreal-engine/), [Godot ENet](https://netcraftgames.com/engines/godot-enet/)). - Browser WebSocket games run behind a `wss://` gateway ([browser WSS](https://netcraftgames.com/engines/browser-websocket/), [Godot WebSocket](https://netcraftgames.com/engines/godot-websocket/)). - WebRTC games get signaling rooms ([browser WebRTC](https://netcraftgames.com/engines/browser-webrtc/)); there is no TURN relay, so some networks will fail to connect. ## Mixed content, the classic web trap A page served over HTTPS may only open secure WebSocket connections. A game that works on `http://localhost` with `ws://` will fail in production unless it uses `wss://`. The gateway terminates TLS so your server does not need certificates. ## Frequently asked questions ### Can a browser game use UDP? Not directly. Browsers do not expose raw UDP sockets to web pages. They offer WebSocket, which runs over TCP, and WebRTC data channels, which run over UDP-based protocols and can be unreliable and unordered. Native clients can use real UDP, so many games offer UDP for native and WebSocket for browsers. ### Is WebSocket fast enough for a multiplayer game? For turn-based, card, puzzle and many co-op games, yes. For fast action on unreliable networks it can stutter, because TCP holds later data behind a lost packet. Keep messages small, send state snapshots instead of every event, use client prediction, or evaluate WebRTC data channels if you accept the connectivity trade-offs. ## Sources - [MDN: WebSockets API](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API), accessed 2026-10-03 - [MDN: WebRTC protocols (ICE, STUN, TURN)](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Protocols), accessed 2026-10-03 ## Related pages - [Hosting a browser WebSocket (WSS) game server](https://netcraftgames.com/engines/browser-websocket/): Host an existing authoritative browser game server on NetCraftGames: a Node 24, Python 3.12 or Linux x64 WebSocket server behind a wss gateway. - [WebRTC signaling for browser and Godot games](https://netcraftgames.com/engines/browser-webrtc/): NetCraftGames offers managed WebRTC room signaling for browser and Godot games: offers, answers and ICE only. There is no TURN relay yet. - [WebRTC signaling for browser games, explained](https://netcraftgames.com/guides/webrtc-signaling-for-browser-games/): What a WebRTC signaling server does for a browser multiplayer game, why STUN is not a relay, when TURN is needed, and the offer, answer and ICE flow. --- # What a connection config file must contain > A host needs two things from you: a deployment manifest that says how to start and check your server (engine, transport, ports, command, probes, shutdown), and players need a connection configuration (address, port, protocol, TLS and version). This guide lists every field and why it exists. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/connection-config-file-contents/* ## The short answer A deployment manifest is for the host: it names the engine and transport, the exact start command, each port and protocol, how to check health and join, where saves live and how to stop. A connection configuration is for your players' clients: the address, port, protocol, whether TLS is used, and the build version they must match. NetCraftGames reads your submission to produce both, and you review what it proposes. > **Where this comes from** > > The manifest shape and the player connection format below are the ones built into NetCraftGames today. Values that only exist after publishing, such as the final server address, are shown as clearly marked placeholders until then. ## The deployment manifest, field by field | Field | Required for | What it means | | --- | --- | --- | | `engine` | all | Which lane: for example `unity-ngo`, `unity-mirror`, `unreal-replication`, `godot-enet`, `godot-websocket`, `browser-wss`, or `custom-native` (a custom raw TCP or UDP server, see below) | | `transport` | all | `udp`, `tcp`, `websocket`, `wss` or `webrtc`; must be one the engine can use | | `platforms` | all | Intended client platforms. Declaring one does not mean it was tested | | `mode` | all | `dedicated` (we run your server) or `relayed` (WebRTC signaling only) | | `networkingImplemented` | all | You confirm the game already has working multiplayer networking | | `os`, `arch` | dedicated | `linux` and `x64` only | | `command` | dedicated | The start command. `command[0]` must be a literal path under `/game/` | | `ports` | dedicated | Each `{ port, protocol }` pair the process opens | | `profile` | all | `standard` (2 vCPU, 4 GiB) or `large` (4 vCPU, 8 GiB, counts double) | | `savePath` | optional | A literal path under `/game/` to checkpoint on shutdown | | `health` | dedicated | How to check the process is alive: TCP, HTTP with a path, or UDP with request and expected reply | | `joinProbe` | recommended; required for `custom-native` | A game-level check with a known expected reply: an `http` path, a `udp` request, or a read-only `tcp` banner where your server speaks first | | `playerProbe` | optional | A loopback HTTP endpoint returning bounded JSON such as `{ "players": 2 }`, for idle shutdown | | `shutdown` | optional | Signal `SIGTERM` and `graceSeconds` before a forced stop | | `artifact` | dedicated | The uploaded archive's id and its lowercase SHA-256 digest | | `idleSupported` | optional | `true` if the server reports players and tolerates idle shutdown | ### A real example This is the Unity NGO template from the NetCraftGames integration docs. Replace the digest with the SHA-256 of your own archive. ```json { "engine": "unity-ngo", "transport": "udp", "platforms": ["windows", "android", "ios"], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": ["/game/UnityServer.x86_64", "-batchmode", "-nographics"], "ports": [{ "port": 7777, "protocol": "udp" }], "profile": "standard", "savePath": "/game/saves", "health": { "type": "udp", "port": 7777, "request": "health", "expected": "healthy" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "udp", "port": 7777, "request": "join-status", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true, "artifact": { "id": "", "sha256": "<64 lowercase hex characters>" } } ``` ## Custom native TCP/UDP (direct): your own protocol If your server speaks its own raw TCP or UDP protocol, with no Mirror, Netcode, Unreal, Godot or WebSocket library behind it, declare `engine` as `custom-native` and `transport` as `tcp` or `udp`. This lane is supported, and it is deliberately limited: - **Configuration and deployment only.** We start your Linux x64 build on an isolated machine and check the checks you declare. Nothing about your game's protocol is certified. - **Direct, with no gateway.** Players connect to the running server's public IP address and port. There is no TLS termination, no origin check and no WebSocket relay from us, so any encryption or authentication is yours to build. - **You supply the join probe.** An open port never proves a player could join. Declare a `joinProbe` that your server really answers: for TCP, a banner your server sends first (we connect, send nothing, read the first bytes and match `expected`); or an `http` path, or a `udp` request and reply. Without it the release stays at "configuration needed". - **A launcher script is fine.** If a shell script starts your server with its own arguments, use that script as `command[0]` so the arguments are kept. The image provides bash and a POSIX sh. - **Linux libraries.** Programs are read for the glibc they need, and a build that needs a newer glibc than the worker image (2.39, Ubuntu 24.04) is held with advice, so build on Ubuntu 24.04. ```json { "engine": "custom-native", "transport": "tcp", "platforms": ["windows"], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": ["/game/Server/run-server.sh"], "ports": [{ "port": 47777, "protocol": "tcp" }], "profile": "standard", "health": { "type": "tcp", "port": 47777 }, "joinProbe": { "type": "tcp", "port": 47777, "expected": "YOUR-GAME-BANNER" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": false, "artifact": { "id": "", "sha256": "<64 lowercase hex characters>" } } ``` When you declare Mirror or Netcode for GameObjects for a Unity player build that holds none of their assemblies, the code reading raises a non-blocking advisory and suggests this lane. It never rewrites your declaration for you. ## Rules that cause most rejections - **Paths are inside the machine, not on yours.** `command[0]` and `savePath` must be literal paths under `/game/`. - **TCP and UDP probes differ.** HTTP and TCP probes need a TCP port; UDP probes need a UDP port. A TCP connect alone never proves a UDP game works. - **Declare real ports.** Every port your server opens, with the right protocol, and nothing it does not. - **No secrets.** Credentials in the archive are detected and the build is rejected; the values are never repeated back. - **Digest of the exact file.** Run `sha256sum server.tar.gz` on the file you upload. ## What a player connection config must carry NetCraftGames builds a schema-checked JSON document named `netcraft.connection-config/1`, plus engine-specific code snippets, from what it found in your submission and what you declared. Secrets are never included in it. | Field | What it holds | | --- | --- | | `lane` | How players reach you: `gateway_wss` (browser WebSocket through the TLS gateway), `direct_udp`, `direct_tcp` (also used by the custom native lane) or `webrtc_signaling` | | `endpoint` | Scheme, host, port, path and full URL; each is either filled in or a marked placeholder until publish | | `originAllowlist` | The exact website origins allowed to connect (browser lanes) | | `playerFields` | The values a client must set, and whether each comes from NetCraftGames, the player or your code | | `serverRequirements` | What your server must do for this lane to work | | `snippets` | Engine-specific example code, each marked as not yet verified | | `secrets` | Always states that no secret is in the file | | `gaps` and `notes` | What could not be determined, so you can see what is guessed and what is known | Browser and WebSocket games are reached at `wss:///play/`, which requires an allowed `Origin` and forwards to your server at the root path, or at the one path you write as `wsPath` in your manifest. UDP and raw TCP games, including custom native servers, are reached directly at the running server's public address: the file then carries a generic direct client section (host, port, protocol and what your join probe expects) instead of an engine snippet. WebRTC games use room signaling. Never put a secret in a client config: players can read it. ## Frequently asked questions ### Can I host a game that uses its own TCP or UDP protocol instead of Mirror or Netcode? Yes, as the Custom native TCP/UDP (direct) lane, which is limited on purpose. NetCraftGames deploys and configures your Linux x64 server, players connect directly to its public IP address and port with no gateway, and you must supply a join probe because an open port never proves gameplay. NetCraftGames does not certify your protocol or your game. ### What is the difference between a manifest and a connection config? A manifest is what the host needs to run your server: engine, transport, start command, ports, health and join probes, save path and shutdown behavior. A connection config is what players' clients need to reach it: address, port, protocol, TLS and version. NetCraftGames reads your submission to produce the second from the first. ## Related pages - [Engines and transports NetCraftGames can host](https://netcraftgames.com/engines/): Which engines and transports NetCraftGames is built to host: Unity Mirror and NGO, Unreal, Godot ENet and WebSocket, browser WSS and WebRTC, with honest gaps. - [What happens when a connection fails](https://netcraftgames.com/connection-failures/): When your game does not connect, NetCraftGames emails the exact problem and a concrete fix, then you resubmit. The 19 failures it detects and how each is fixed. - [Mirror server on the cloud: ports and firewall checklist](https://netcraftgames.com/guides/mirror-server-ports-firewall-checklist/): A practical ports and firewall checklist for running a Mirror dedicated server on a cloud machine: KCP, Telepathy and SimpleWeb ports, binding and testing. --- # Unreal Engine Linux dedicated server checklist > Epic requires a source build of Unreal Engine and a C++ project with a server target to make a dedicated server. Package it for Linux with the server-only option, start it with a map and port, and test with a client built from the same version. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/unreal-linux-dedicated-server-checklist/* ## The short answer Per Epic's documentation: use a source build of Unreal Engine and a C++ project that supports client-server play, create a `Server.Target.cs` file in the project's Source directory, and run the server with `-log` while testing. By default a dedicated server listens on port 7777. For hosting, you additionally need a **Linux** server package, which means a cross-compile toolchain or a Linux build machine. ## The checklist 1. **Use a source build.** Build Unreal Engine from source. The standard launcher engine cannot produce a dedicated server target. 2. **Add the server target.** In a C++ project create `Server.Target.cs` in the Source directory and regenerate project files. 3. **Cook and stage for Linux.** Run BuildCookRun with the Linux platform and the server-only options, so the output contains only server content. 4. **Write a start script.** Launch with a fixed map and port, for example `./YourGameServer.sh /Game/Maps/Lobby -port=7777 -log`, and make it executable. 5. **Test on Linux with a real client.** Run the staged server on a Linux machine and join from a client built from the same version, from a different network. 6. **Add health and join probes.** Reply to a UDP health request and a join request with known answers, so a join can be proven. 7. **Pack and hash.** Archive the staged folder as `.tar.gz` with no links or secrets and record its SHA-256. ## Example packaging command The shape below is the common one. Adjust paths and configuration for your project and engine version, and read Epic's current documentation. ```bash RunUAT.sh BuildCookRun -project="YourGame.uproject" -platform=Linux -server -noclient \ -serverconfig=Shipping -cook -build -stage -pak -archive -archivedirectory=Out # start with: ./YourGameServer.sh /Game/Maps/Lobby -port=7777 -log ``` ## Things that break Unreal servers on a host | Problem | Symptom | Fix | | --- | --- | --- | | Client and server built from different changelists | Connects, then disconnects or desyncs | Rebuild both from one version | | Server needs a map not cooked | Crash on start | Add the map to the cook list | | Bound only to localhost | Not reachable | Launch without a localhost-only bind and verify with `ss` | | Heavy memory use | Process killed (exit 137) | Measure peak memory; use the large profile if you must | | Start script not executable | Exit 126 | `chmod +x` before packing | | Large pak files | Upload too big | Strip server content; compress the archive | ## A note on cost Unreal servers are often heavier than small Unity or Godot servers. If you need the large profile, it spends two plan hours for every hour it runs; see [pricing](https://netcraftgames.com/pricing/) and the [idle shutdown guide](https://netcraftgames.com/guides/idle-shutdown-empty-servers/). ## Frequently asked questions ### Do I need Linux to build an Unreal dedicated server for Linux? Not necessarily. Epic supports cross-compiling for Linux from Windows with its toolchain, or you can build on a Linux machine. Either way, you must test the packaged server on real Linux, because missing libraries, file permissions and memory limits only show up there. A Windows-only test does not prove the Linux package runs. ## Sources - [Epic Games: Setting up dedicated servers in Unreal Engine](https://dev.epicgames.com/documentation/en-us/unreal-engine/setting-up-dedicated-servers-in-unreal-engine), accessed 2026-10-03 ## Related pages - [Hosting an Unreal Engine dedicated server](https://netcraftgames.com/engines/unreal-engine/): Host an Unreal Engine replication dedicated server on NetCraftGames: source-built Linux server target, UDP port 7777, probes, the large profile and honest gaps. - [What a connection config file must contain](https://netcraftgames.com/guides/connection-config-file-contents/): What a deployment manifest and a player connection config must contain for a hosted multiplayer server, with a real example and the rules that cause rejections. - [Pricing built on honest server hours](https://netcraftgames.com/pricing/): NetCraftGames plans are $49, $79 and $99 a month for weighted server hours, with a $19 boost. What an hour buys, what expires and what is not included. --- # How to host a multiplayer game server cheaply > The cheapest server is the one that is off when nobody plays. After that: right-size the machine, keep bandwidth small, use a free tier for testing and decide honestly whether you want to operate Linux yourself. A bare virtual machine is usually the cheapest per hour; managed hosting sells your time. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/host-multiplayer-game-server-cheaply/* ## The short answer Costs come from three meters: **machine time**, **network egress** and **your own time**. Cut machine time first, because empty servers are the biggest avoidable waste. Then right-size, keep traffic small, and only then compare providers. NetCraftGames is not the cheapest per raw hour, and this guide says so. ## Cut machine time - **Shut down when empty.** A 30-day month has 720 hours; if players are present three hours a day you need about 90. See the [idle shutdown guide](https://netcraftgames.com/guides/idle-shutdown-empty-servers/). - **Schedule test servers.** Playtests need servers for a weekend, not a month. - **Do not run one server per player.** If your game design allows several rooms per process, pack them. ## Right-size the machine Start small, then measure peak CPU and memory under a real session. A headless Unity, Godot or Go server often runs in 2 vCPU and 4 GiB; heavier Unreal servers may need more. Measure instead of guessing, and keep the server single-purpose. ## Keep bandwidth small Cloud providers charge for data leaving the machine. Send snapshots at a sensible tick rate, send deltas, compress only if CPU allows, and avoid sending data that clients can derive. Edgegap's published pay-as-you-go page, for example, lists egress at $0.10 per GB per month alongside its compute rate, and PlayFab's billing documentation also bills network egress separately; check each provider's current page. ## Use free tiers for what they are for Free tiers are for testing, not launch. Edgegap's free trial lists one app, up to 1.5 vCPU and a 60-minute uptime cap per deployment. PlayFab's free evaluation lists 750 Dasv4 core hours a month in two regions with a 24-core cap, and says this is typically not enough to launch a live game. Both are dated October 3, 2026 in our [comparison](https://netcraftgames.com/compare/). ## Decide who operates it | Option | You pay with | Good when | | --- | --- | --- | | Rent a VM yourself | Time: patching, firewall, supervision, TLS, backups | You know Linux and want the lowest hourly rate | | Orchestration platform | Integration work and per-minute rates | You need many regions and match-scale scaling | | Managed hosting such as NetCraftGames | A monthly plan | You have a working server build and want configuration, deployment and failure help handled | NetCraftGames plans are $49, $79 and $99 a month for 40, 80 and 120 weighted server hours; see [pricing](https://netcraftgames.com/pricing/). It is pre-launch and not accepting customers. ## A cheap-hosting checklist 1. **Measure a real session.** Record peak CPU, memory and outbound bandwidth with real players, not an empty test. 2. **Pick the smallest machine that survives the peak.** Choose a size with headroom, and re-measure after each content update. 3. **Turn the server off when empty.** Report a player count and shut down after a grace period, saving state first. This is usually the largest saving. 4. **Reduce traffic.** Lower the tick rate where gameplay allows, send deltas, and cap message sizes. 5. **Test on free tiers, launch on paid ones.** Use free evaluations for development and read the limits so launch day does not hit a cap. 6. **Compare total cost including your time.** Add the hours you would spend patching and debugging to the hourly rate before choosing self-hosting. ## Frequently asked questions ### What is the cheapest way to host a multiplayer game server? Renting a small virtual machine and shutting it down when nobody is playing is usually the cheapest per hour, provided you can operate Linux yourself. Managed services cost more per hour but remove setup and maintenance work. The biggest saving in every case is not paying for hours when the server is empty. ## Sources - [Edgegap pricing](https://edgegap.com/resources/pricing), accessed 2026-10-03 - [Microsoft Learn: Billing for PlayFab Multiplayer Servers 2.0](https://learn.microsoft.com/en-us/gaming/playfab/multiplayer/servers/billing-for-thunderhead), accessed 2026-10-03 ## Related pages - [Pricing built on honest server hours](https://netcraftgames.com/pricing/): NetCraftGames plans are $49, $79 and $99 a month for weighted server hours, with a $19 boost. What an hour buys, what expires and what is not included. - [Multiplayer hosting alternatives, compared fairly](https://netcraftgames.com/compare/): A fair, dated comparison of NetCraftGames with Unity Multiplay, Edgegap, Amazon GameLift, PlayFab, Photon and self-hosting, using only sourced facts. - [Idle shutdown: why paying for empty servers is waste](https://netcraftgames.com/guides/idle-shutdown-empty-servers/): Why paying for empty game servers is waste, how much it costs in hours, how idle shutdown works safely, and what your server must report for it to work. --- # WebRTC signaling for browser games, explained > A signaling server lets two browsers exchange the handshake messages they need to connect directly. It does not carry game traffic. STUN finds public addresses; only a TURN server relays data when a direct path is blocked. Without TURN, some players will not connect. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/webrtc-signaling-for-browser-games/* ## The short answer WebRTC lets browsers send data directly to each other, but they first need to swap three kinds of message through some server: an **offer**, an **answer** and **ICE candidates**. That swap is called signaling, and it is not defined by WebRTC, so you build or rent it. Once peers are connected, the signaling server is no longer in the data path. ## STUN, TURN and ICE in plain words MDN describes the three pieces: - **ICE** is the framework that tries to connect two peers, using STUN and TURN servers as needed. - **STUN** tells a client its public address and what kind of NAT it is behind. It does not relay media. - **TURN** relays all traffic through a server when a direct connection is impossible, such as behind a symmetric NAT. It is the fallback, and it costs bandwidth. So a game that only has signaling and STUN will connect many players, and fail for the ones behind restrictive NATs or firewalls. ## The message flow 1. Player A asks the signaling server for a room and gets a short code. 2. Player B joins with the code. 3. A creates an offer and sends it to B through signaling. 4. B replies with an answer through signaling. 5. Both exchange ICE candidates through signaling until a working path is found. 6. The data channel opens and play begins, peer to peer. ## Pitfalls | Pitfall | Why it hurts | Mitigation | | --- | --- | --- | | No TURN | Some players cannot connect | Tell players honestly and offer a retry; add TURN when you can meter it | | Trusting peers | No authoritative server, so cheating and desync are easy | Choose WebSocket to a dedicated server if fairness matters | | Leaking room tokens | Anyone with the token can join the signaling | Treat tokens like passwords; never log them | | Large rooms | Every peer connects to every other | Keep rooms small | | No reconnect plan | Mobile tabs sleep and drop | Re-run ICE and resync state | ## What NetCraftGames provides Managed rooms of 2 to 16 peers, WebSocket signaling with room-scoped tokens, exact origin checks and a reference browser connector. It does **not** provide TURN or a relay for game traffic. The [browser WebRTC page](https://netcraftgames.com/engines/browser-webrtc/) has the integration steps and limits. ## Frequently asked questions ### Do I need a TURN server for a WebRTC game? Not for every player, but for some. STUN lets most peers find a direct path, yet symmetric NATs and strict firewalls block direct connections, and only a TURN relay can carry their traffic. If you cannot offer TURN, tell players that some networks may fail and provide a clear retry message. ## Sources - [MDN: WebRTC protocols (ICE, STUN, TURN)](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Protocols), accessed 2026-10-03 ## Related pages - [WebRTC signaling for browser and Godot games](https://netcraftgames.com/engines/browser-webrtc/): NetCraftGames offers managed WebRTC room signaling for browser and Godot games: offers, answers and ICE only. There is no TURN relay yet. - [WebSocket vs UDP for browser multiplayer](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/): Browsers cannot use raw UDP. Compare WebSocket, WebRTC data channels and native UDP for multiplayer games, and pick the right transport for your players. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Share your game with players: a link, a QR code and a live status > The share page is a public page for one game. It shows whether the game is online, how many players are in it when the game reports that, and a button to the website where you host your browser game. It links to that website; it does not host it. It is built and tested locally, and it is not live, because NetCraftGames is pre-launch. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/guides/share-your-game-with-players/* ## The short answer Open your game in the dashboard, find **Share with players** and press **Turn on sharing**. You get one link and a QR code. Anyone who opens the link sees your game's title, whether it is online, starting or asleep, the player count if your game reports one, and a button that opens your game's website. Nothing is public until you turn it on, and you can replace the link or turn it off at any time. ## What a player sees The page is plain and works without JavaScript. It shows the title and one line of description you chose (or your game's name), a status in words and colour, the player count, a button to your website, the link with a copy button, the QR code, and the line "Hosted by NetCraftGames". If a script is allowed to run, the status refreshes by itself every 15 seconds. | Status | What the player reads | | --- | --- | | Online | The game is online. Players can join now. | | Starting | The game is starting. This can take a few minutes. Check back soon. | | Sleeping | This game is sleeping. Ask the owner to start it. | | Not open yet | This game is not open yet. Check back later. | | Unavailable | This game is not available right now. Try again later, or ask the owner. | When your game does not report how many players are connected, the page says so. It never shows zero unless your game reported zero. ## What it does not do - **It does not host your game's web page.** A browser game stays wherever you put it. The button on the share page is a plain link to that address. - **It does not wake your game.** A sleeping game stays asleep until you start it, so strangers cannot spend your hours. Players are told to ask you. - **It does not show private things.** No name, email, plan, hours, costs, builds, activity or problems appear on the page. - **It is not indexed** by search engines, and it counts nothing about visitors. ## Steps for a first-time publisher 1. Open the game and press **Turn on sharing**. 2. If you have a browser game, paste the https address where you host it into **Your game's website**, and save. Also list that website under Allowed websites on the Connection tab, or the gateway will refuse players who arrive from it. The card warns you when it is missing. 3. Press **Copy link**, or show the QR code to a friend with a phone. 4. Open the link yourself once to see exactly what players see. 5. If the link ended up somewhere it should not be, press **Replace the link**. The old link and QR code stop working at once. ## Using your AI assistant Your assistant can do the same with the owner API, the MCP server or the `ncg share` command. Turning the page on or off and changing the title need only the manage settings scope. Setting a website address, or replacing the link, asks you to approve it first under the default key settings, because both change what a public page points at. ## Limits to know about The page only links to the website you give it, and NetCraftGames does not check what is there. Use an address you control. In this version the page lives at the NetCraftGames address, not on a domain of your own, and hosting the browser client itself is not part of it. ## Frequently asked questions ### Can I share my game without hosting a website? Yes, for the link, the QR code and the status. The share page works on its own and shows whether the game is online. The button to a website only appears if you add an address. For a browser game, players still need a page that runs your client, and you host that yourself. ### What happens to the old link when I replace it? It stops working at once. Anyone who opens it sees that the link is not active, and the old QR code stops working too. Replacing the link gives you a new link and QR code to share. Turning sharing off is different: it keeps the same link for when you turn it on again. ### Can players start my sleeping game from the share page? No. A sleeping game shows a message asking players to contact you. Starting a game spends your prepaid hours, so only you or a key you control can do it. A public start button is not part of this version. ## Related pages - [WebSocket vs UDP for browser multiplayer](https://netcraftgames.com/guides/websocket-vs-udp-browser-multiplayer/): Browsers cannot use raw UDP. Compare WebSocket, WebRTC data channels and native UDP for multiplayer games, and pick the right transport for your players. - [Hosting a browser WebSocket (WSS) game server](https://netcraftgames.com/engines/browser-websocket/): Host an existing authoritative browser game server on NetCraftGames: a Node 24, Python 3.12 or Linux x64 WebSocket server behind a wss gateway. - [The owner API, so your AI can act for you](https://netcraftgames.com/owner-api/): How an owner AI assistant can run NetCraftGames safely: scoped API keys, human approval for risky actions, OpenAPI and a local MCP server. Not live yet. --- # Godot 4 dedicated server for NetCraftGames > A copy-paste prompt that makes your AI add a headless server start path to a Godot 4 project (ENet or WebSocket), export it for Linux and add the health page. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/godot-dedicated/* ## When to use this prompt Your Godot 4 game already has working multiplayer with ENet or WebSocket, and you need a server that runs without a window on Linux. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Draft. The manifest is checked; the engine steps are not yet proven. **Godot 4: run as a dedicated server** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Make this Godot 4 project run as a dedicated server on Linux. Keep gameplay and networking code unchanged. If a step is already done, skip it and say so. Work out first whether the game uses ENet (UDP) or WebSocket. 1. Add a server start path used only when the game is launched with --headless and the user argument --server (the exported program receives it as: ./server.x86_64 --headless -- --server). Create the peer with ENetMultiplayerPeer.create_server(port, max_clients) or WebSocketMultiplayerPeer.create_server(port), where port is OS.get_environment("PORT") or 7777. A WebSocket server must accept connections at the root path "/" and its side HTTP listener (step 2) must use a different port. Load no player scene and no UI. 2. Add a side HTTP listener on TCP 8080 with TCPServer for R2 and R3, and a loopback listener for R4 that reports the peer count. 3. Shutdown (R5): handle NOTIFICATION_WM_CLOSE_REQUEST and prove with a real kill -TERM that Godot exits and your save is written. If SIGTERM does not trigger it on this Godot version, tell me and propose a safe alternative instead of guessing. 4. Export: godot --headless --export-release "Linux" build/server.x86_64 (an export preset for Linux x86-64 with the Dedicated Server feature if your version has one). Server requirements (all exact): R1 Listen on 0.0.0.0 (never 127.0.0.1 only, never a random port). The game port comes from the -port argument (or the PORT environment variable) and defaults to 7777. R2 Health probe: a small side HTTP listener on TCP port 8080. GET /health answers HTTP 200 with the body exactly "ok" within 3 seconds. It must not touch game state. Return 503 if the server loop is stalled or shutting down. R3 Join probe: GET /join-probe on the same side listener answers 200 with a body that contains "joinable" while a new player could be admitted, otherwise 503 with the body "full" or "stopping". It needs no login and exposes nothing private. R4 Player count: a second HTTP listener bound to 127.0.0.1 only, port 9090. GET /players answers 200 with JSON {"players": N}, where N is the number of connected players, a whole number from 0 to 10,000, in a body under 4 KB. Do not count a health probe, a join probe or a player who is only in a reconnect grace window. R5 Shutdown: on SIGTERM (and SIGINT) stop admitting players, tell connected clients, write the save atomically (write a temporary file in the same folder, flush it, then rename it) under /game/saves, close sockets and exit with code 0 within the grace seconds. R6 Saves and every other file the server writes live under /game/saves only. Read the folder from an environment variable SAVE_DIR and default to /game/saves (use ./saves when running on your own computer). R7 Log events (join, leave, error), not every tick. The host drops log lines above its rate limit. Run the listeners on a background thread or task. Read the player count and the "accepting players" flag from values the main game loop updates. 5. Write ncg.json. For ENet: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./build" }, "manifest": { "engine": "godot-enet", "transport": "udp", "platforms": [ "windows" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server.x86_64", "--headless", "--", "--server" ], "ports": [ { "port": 7777, "protocol": "udp" }, { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- For WebSocket (the WebSocket game port is listed first on purpose, because the gateway connects to the first TCP port): ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./build" }, "manifest": { "engine": "godot-websocket", "transport": "wss", "platforms": [ "web" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server.x86_64", "--headless", "--", "--server" ], "ports": [ { "port": 7777, "protocol": "tcp" }, { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- About ncg.json (the project file the ncg tool reads; it is never packed into the upload): - Write it in the project root with exactly the content shown. Change only: "game.name" (the real name of the game, 1 to 100 characters), "build.dir" (the folder that holds the final Linux server files), "manifest.platforms" (the platforms the game's players really use) and, where a step says so, the program name in "manifest.command". - Everything inside the build folder becomes /game on the host, so "/game/server" means the file "server" at the top of that folder. - "ncg pack " only zips a folder into the upload and checks it. It does not build, bundle or install anything, so every step above that builds something is yours. Proof (run these and show me the real output): P1 Start the finished Linux server the way the host will: the exact command from ncg.json, in a Linux shell (WSL or an ubuntu:24.04 container if you are on Windows or Mac), with no environment variables set except PATH, LANG and HOME. P2 curl -s -w " %{http_code}" http://127.0.0.1:8080/health must print ok and 200. P3 curl -s http://127.0.0.1:9090/players must print {"players":0}. Connect one real client: it must become {"players":1}. P4 Send SIGTERM (kill -TERM ). The process must exit with code 0 inside the grace seconds and the save file must exist and parse. P5 If the ncg tool is installed, run "ncg check" in the project folder and fix everything it lists. If it is not installed, say so; do not write a substitute. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Go, Rust, C# or C++ server for NetCraftGames > A copy-paste prompt that makes your AI prepare a server with its own TCP or UDP protocol for the limited Custom native lane: Linux build, health, hello line. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/native-custom/* ## When to use this prompt Your server is not built on a supported engine library. It speaks its own TCP or UDP protocol and you are happy that players connect straight to its address and port. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Draft. The manifest is checked; the engine steps are not yet proven. **Go, Rust, C#, C++ or Java server with its own protocol** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Prepare this server (it has its own TCP or UDP protocol) for the NetCraftGames Custom native lane. This lane is configuration and deployment only: players connect straight to the server address and port. There is no gateway, no TLS from us and no origin check. 1. Build for Linux x86-64 (Go: GOOS=linux GOARCH=amd64 CGO_ENABLED=0; Rust: the x86_64-unknown-linux-gnu target; C++, C# and Java: build on ubuntu:24.04 or older so glibc is 2.39 or older). 2. For a TCP game, follow R1 to R7 below. For a UDP-only game, keep the UDP game port on 7777 and instead add a small HTTP side listener on TCP 8080 that answers /health with "ok" and /join-probe with a body containing "joinable", and declare both ports. Server requirements (all exact): R1 Listen on 0.0.0.0 (never 127.0.0.1 only, never a random port). Read the port from the PORT environment variable and default to 47777. R2 Health probe: the port accepts a TCP connection within 3 seconds. An open port alone proves nothing about your game, so R3 matters more. R3 Join probe: as soon as a client connects, the server speaks first and sends a fixed hello line that ends with a newline, for example "MYGAME-READY v1", within 3 seconds and within the first 4096 bytes. The host looks for the expected text anywhere in what it receives. Use a hello line that only your game sends. R4 Player count: a second HTTP listener bound to 127.0.0.1 only, port 9090. GET /players answers 200 with JSON {"players": N}, where N is the number of connected players, a whole number from 0 to 10,000, in a body under 4 KB. Do not count a health probe, a join probe or a player who is only in a reconnect grace window. R5 Shutdown: on SIGTERM (and SIGINT) stop admitting players, tell connected clients, write the save atomically (write a temporary file in the same folder, flush it, then rename it) under /game/saves, close sockets and exit with code 0 within the grace seconds. R6 Saves and every other file the server writes live under /game/saves only. Read the folder from an environment variable SAVE_DIR and default to /game/saves (use ./saves when running on your own computer). R7 Log events (join, leave, error), not every tick. The host drops log lines above its rate limit. 3. Write ncg.json. TCP game with a hello line: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./build" }, "manifest": { "engine": "custom-native", "transport": "tcp", "platforms": [ "windows" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 47777, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "tcp", "port": 47777 }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "tcp", "port": 47777, "expected": "MYGAME-READY" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- UDP game with the HTTP side listener: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./build" }, "manifest": { "engine": "custom-native", "transport": "udp", "platforms": [ "windows" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 7777, "protocol": "udp" }, { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- Put your real hello text in "joinProbe.expected" for the TCP game, and the real program name in "command". About ncg.json (the project file the ncg tool reads; it is never packed into the upload): - Write it in the project root with exactly the content shown. Change only: "game.name" (the real name of the game, 1 to 100 characters), "build.dir" (the folder that holds the final Linux server files), "manifest.platforms" (the platforms the game's players really use) and, where a step says so, the program name in "manifest.command". - Everything inside the build folder becomes /game on the host, so "/game/server" means the file "server" at the top of that folder. - "ncg pack " only zips a folder into the upload and checks it. It does not build, bundle or install anything, so every step above that builds something is yours. Proof (run these and show me the real output): P1 Start the finished server the way the host will: the exact command from ncg.json, in a Linux shell (WSL or an ubuntu:24.04 container if you are on Windows or Mac), with no environment variables set except PATH, LANG and HOME. P2 Read the hello line: bash -c 'exec 3<>/dev/tcp/127.0.0.1/47777; head -n 1 <&3' must print your hello line. P3 curl -s http://127.0.0.1:9090/players must print {"players":0}. Connect one real client: it must become {"players":1}. P4 Send SIGTERM (kill -TERM ). The process must exit with code 0 inside the grace seconds and the save file must exist and parse. P5 If the ncg tool is installed, run "ncg check" in the project folder and fix everything it lists. If it is not installed, say so; do not write a substitute. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Express or Fastify server for NetCraftGames > A copy-paste prompt that makes your AI get an Express or Fastify game server with WebSocket ready for NetCraftGames, on the root path, as one Linux program. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/node-hosting-basics-generic/* ## When to use this prompt Your Node.js server uses Express or Fastify next to the WebSocket server, for example to serve pages or an API. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Manifest checked by our validator. Not yet tried against a real AI. **Planned, not available today:** - Planned, with no date and no promise: Node.js 26 on the server image after it becomes a long-term-support release. Today the image runs Node 24. **Node.js with Express or Fastify and WebSocket** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Make this Express or Fastify game server ready for NetCraftGames. 1. Express: build the HTTP server yourself and attach the WebSocket server to it: const server = http.createServer(app); const wss = new WebSocketServer({ server }); server.listen(Number(process.env.PORT ?? 8080), '0.0.0.0'); Fastify: fastify.listen({ host: '0.0.0.0', port: Number(process.env.PORT ?? 8080) }) with the WebSocket route (@fastify/websocket) at "/" or at one fixed path. 2. Serve R2 and R3 below as ordinary routes (app.get or fastify.get), and keep every other route as it is. 3. Add the loopback player-count listener (R4) and the shutdown handler (R5). On shutdown close the HTTP server and the WebSocket server. 4. Accept WebSocket connections at the root path "/" (simplest). If the code must keep another fixed path such as "/ws", that is fine: declare it as "wsPath" in the manifest (the second ncg.json below) and the gateway connects to exactly that path. Do not use a path that changes for each room or each player: the gateway cannot follow it. Players never connect to the path themselves; they use the gateway address from the connection config. 5. Packaging: our servers provide Node.js 24.21.0 and install nothing, so the upload carries your code and its packages, built for Linux x64 on the owner's computer, not by you and not on the host. - Prefer pure JavaScript packages (ws needs no add-on: leave out the optional bufferutil and utf-8-validate). Stop and ask before adding a package that has a native add-on (a .node file). - package.json: "engines": { "node": ">=24" }, a "start" script that runs your entry file (for example "node server.js"), and only the packages the game needs under "dependencies". - Make sure package-lock.json exists (the owner runs npm install once to create it). Do not edit anything inside node_modules. - If the project is TypeScript, compile it to JavaScript first and tell the owner to pass the built file with --entry . - Do NOT write a start script and do NOT pack anything yourself. The owner runs ncg pack . --node --install which builds .ncg/build (your code under app/, the production packages for Linux x64 and a start script named server that runs node with --max-old-space-size=2048), then ncg check .ncg/build and fixes everything it lists. Server requirements (all exact): R1 Listen on 0.0.0.0 (never 127.0.0.1 only, never a random port). Read the port from the PORT environment variable and default to 8080. R2 Health probe: an HTTP GET /health on TCP port 8080 answers HTTP 200 with the body exactly "ok" within 3 seconds. It must not touch a database or game state. Return 503 if the server loop is stalled or shutting down. R3 Join probe: an HTTP GET /join-probe on the same port answers 200 with a body that contains "joinable" while a new player could be admitted, otherwise 503 with the body "full" or "stopping". It needs no login and exposes nothing private. R4 Player count: a second HTTP listener bound to 127.0.0.1 only, port 9090. GET /players answers 200 with JSON {"players": N}, where N is the number of connected players, a whole number from 0 to 10,000, in a body under 4 KB. Do not count a health probe, a join probe or a player who is only in a reconnect grace window. R5 Shutdown: on SIGTERM (and SIGINT) stop admitting players, tell connected clients, write the save atomically (write a temporary file in the same folder, flush it, then rename it) under /game/saves, close sockets and exit with code 0 within the grace seconds. R6 Saves and every other file the server writes live under /game/saves only. Read the folder from an environment variable SAVE_DIR and default to /game/saves (use ./saves when running on your own computer). R7 Log events (join, leave, error), not every tick. The host drops log lines above its rate limit. 6. Write ncg.json with exactly this content: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": ".ncg/build" }, "manifest": { "engine": "browser-wss", "transport": "wss", "platforms": [ "web" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- If the WebSocket route keeps a path (for example '/ws'), write this ncg.json instead; it differs only in "wsPath": ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": ".ncg/build" }, "manifest": { "engine": "browser-wss", "transport": "wss", "platforms": [ "web" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true, "wsPath": "/ws" } } ----- ncg.json (end) ----- About ncg.json (the project file the ncg tool reads; it is never packed into the upload): - Write it in the project root with exactly the content shown. Change only: "game.name" (the real name of the game, 1 to 100 characters), "manifest.platforms" (the platforms the game's players really use) and, if your server uses another port, the port numbers in "manifest.ports", "manifest.health" and "manifest.joinProbe". - "build.dir" is ".ncg/build": the folder that "ncg pack . --node --install" (or "--python --install") builds for you from this project: your code under app/, the packages for Linux x64, and a start script named "server" that the manifest starts as "/game/server". Do not write that script yourself. - Run "ncg pack" again after every change: it rebuilds .ncg/build from scratch and never changes your own files. Proof (run these and show me the real output): P1 Start the finished server the way the host will: the exact command from ncg.json, in a Linux shell (WSL or an ubuntu:24.04 container if you are on Windows or Mac), with no environment variables set except PATH, LANG and HOME. P2 curl -s -w " %{http_code}" http://127.0.0.1:8080/health must print ok and 200. P3 curl -s http://127.0.0.1:9090/players must print {"players":0}. Connect one real client: it must become {"players":1}. P4 Send SIGTERM (kill -TERM ). The process must exit with code 0 inside the grace seconds and the save file must exist and parse. P5 If the ncg tool is installed, run "ncg check" in the project folder and fix everything it lists. If it is not installed, say so; do not write a substitute. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Node.js socket.io server for NetCraftGames > A copy-paste prompt that makes your AI get a socket.io server ready for NetCraftGames: WebSocket only, a fixed path in the manifest, health page, clean stop and packaging with ncg pack. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/node-socketio/* ## When to use this prompt Your game server is written in JavaScript with socket.io (version 3 or 4) and your browser game connects to it with the socket.io client. socket.io normally starts with plain web requests (long polling) and upgrades to a WebSocket later. Our gateway passes WebSocket connections only, so the game has to connect with WebSocket from the first byte. The prompt makes that change on both sides and writes the path our gateway uses into the manifest. If your game uses Colyseus or python-socketio, this is not the right prompt: use [the check](https://netcraftgames.com/can-you-host-my-game/) to find the one that is. ## The prompt **Status:** Draft. The manifest is checked; the engine steps are not yet proven. **Planned, not available today:** - Not available: HTTP long polling, the "query" client option and the polling-to-WebSocket upgrade. The gateway passes WebSocket connections only and drops the query a client sends, so a socket.io game must not depend on them. **Node.js with socket.io (WebSocket only)** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Make this socket.io game server ready for NetCraftGames. The gateway passes WebSocket connections only, to one fixed path, so socket.io must use WebSocket only and the manifest names its path. 1. Server: create an http server, then new Server(httpServer, { transports: ['websocket'] }). Keep socket.io's default path "/socket.io/" (if the code sets another path, put that path into "wsPath" below instead). Listen on 0.0.0.0, port Number(process.env.PORT ?? 8080). 2. Client: connect with io('', { path: '/play/', transports: ['websocket'], addTrailingSlash: false }). HTTP long polling is NOT supported and the query string a client sends is NOT passed on, so do not use the "query" client option and do not rely on the polling-to-WebSocket upgrade. Send tokens in the "auth" option: it travels inside the first packet, not in the address. Read the address and game id from the connection config, never hard-code them. 3. Serve /health and /join-probe from the same http server (they are not under "/socket.io/", so they do not collide), then add R4 and R5. 4. Packaging: our servers provide Node.js 24.21.0 and install nothing, so the upload carries your code and its packages, built for Linux x64 on the owner's computer, not by you and not on the host. - Prefer pure JavaScript packages (ws needs no add-on: leave out the optional bufferutil and utf-8-validate). Stop and ask before adding a package that has a native add-on (a .node file). - package.json: "engines": { "node": ">=24" }, a "start" script that runs your entry file (for example "node server.js"), and only the packages the game needs under "dependencies". - Make sure package-lock.json exists (the owner runs npm install once to create it). Do not edit anything inside node_modules. - If the project is TypeScript, compile it to JavaScript first and tell the owner to pass the built file with --entry . - Do NOT write a start script and do NOT pack anything yourself. The owner runs ncg pack . --node --install which builds .ncg/build (your code under app/, the production packages for Linux x64 and a start script named server that runs node with --max-old-space-size=2048), then ncg check .ncg/build and fixes everything it lists. Server requirements (all exact): R1 Listen on 0.0.0.0 (never 127.0.0.1 only, never a random port). Read the port from the PORT environment variable and default to 8080. R2 Health probe: an HTTP GET /health on TCP port 8080 answers HTTP 200 with the body exactly "ok" within 3 seconds. It must not touch a database or game state. Return 503 if the server loop is stalled or shutting down. R3 Join probe: an HTTP GET /join-probe on the same port answers 200 with a body that contains "joinable" while a new player could be admitted, otherwise 503 with the body "full" or "stopping". It needs no login and exposes nothing private. R4 Player count: a second HTTP listener bound to 127.0.0.1 only, port 9090. GET /players answers 200 with JSON {"players": N}, where N is the number of connected players, a whole number from 0 to 10,000, in a body under 4 KB. Do not count a health probe, a join probe or a player who is only in a reconnect grace window. R5 Shutdown: on SIGTERM (and SIGINT) stop admitting players, tell connected clients, write the save atomically (write a temporary file in the same folder, flush it, then rename it) under /game/saves, close sockets and exit with code 0 within the grace seconds. R6 Saves and every other file the server writes live under /game/saves only. Read the folder from an environment variable SAVE_DIR and default to /game/saves (use ./saves when running on your own computer). R7 Log events (join, leave, error), not every tick. The host drops log lines above its rate limit. 5. Write ncg.json with exactly this content. "wsPath" is the path the gateway uses to reach socket.io, including the query Engine.IO needs; the owner fixes it here and nothing a player sends can change it: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": ".ncg/build" }, "manifest": { "engine": "browser-wss", "transport": "wss", "platforms": [ "web" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true, "wsPath": "/socket.io/?EIO=4&transport=websocket" } } ----- ncg.json (end) ----- About ncg.json (the project file the ncg tool reads; it is never packed into the upload): - Write it in the project root with exactly the content shown. Change only: "game.name" (the real name of the game, 1 to 100 characters), "manifest.platforms" (the platforms the game's players really use) and, if your server uses another port, the port numbers in "manifest.ports", "manifest.health" and "manifest.joinProbe". - "build.dir" is ".ncg/build": the folder that "ncg pack . --node --install" (or "--python --install") builds for you from this project: your code under app/, the packages for Linux x64, and a start script named "server" that the manifest starts as "/game/server". Do not write that script yourself. - Run "ncg pack" again after every change: it rebuilds .ncg/build from scratch and never changes your own files. Proof (run these and show me the real output): P1 Start the finished server the way the host will: the exact command from ncg.json, in a Linux shell (WSL or an ubuntu:24.04 container if you are on Windows or Mac), with no environment variables set except PATH, LANG and HOME. P2 curl -s -w " %{http_code}" http://127.0.0.1:8080/health must print ok and 200. P3 curl -s http://127.0.0.1:9090/players must print {"players":0}. Connect one real client: it must become {"players":1}. P4 Send SIGTERM (kill -TERM ). The process must exit with code 0 inside the grace seconds and the save file must exist and parse. P5 If the ncg tool is installed, run "ncg check" in the project folder and fix everything it lists. If it is not installed, say so; do not write a substitute. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Node.js ws server for NetCraftGames > A copy-paste prompt that makes your AI get a Node.js WebSocket server ready for NetCraftGames: health page, clean stop, packaging with ncg pack and ncg.json. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/node-ws-hosting-basics/* ## When to use this prompt Your game server is written in JavaScript or TypeScript with the ws library and your browser game connects to it over WebSocket. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Manifest checked by our validator. Not yet tried against a real AI. **Planned, not available today:** - Planned, with no date and no promise: Node.js 26 on the server image after it becomes a long-term-support release. Today the image runs Node 24. **Node.js WebSocket server (ws)** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Make this Node.js WebSocket game server ready for NetCraftGames. 1. Use one HTTP server and attach the WebSocket server to it: import http from 'node:http'; import { WebSocketServer } from 'ws'; const PORT = Number(process.env.PORT ?? 8080); const server = http.createServer(handleHttp); const wss = new WebSocketServer({ server }); server.listen(PORT, '0.0.0.0'); 2. In handleHttp implement R2 and R3 below exactly, and answer 404 for everything else. 3. Add the loopback player-count listener (R4) and the shutdown handler (R5). 4. Accept WebSocket connections at the root path "/" (simplest). If the code must keep another fixed path such as "/ws", that is fine: declare it as "wsPath" in the manifest (the second ncg.json below) and the gateway connects to exactly that path. Do not use a path that changes for each room or each player: the gateway cannot follow it. Players never connect to the path themselves; they use the gateway address from the connection config. 5. Packaging: our servers provide Node.js 24.21.0 and install nothing, so the upload carries your code and its packages, built for Linux x64 on the owner's computer, not by you and not on the host. - Prefer pure JavaScript packages (ws needs no add-on: leave out the optional bufferutil and utf-8-validate). Stop and ask before adding a package that has a native add-on (a .node file). - package.json: "engines": { "node": ">=24" }, a "start" script that runs your entry file (for example "node server.js"), and only the packages the game needs under "dependencies". - Make sure package-lock.json exists (the owner runs npm install once to create it). Do not edit anything inside node_modules. - If the project is TypeScript, compile it to JavaScript first and tell the owner to pass the built file with --entry . - Do NOT write a start script and do NOT pack anything yourself. The owner runs ncg pack . --node --install which builds .ncg/build (your code under app/, the production packages for Linux x64 and a start script named server that runs node with --max-old-space-size=2048), then ncg check .ncg/build and fixes everything it lists. Server requirements (all exact): R1 Listen on 0.0.0.0 (never 127.0.0.1 only, never a random port). Read the port from the PORT environment variable and default to 8080. R2 Health probe: an HTTP GET /health on TCP port 8080 answers HTTP 200 with the body exactly "ok" within 3 seconds. It must not touch a database or game state. Return 503 if the server loop is stalled or shutting down. R3 Join probe: an HTTP GET /join-probe on the same port answers 200 with a body that contains "joinable" while a new player could be admitted, otherwise 503 with the body "full" or "stopping". It needs no login and exposes nothing private. R4 Player count: a second HTTP listener bound to 127.0.0.1 only, port 9090. GET /players answers 200 with JSON {"players": N}, where N is the number of connected players, a whole number from 0 to 10,000, in a body under 4 KB. Do not count a health probe, a join probe or a player who is only in a reconnect grace window. R5 Shutdown: on SIGTERM (and SIGINT) stop admitting players, tell connected clients, write the save atomically (write a temporary file in the same folder, flush it, then rename it) under /game/saves, close sockets and exit with code 0 within the grace seconds. R6 Saves and every other file the server writes live under /game/saves only. Read the folder from an environment variable SAVE_DIR and default to /game/saves (use ./saves when running on your own computer). R7 Log events (join, leave, error), not every tick. The host drops log lines above its rate limit. 6. Write ncg.json with exactly this content: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": ".ncg/build" }, "manifest": { "engine": "browser-wss", "transport": "wss", "platforms": [ "web" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- If the WebSocket server keeps a path (for example new WebSocketServer({ server, path: '/ws' })), write this ncg.json instead; it differs only in "wsPath": ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": ".ncg/build" }, "manifest": { "engine": "browser-wss", "transport": "wss", "platforms": [ "web" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true, "wsPath": "/ws" } } ----- ncg.json (end) ----- About ncg.json (the project file the ncg tool reads; it is never packed into the upload): - Write it in the project root with exactly the content shown. Change only: "game.name" (the real name of the game, 1 to 100 characters), "manifest.platforms" (the platforms the game's players really use) and, if your server uses another port, the port numbers in "manifest.ports", "manifest.health" and "manifest.joinProbe". - "build.dir" is ".ncg/build": the folder that "ncg pack . --node --install" (or "--python --install") builds for you from this project: your code under app/, the packages for Linux x64, and a start script named "server" that the manifest starts as "/game/server". Do not write that script yourself. - Run "ncg pack" again after every change: it rebuilds .ncg/build from scratch and never changes your own files. Proof (run these and show me the real output): P1 Start the finished server the way the host will: the exact command from ncg.json, in a Linux shell (WSL or an ubuntu:24.04 container if you are on Windows or Mac), with no environment variables set except PATH, LANG and HOME. P2 curl -s -w " %{http_code}" http://127.0.0.1:8080/health must print ok and 200. P3 curl -s http://127.0.0.1:9090/players must print {"players":0}. Connect one real client: it must become {"players":1}. P4 Send SIGTERM (kill -TERM ). The process must exit with code 0 inside the grace seconds and the save file must exist and parse. P5 If the ncg tool is installed, run "ncg check" in the project folder and fix everything it lists. If it is not installed, say so; do not write a substitute. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Python WebSocket server for NetCraftGames > A copy-paste prompt that gets your AI to ready a Python WebSocket server for NetCraftGames: packages in the upload, health page, clean stop. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/python-ws-hosting-basics/* ## When to use this prompt Your game server is written in Python with the websockets library or FastAPI, and your browser game connects to it over WebSocket. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Draft. The manifest is checked; the engine steps are not yet proven. **Python WebSocket server (websockets or FastAPI)** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Make this Python WebSocket game server ready for NetCraftGames. The host runs Python 3.12. Option A, the websockets library (version 13 or newer): - Serve with: async with serve(handler, '0.0.0.0', int(os.environ.get('PORT', 8080)), process_request=process_request): await asyncio.Future() - In process_request(connection, request): for request.path == '/health' return connection.respond(HTTPStatus.OK, 'ok'); for '/join-probe' return a 200 response whose body contains 'joinable' while players can join; return None for the WebSocket request. Option B, FastAPI on uvicorn: @app.get('/health') and @app.get('/join-probe'), run with uvicorn.run(app, host='0.0.0.0', port=int(os.environ.get('PORT', 8080))). Accept WebSocket connections at the root path "/" (simplest). If the code must keep another fixed path such as "/ws", that is fine: declare it as "wsPath" in the manifest (the second ncg.json below) and the gateway connects to exactly that path. Do not use a path that changes for each room or each player: the gateway cannot follow it. Players never connect to the path themselves; they use the gateway address from the connection config. With FastAPI that means @app.websocket('/') or one fixed route such as @app.websocket('/ws'). Add R4 (a second tiny server on 127.0.0.1) and R5 (loop.add_signal_handler for SIGTERM and SIGINT). Packaging: the host has Python 3.12 but none of your libraries, and nothing is installed there. - List the packages in requirements.txt, one per line, with versions. Use packages that publish Linux wheels; stop and tell me which package has none, because nothing is compiled. - Do NOT write a start script and do NOT pack anything yourself. The owner runs ncg pack . --python --install which installs the packages as Linux wheels (Python 3.12, manylinux) into a vendor folder inside .ncg/build, puts your code under app/ and writes the start script named server. Then ncg check .ncg/build and fix everything it lists. Server requirements (all exact): R1 Listen on 0.0.0.0 (never 127.0.0.1 only, never a random port). Read the port from the PORT environment variable and default to 8080. R2 Health probe: an HTTP GET /health on TCP port 8080 answers HTTP 200 with the body exactly "ok" within 3 seconds. It must not touch a database or game state. Return 503 if the server loop is stalled or shutting down. R3 Join probe: an HTTP GET /join-probe on the same port answers 200 with a body that contains "joinable" while a new player could be admitted, otherwise 503 with the body "full" or "stopping". It needs no login and exposes nothing private. R4 Player count: a second HTTP listener bound to 127.0.0.1 only, port 9090. GET /players answers 200 with JSON {"players": N}, where N is the number of connected players, a whole number from 0 to 10,000, in a body under 4 KB. Do not count a health probe, a join probe or a player who is only in a reconnect grace window. R5 Shutdown: on SIGTERM (and SIGINT) stop admitting players, tell connected clients, write the save atomically (write a temporary file in the same folder, flush it, then rename it) under /game/saves, close sockets and exit with code 0 within the grace seconds. R6 Saves and every other file the server writes live under /game/saves only. Read the folder from an environment variable SAVE_DIR and default to /game/saves (use ./saves when running on your own computer). R7 Log events (join, leave, error), not every tick. The host drops log lines above its rate limit. Write ncg.json with exactly this content: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": ".ncg/build" }, "manifest": { "engine": "browser-wss", "transport": "wss", "platforms": [ "web" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- If the WebSocket route keeps a path (for example '/ws'), write this ncg.json instead; it differs only in "wsPath": ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": ".ncg/build" }, "manifest": { "engine": "browser-wss", "transport": "wss", "platforms": [ "web" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/server" ], "ports": [ { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true, "wsPath": "/ws" } } ----- ncg.json (end) ----- About ncg.json (the project file the ncg tool reads; it is never packed into the upload): - Write it in the project root with exactly the content shown. Change only: "game.name" (the real name of the game, 1 to 100 characters), "manifest.platforms" (the platforms the game's players really use) and, if your server uses another port, the port numbers in "manifest.ports", "manifest.health" and "manifest.joinProbe". - "build.dir" is ".ncg/build": the folder that "ncg pack . --node --install" (or "--python --install") builds for you from this project: your code under app/, the packages for Linux x64, and a start script named "server" that the manifest starts as "/game/server". Do not write that script yourself. - Run "ncg pack" again after every change: it rebuilds .ncg/build from scratch and never changes your own files. Proof (run these and show me the real output): P1 Start the finished server the way the host will: the exact command from ncg.json, in a Linux shell (WSL or an ubuntu:24.04 container if you are on Windows or Mac), with no environment variables set except PATH, LANG and HOME. P2 curl -s -w " %{http_code}" http://127.0.0.1:8080/health must print ok and 200. P3 curl -s http://127.0.0.1:9090/players must print {"players":0}. Connect one real client: it must become {"players":1}. P4 Send SIGTERM (kill -TERM ). The process must exit with code 0 inside the grace seconds and the save file must exist and parse. P5 If the ncg tool is installed, run "ncg check" in the project folder and fix everything it lists. If it is not installed, say so; do not write a substitute. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Unity dedicated server for NetCraftGames > A copy-paste prompt that makes your AI add a headless Linux server mode to a Unity project that uses Netcode for GameObjects or Mirror, and build it. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/unity-dedicated/* ## When to use this prompt Your Unity game has working multiplayer, but there is no server mode that runs without a window, or it has one and needs the health page and clean stop. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Manifest checked by our validator. Not yet tried against a real AI. **Unity: add a dedicated-server mode** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Add a dedicated-server mode to this Unity project that runs on Linux with no window, and build it. Use the Unity version already in ProjectSettings/ProjectVersion.txt. If a server mode already exists, check each step below, skip what is already done and say so. 1. Detect which networking this project uses (Netcode for GameObjects or Mirror) and tell me which. Do not switch libraries. 2. Add a server entry point that runs only in a Linux Dedicated Server build: start the server (not a host), listen on 0.0.0.0 on the port from the -port argument (default 7777), create no player object, no UI and no camera work. Use #if UNITY_SERVER or Application.isBatchMode so client behaviour stays unchanged. 3. Add the side listeners in the same build (R2, R3 and R4 below), using System.Net.HttpListener. Count connected clients from the networking library. 4. Shutdown (R5): make sure SIGTERM on Linux leads to a normal quit (handle Application.quitting) and write the save under /game/saves before exit. Do not rely on Application.persistentDataPath. 5. Build: File > Build Profiles > Linux > enable Server (Dedicated Server) > Architecture x86_64 > Build. Do not enable IL2CPP unless the project already uses it. Keep every compiled plugin at glibc 2.39 or older. Do not ship the editor or any *_DoNotShip folder. Server requirements (all exact): R1 Listen on 0.0.0.0 (never 127.0.0.1 only, never a random port). The game port comes from the -port argument (or the PORT environment variable) and defaults to 7777. R2 Health probe: a small side HTTP listener on TCP port 8080. GET /health answers HTTP 200 with the body exactly "ok" within 3 seconds. It must not touch game state. Return 503 if the server loop is stalled or shutting down. R3 Join probe: GET /join-probe on the same side listener answers 200 with a body that contains "joinable" while a new player could be admitted, otherwise 503 with the body "full" or "stopping". It needs no login and exposes nothing private. R4 Player count: a second HTTP listener bound to 127.0.0.1 only, port 9090. GET /players answers 200 with JSON {"players": N}, where N is the number of connected players, a whole number from 0 to 10,000, in a body under 4 KB. Do not count a health probe, a join probe or a player who is only in a reconnect grace window. R5 Shutdown: on SIGTERM (and SIGINT) stop admitting players, tell connected clients, write the save atomically (write a temporary file in the same folder, flush it, then rename it) under /game/saves, close sockets and exit with code 0 within the grace seconds. R6 Saves and every other file the server writes live under /game/saves only. Read the folder from an environment variable SAVE_DIR and default to /game/saves (use ./saves when running on your own computer). R7 Log events (join, leave, error), not every tick. The host drops log lines above its rate limit. Run the listeners on a background thread or task. Read the player count and the "accepting players" flag from values the main game loop updates. 6. Write ncg.json for the library you found, with the server program name from your build in "manifest.command". Netcode for GameObjects: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./Build/LinuxServer" }, "manifest": { "engine": "unity-ngo", "transport": "udp", "platforms": [ "windows" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/UnityServer.x86_64", "-batchmode", "-nographics", "-port", "7777" ], "ports": [ { "port": 7777, "protocol": "udp" }, { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- Mirror with the default KCP transport: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./Build/LinuxServer" }, "manifest": { "engine": "unity-mirror", "transport": "udp", "platforms": [ "windows" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/UnityServer.x86_64", "-batchmode", "-nographics", "-port", "7777" ], "ports": [ { "port": 7777, "protocol": "udp" }, { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- Mirror with the Telepathy (TCP) transport instead: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./Build/LinuxServer" }, "manifest": { "engine": "unity-mirror", "transport": "tcp", "platforms": [ "windows" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/UnityServer.x86_64", "-batchmode", "-nographics", "-port", "7777" ], "ports": [ { "port": 7777, "protocol": "tcp" }, { "port": 8080, "protocol": "tcp" } ], "profile": "standard", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 30 }, "idleSupported": true } } ----- ncg.json (end) ----- About ncg.json (the project file the ncg tool reads; it is never packed into the upload): - Write it in the project root with exactly the content shown. Change only: "game.name" (the real name of the game, 1 to 100 characters), "build.dir" (the folder that holds the final Linux server files), "manifest.platforms" (the platforms the game's players really use) and, where a step says so, the program name in "manifest.command". - Everything inside the build folder becomes /game on the host, so "/game/server" means the file "server" at the top of that folder. - "ncg pack " only zips a folder into the upload and checks it. It does not build, bundle or install anything, so every step above that builds something is yours. Proof (run these and show me the real output): P1 Start the finished Linux server the way the host will: the exact command from ncg.json, in a Linux shell (WSL or an ubuntu:24.04 container if you are on Windows or Mac), with no environment variables set except PATH, LANG and HOME. P2 curl -s -w " %{http_code}" http://127.0.0.1:8080/health must print ok and 200. P3 curl -s http://127.0.0.1:9090/players must print {"players":0}. Connect one real client: it must become {"players":1}. P4 Send SIGTERM (kill -TERM ). The process must exit with code 0 inside the grace seconds and the save file must exist and parse. P5 If the ncg tool is installed, run "ncg check" in the project folder and fix everything it lists. If it is not installed, say so; do not write a substitute. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Build your Unity server for Linux > A copy-paste prompt that makes your AI build an existing Unity dedicated server for Linux x86-64 and check the glibc version it needs. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/unity-linux-build/* ## When to use this prompt Your Unity project already has a server mode, but you only built it for Windows or Mac. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Draft. The manifest is checked; the engine steps are not yet proven. **Unity: build the server I have for Linux** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Build the existing Unity dedicated server for Linux x86-64. Do not change gameplay or networking code. 1. In Unity Hub add the Linux Dedicated Server Build Support module for this editor version. Then File > Build Profiles > Linux > enable Server (Dedicated Server) > Architecture x86_64 > Build. 2. Start the result in an ubuntu:24.04 container or WSL with: ./YourServer.x86_64 -batchmode -nographics -port 7777 and confirm it stays running and accepts a client. 3. Check the glibc it needs: objdump -T YourServer.x86_64 UnityPlayer.so | grep -o "GLIBC_[0-9.]*" | sort -uV | tail -1 must print GLIBC_2.39 or lower. 4. Then run the prompt "Unity: add a dedicated-server mode" from its step 3 on (side listeners, shutdown, ncg.json). Tell me when step 3 is done. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Unreal Engine Linux server for NetCraftGames > A copy-paste prompt that makes your AI package an Unreal Engine Linux dedicated server and add the health page and clean stop. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/unreal-dedicated/* ## When to use this prompt Your Unreal Engine game replicates correctly in a listen-server or editor test, and you need the Linux dedicated server package. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Draft. The manifest is checked; the engine steps are not yet proven. **Unreal Engine: package a Linux dedicated server** ```text You are preparing an existing multiplayer game so a hosting service (NetCraftGames) can run its dedicated server on a Linux machine. Rules for you: - Make ONLY the changes listed below. Do not redesign game logic. Do not add multiplayer to a game that has none. If something below cannot be done without a redesign, stop and tell me instead of improvising. - Never put a password, key or token in code or in any file. Read secrets from environment variables. - Run every proof step at the end and show me the real output. If a proof step fails, fix it or tell me exactly why you cannot. - If a step needs a tool you do not have, say so and stop at that step. Do not invent a substitute and do not pretend the step passed. Facts about the host (exact): - Linux x86-64, glibc 2.39 or older for every compiled program in the upload. - The server starts as an unprivileged user in /game. Writable places: /game/saves and a 256 MB /tmp. Nothing is installed, downloaded or compiled on the host. The start command is a fixed list of arguments, not a shell string. - The host (Ubuntu 24.04 LTS) provides these programs: sh, bash, dash, python3, node, node24 (Python 3.12, Node.js 24.21.0). There is no Java, .NET, Deno or Bun on the host unless you ship it inside the upload. - Nothing is installed or downloaded on the host: packages travel inside the upload, built for Linux x64 on the owner's own computer. - A game server cannot look up other websites by name (DNS is closed to it on purpose), so do not make the server depend on calling an outside address by name. - The host does not set a PORT variable. The port your server uses by default must be the port written in the manifest. - The host stops the server with SIGTERM and waits up to the number of seconds in the manifest (between 1 and 300). - The upload is one .tar.gz of at most 512 MiB with at most 10,000 files, no symlinks and no setuid files. - The host checks your server from outside with a 3 second timeout per request. TASK: Package this Unreal Engine project's Linux dedicated server. Do not change replication or gameplay. If a step is already done, skip it and say so. 1. Make sure a Server target exists (YourGameServer.Target.cs). Package for Linux, server only: RunUAT BuildCookRun -project="YourGame.uproject" -platform=Linux -server -noclient -serverconfig=Shipping -cook -build -stage -pak -archive. 2. Start it with: ./YourGameServer.sh /Game/Maps/YourStartMap -port=7777 -log and confirm it stays running with no display. 3. Add a small side HTTP listener on TCP 8080 (Unreal's HTTP server module, or a tiny socket server in a game instance subsystem) for R2 and R3, and a loopback listener for R4 that reports the number of connected player controllers. 4. Shutdown (R5): verify with a real kill -TERM that the server exits cleanly and writes its save under /game/saves. If SIGTERM does not do that on this Unreal version, tell me and propose a safe alternative instead of guessing. Server requirements (all exact): R1 Listen on 0.0.0.0 (never 127.0.0.1 only, never a random port). The game port comes from the -port argument (or the PORT environment variable) and defaults to 7777. R2 Health probe: a small side HTTP listener on TCP port 8080. GET /health answers HTTP 200 with the body exactly "ok" within 3 seconds. It must not touch game state. Return 503 if the server loop is stalled or shutting down. R3 Join probe: GET /join-probe on the same side listener answers 200 with a body that contains "joinable" while a new player could be admitted, otherwise 503 with the body "full" or "stopping". It needs no login and exposes nothing private. R4 Player count: a second HTTP listener bound to 127.0.0.1 only, port 9090. GET /players answers 200 with JSON {"players": N}, where N is the number of connected players, a whole number from 0 to 10,000, in a body under 4 KB. Do not count a health probe, a join probe or a player who is only in a reconnect grace window. R5 Shutdown: on SIGTERM (and SIGINT) stop admitting players, tell connected clients, write the save atomically (write a temporary file in the same folder, flush it, then rename it) under /game/saves, close sockets and exit with code 0 within the grace seconds. R6 Saves and every other file the server writes live under /game/saves only. Read the folder from an environment variable SAVE_DIR and default to /game/saves (use ./saves when running on your own computer). R7 Log events (join, leave, error), not every tick. The host drops log lines above its rate limit. Run the listeners on a background thread or task. Read the player count and the "accepting players" flag from values the main game loop updates. 5. Write ncg.json (profile "large" is recommended for Unreal servers), replacing the program and map names with your real ones: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./Saved/StagedBuilds/LinuxServer" }, "manifest": { "engine": "unreal-replication", "transport": "udp", "platforms": [ "windows" ], "mode": "dedicated", "networkingImplemented": true, "os": "linux", "arch": "x64", "command": [ "/game/YourGameServer.sh", "/Game/Maps/YourStartMap", "-port=7777" ], "ports": [ { "port": 7777, "protocol": "udp" }, { "port": 8080, "protocol": "tcp" } ], "profile": "large", "savePath": "/game/saves", "health": { "type": "http", "port": 8080, "path": "/health", "expected": "ok" }, "playerProbe": { "type": "http", "port": 9090, "path": "/players" }, "joinProbe": { "type": "http", "port": 8080, "path": "/join-probe", "expected": "joinable" }, "shutdown": { "signal": "SIGTERM", "graceSeconds": 60 }, "idleSupported": true } } ----- ncg.json (end) ----- About ncg.json (the project file the ncg tool reads; it is never packed into the upload): - Write it in the project root with exactly the content shown. Change only: "game.name" (the real name of the game, 1 to 100 characters), "build.dir" (the folder that holds the final Linux server files), "manifest.platforms" (the platforms the game's players really use) and, where a step says so, the program name in "manifest.command". - Everything inside the build folder becomes /game on the host, so "/game/server" means the file "server" at the top of that folder. - "ncg pack " only zips a folder into the upload and checks it. It does not build, bundle or install anything, so every step above that builds something is yours. Proof (run these and show me the real output): P1 Start the finished Linux server the way the host will: the exact command from ncg.json, in a Linux shell (WSL or an ubuntu:24.04 container if you are on Windows or Mac), with no environment variables set except PATH, LANG and HOME. P2 curl -s -w " %{http_code}" http://127.0.0.1:8080/health must print ok and 200. P3 curl -s http://127.0.0.1:9090/players must print {"players":0}. Connect one real client: it must become {"players":1}. P4 Send SIGTERM (kill -TERM ). The process must exit with code 0 inside the grace seconds and the save file must exist and parse. P5 If the ncg tool is installed, run "ncg check" in the project folder and fix everything it lists. If it is not installed, say so; do not write a substitute. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more. --- # Browser WebRTC game: use room signaling > A copy-paste prompt that makes your AI connect a browser game that already uses WebRTC to NetCraftGames room signaling. Copy it, paste it into your AI coding assistant, and read what it changes. *NetCraftGames (NCG) by Charging Bull Software. Last updated: 2026-10-03. Canonical page: https://netcraftgames.com/can-you-host-my-game/prompts/webrtc-signaling/* ## When to use this prompt Your browser game connects players directly with WebRTC and only needs somewhere to meet. Players behind strict routers may fail to connect, because we do not relay. If you are not sure this is the right prompt, answer the five questions on [the check](https://netcraftgames.com/can-you-host-my-game/) first: it names the one prompt that fits. ## The prompt **Status:** Draft. The manifest is checked; the engine steps are not yet proven. **Browser game with WebRTC: use NetCraftGames room signaling** ```text TASK: This browser game already connects players directly with WebRTC. Connect it to the NetCraftGames room signaling instead of your own signaling server. Do not change the game's WebRTC code. 1. Create a room with POST /api/public/games//rooms and the body {"maxPlayers": 4}. Join with POST /api/public/games//rooms/join and the body {"code": "ROOMCODE"}. maxPlayers is a whole number from 2 to 16. Both calls return {roomId, code, peerId, token, wsUrl, iceServers}. Open wsUrl with the room token and exchange offer, answer and ICE messages through it. Read the address and game id from the connection config, never hard-code them. 2. This service does NOT relay game traffic and has no TURN media relay. Players behind strict routers may fail to connect. Tell me how the game behaves when a peer cannot connect. 3. Write ncg.json with exactly this content. Change "signalingAdapterImplemented" to true only after you have wired the room signaling AND tested it with two browsers: ----- ncg.json (start) ----- { "ncg": 1, "game": { "name": "My Game" }, "version": "0.1.0", "build": { "dir": "./" }, "manifest": { "engine": "browser-wss", "transport": "webrtc", "platforms": [ "web" ], "mode": "relayed", "networkingImplemented": true, "profile": "standard", "signalingAdapterImplemented": true } } ----- ncg.json (end) ----- About ncg.json (the project file the ncg tool reads): - Write it in the project root with exactly the content shown. Change only "game.name" (the real name of the game, 1 to 100 characters) and "manifest.platforms". - This lane has no server build to upload: there is nothing to pack, and no program of yours runs on the host. 4. If the ncg tool is installed, run "ncg check" in the project folder. If it is not installed, say so. ``` ## After your AI finishes 1. Read what it changed. It was told to change only what the prompt lists and to stop and ask when something needs a redesign. 2. Run the game with two real players. A prompt cannot prove your game plays well. 3. Come back to [the check](https://netcraftgames.com/can-you-host-my-game/) and answer again, or run the local check the prompt ends with when you have the ncg tool. ## Related pages - [Can NetCraftGames host my game?](https://netcraftgames.com/can-you-host-my-game/): Five plain questions tell you if NetCraftGames can host your multiplayer game: Yes, Almost with the one change to make, or Not yet. Nothing is uploaded. - [AI prompts to get your game ready for hosting](https://netcraftgames.com/can-you-host-my-game/prompts/): Copy-paste prompts for your AI coding assistant: add a server mode, a health page and a clean stop, and write the settings file NetCraftGames needs. - [Multiplayer hosting glossary](https://netcraftgames.com/glossary/): Plain-English definitions of dedicated server, headless, UDP, WebSocket, WSS, WebRTC, STUN, TURN, ENet, KCP, manifest, join probe, weighted hour and more.