Discover how Edgegap works

Discover how Edgegap works

Godot Engine

Arena Shooter

Deploy to Edgegap

Published

Published

Published

Arena Shooter: Run Dumpster Fire Labs' Godot 4 shooter on Edgegap dedicated servers, with Matchmaking

Arena Shooter: Run Dumpster Fire Labs' Godot 4 shooter on Edgegap dedicated servers, with Matchmaking

Arena Shooter is Edgegap's fork of Super Star Fighter, Dumpster Fire Labs' top-down multiplayer arena shooter, built with Godot 4.7.2. Pilots draft a new upgrade card every round, and the cards stack until a small starter ship becomes a screen-filling mess.

The game's netcode doesn't change. Its dedicated server already runs the whole simulation, so every player sees the same fight. The fork adds a FIND MATCH tab and a small server lifecycle script, in their own folders.

Players press FIND MATCH, Edgegap's matchmaker groups them and starts a dedicated game server for the match. The clients join it over a secure WebSocket (wss://), bots fill the empty seats, and the server stops itself when the match is over.

Edgegap's network spans 615+ Edge Cloud locations (learn more). Each server is deployed to the best available location for its players and billed only while the match runs.

Platforms: Windows, macOS and Linux (x64 and ARM64) desktop clients; Linux x86_64 dedicated server on Edgegap. Matchmaking was tested with Windows clients. Original game, Super Star Fighter, by Dumpster Fire Labs; code under the MIT licence. Its music and logo are reserved, so the fork leaves them out (asset licence).

How it works

  1. A player presses FIND MATCH. The client sends a ticket to the Edgegap matchmaker and checks it every 2 seconds.

  2. The matchmaker groups 2 to 4 players (a lone player after 30 seconds) and starts a dedicated server near them. The server reads how many players were matched.

  3. Each matched client receives the server's address and joins it at wss://<host>:<port> through the game's own Direct Connect screen. The lobby password is the deployment's ID, which only matched players are given.

  4. The match starts when every matched player is in, or 30 seconds after the first one joins. NPC pilots fill the empty seats up to 4 ships, so a solo player still gets a game.

  5. 20 seconds after the final results, the server stops its own deployment. Players queue again for the next match.

What the fork changed:

Path

What it does

src/shared/edgegap/edgegap_server.gd

Server lifecycle on Edgegap: lobby password, auto start, NPC fill, self-stop. Does nothing outside an Edgegap deployment.

src/client/edgegap/edgegap_find_match.gd

The FIND MATCH tab: matchmaker tickets, then join through Direct Connect.

src/client/edgegap/edgegap_settings.gd

Matchmaker URL, Auth Token, profile and port name.

edgegap/Dockerfile

Server image from the Linux x86_64 dedicated server package.

edgegap/matchmaker-config.json

Matchmaker config: one casual profile, 2 to 4 players.

src/bootstrap.gd, src/server/server_main.gd, src/client/ui/connection_controller.gd

A few one-line hooks that call the files above.

No credit card required. Free tier includes the resources to deploy a real game server.

No credit card required. Free tier includes the resources to deploy a real game server.

Top-down match in a neon Godot arena shooter: ships tagged by pilot and team, with the Godot logo.

A neon arena shooter in Godot 4, on an Edgegap dedicated server.

Step-by-Step Guide

Run the Sample

1. Before you start

  • A free Edgegap account. No credit card is needed to test.

  • Docker Desktop, running, to build the server image.

  • Python 3.11 or newer. The fork's build script downloads Godot 4.7.2 and its export templates into the project, checks them, and installs nothing system-wide. You don't need Godot installed.

  • Clone the fork.

The game never needs your Edgegap API token. Only the matchmaker's Auth Token goes into the client, and it gives no access to your account.

2. Put the game server on Edgegap

From the repository root, download the pinned Godot and build the Linux dedicated server package:

python tools/build.py bootstrap

python tools/build.py build server-linux-x64 --skip-gate

Build the image from that package and push it to your Edgegap registry. The Container Registry page has your project, username and token:

docker build --platform linux/amd64 -f edgegap/Dockerfile -t registry.edgegap.com/<project>/arena-shooter:<tag> builds/beta-19/server-linux-x86_64

docker push registry.edgegap.com/<project>/arena-shooter:<tag>

In the dashboard, create the application godot-arena-shooter and a version (the config uses v1):

  • Your image and tag, with your registry username and token, so Edgegap can pull it.

  • 0.5 vCPU and 1 GB.

  • One port: name gameport, 7000, protocol WS, with TLS Upgrade on. Clients connect with wss://.

Optional environment variables on the version: EDGEGAP_NPC_FILL (default 4, 0 turns NPCs off), EDGEGAP_START_GRACE (30 s), EDGEGAP_JOIN_TIMEOUT (120 s) and EDGEGAP_ROUNDS_TO_WIN (3). Server log lines start with EDGEGAP.

3. Create the matchmaker

  1. Open edgegap/matchmaker-config.json and set application.name and version to the ones from step 2.

  2. In the dashboard, open Matchmaker, select Create Matchmaker, upload the file, then Create and Start.

  3. When it's online, copy its API URL and Auth Token into src/client/edgegap/edgegap_settings.gd. Or leave the file empty and set EDGEGAP_MATCHMAKER_URL and EDGEGAP_MATCHMAKER_TOKEN when you launch the client.

The Auth Token is made to ship in game clients. Never put your Edgegap API token in the client.

4. Play a match

Build the Windows client:

python tools/build.py build windows --skip-gate

The same script builds Linux and macOS clients (clients builds all four), but only Windows clients were tested against Edgegap.

Start two clients and open FIND MATCH, the first tab of the connection screen. Press it in both. The status goes from "Searching for players…" to "Match found. Starting a server near you…", then both clients join the same Edgegap server and land in its lobby.

The match starts when both are in, with 2 NPC pilots to make 4 ships. After the final results, the server waits 20 seconds and stops its deployment on its own. A rematch request still ends it: queue again for the next match.

For a test, EDGEGAP_FIND_MATCH=1 makes a client press FIND MATCH at launch.

5. Add it to your own Godot game

The fork is a working reference: your coding agent can copy its tested files instead of writing them from scratch. Edgegap's edgegap-godot skill also ships game-agnostic versions of the same scripts. Four changes take a Godot game with a dedicated server to Edgegap with matchmaking:

  1. The server runs the match on its own. On an Edgegap deployment it reads the matched player count, starts the match when they're in (or after a grace period), and fills empty seats with bots if your game has them (src/shared/edgegap/edgegap_server.gd).

  2. The server stops itself. When the match ends, or nobody joins, it sends DELETE to the ARBITRIUM_DELETE_URL Edgegap injects, so billing stops.

  3. The client has a Find Match button. It posts a matchmaker ticket, checks it until a server is assigned, then fills in and runs the game's existing join screen with the address (src/client/edgegap/edgegap_find_match.gd, edgegap_settings.gd).

  4. New scripts are exported. The game's export presets use an allowlist, so the fork lists the three Edgegap scripts in export_presets.cfg. Without that, the exported build silently drops them.

Then containerize the server with the fork's edgegap/Dockerfile as a model, and create the app version and matchmaker as in steps 2 and 3.

With your agent:

"Load the edgegap skill, then edgegap-godot. Using github.com/edgegap/game-sample-godot-arena-shooter as the reference, add a server lifecycle that waits for the matched players and stops its own Edgegap deployment, and a Find Match button that queues on the Edgegap matchmaker and joins the assigned server through my game's existing join code."

For each step in detail, by hand, see the Godot Engine integration guide.

6. How matchmaking and self-stop work

The sample's matchmaker config has one profile, casual: one team of 2 to 4 players. After 30 seconds the minimum drops to 1, so a lone player gets a server too. There's no latency rule.

The client talks to the matchmaker with a few HTTP calls, using the Auth Token:

  • POST {API URL}/tickets with {"profile": "casual", "attributes": {}}

  • GET {API URL}/tickets/{id} every 2 seconds, until the status is HOST_ASSIGNED, with the server's host name and the external port of gameport

  • DELETE {API URL}/tickets/{id} if the player cancels

The server asks Edgegap to stop its deployment, which ends billing:

  • 20 seconds after the final results (one match per deployment);

  • when nobody joins within 120 seconds;

  • when everyone has left for 30 seconds.

To size your own matches, set min_team_size and max_team_size in the config, and EDGEGAP_NPC_FILL on the app version. When you ship a new server build, create a new app version and update application.version in the matchmaker (Stop, Edit, Start). The Godot Engine integration guide covers matchmaking for your own game.

Known limits

  • 4 ships per Edgegap match by default. The game supports up to 32 pilots, but the sample's matchmaker matches 2 to 4 players and fills up to 4 ships with NPCs. Bigger Edgegap matches need a larger max_team_size and EDGEGAP_NPC_FILL; they should work but were not tested on Edgegap.

  • One match per deployment. A rematch ends the deployment, and players queue again.

  • Joining is protected by the address, not by tickets. Only matched players get the server's host name, which also carries the lobby password. The server doesn't check each player's ticket ID.

  • Desktop only. The fork has no web export. The game already uses WebSocket, so a web build should be possible, but it's written but not tested. It would also need allowed_cors_origins in the matchmaker config.

  • No music or studio logo. The upstream asset licence reserves them. Sound effects are generated in code and still play.

What was tested

Tested on 20 October 2026, with Godot 4.7.2 and Edgegap matchmaker 3.3.2:

  • Local Docker image with simulated Edgegap variables and two bot clients: the match started on its own with 2 NPCs, and the server stopped after the final results.

  • Direct deployment (Newark): two bot clients over wss:// played a 3-round match, and the deployment stopped itself after 5.4 minutes.

  • Matchmaker: two Windows clients pressed FIND MATCH, were assigned the same server, joined, and the match started with 2 NPCs.

  • Join timeout: deployments nobody joined stopped themselves after 120 seconds.

Outside an Edgegap deployment, the server behaves exactly like the original, so LAN and direct-connect play still work.

Frequently Asked Questions

Questions about running the Godot Arena Shooter sample with Edgegap matchmaking and dedicated servers.

How do I add matchmaking to a Godot game?

Create an Edgegap matchmaker from a JSON config, then add a Find Match button that posts a ticket with HTTPRequest, checks it until a server is assigned, and joins that address. The Arena Shooter sample does this in one GDScript file, reusing the game's own join screen.

Can a Godot game use WebSocket on Edgegap dedicated servers?

Yes. The sample's server listens for WebSocket on port 7000. On the app version, set the port to WS with TLS Upgrade on, and clients connect with wss:// to the server's host name.

What happens when only one player presses Find Match?

After 30 seconds the matchmaker matches them alone, and NPC pilots fill the other seats up to 4 ships. Set EDGEGAP_NPC_FILL to 0 on the app version to turn bots off.

Do Edgegap servers keep running after the match?

Not in this sample. The server stops its own deployment 20 seconds after the final results, or if nobody joins within 120 seconds, so you're only billed while a match runs.

Clients

Learn more from clients who integrated Edgegap

31 case studies are available from studios that moved to Edgegap from another platform.

Key reasons why they chose Edgegap

Discover the impact of Edgegap's automated game server orchestration for a flawless multiplayer experience.

Cost

Pricing

Pricing

Optimize costs and performance with hybrid orchestration

Optimize costs and performance with hybrid orchestration

Optimize costs and performance with hybrid orchestration

Edge Cloud

On-Demand

$0.00115

/ vCPU

/ MINUTE

Billed by the Minute, Only on Usage

Pay only when players play. 0 active servers = $0

Deploy game servers worldwide, per instance, to all 615+ edge cloud locations. Zero commitment.

Simply add a credit card.

Edge Cloud

On-Demand

$0.00115

/ vCPU

/ MINUTE

Billed by the Minute, Only on Usage

Pay only when players play. 0 active servers = $0

Deploy game servers worldwide, per instance, to all 615+ edge cloud locations. Zero commitment.

Simply add a credit card.

Private Fleet (Bare Metal)

Reserved Capacity

$0.0261

/ vCPU

/ HOUR

Billed Monthly, Always On

$280 per host/month (12 mo rate), or $350 monthly

Optimize the cost effectiveness of your game server with egress-free hosting of Private Fleets.

Persistent, available 24/7, exclusive to your studio.

Private Fleet (Bare Metal)

Reserved Capacity

$0.0261

/ vCPU

/ HOUR

Billed Monthly, Always On

$280 per host/month (12 mo rate), or $350 monthly

Optimize the cost effectiveness of your game server with egress-free hosting of Private Fleets.

Persistent, available 24/7, exclusive to your studio.

Your bill varies per rate and usage; which can vary per game type, player count, & more.

Your bill varies per rate and usage; which can vary per game type, player count, & more.

Model your usage with our estimate calculator ->

Model your usage with our estimate calculator ->

Edgegap's features & price: detailed comparison between Edge Cloud & Private Fleets

Edgegap's features & price: detailed comparison between Edge Cloud & Private Fleets

COMPARE

Free Trial

Edge Cloud

Private Fleets

FEATURES

Analytics & Monitoring

Billing Alarms

Click to Expand

28 more rows

Unlocks

Capabilities are unlocked when a credit card is added to the account.

COMPARE

Free Trial

Edge Cloud

Private Fleets

FEATURES

Analytics & Monitoring

Billing Alarms

Click to Expand

28 more rows

Unlocks

Capabilities are unlocked when a credit card is added to the account.

COMPARE

Free Trial

Edge Cloud

Private Fleets

FEATURES

Analytics & Monitoring

Billing Alarms

Click to Expand

28 more rows

Unlocks

Capabilities are unlocked when a credit card is added to the account.