Fish Game is Heroic Labs' 2 to 4 player online brawler, made to show off Nakama. Edgegap's fork ports it to Godot 4 and runs every online match on its own dedicated game server.
Nakama keeps doing what it does best: accounts, matchmaking and the leaderboard. When it finds a match, it starts an Edgegap server near the matched players through the Edgegap Fleet Manager for Nakama.
No player hosts the match: a headless Godot server decides hits, deaths, rounds and the winner, then records the win in Nakama and stops itself.
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.
Clone the sample: Fish Game fork on GitHub
Full guide: add Edgegap to your own Nakama game with the Nakama integration guide
Platforms: Windows, macOS and Linux desktop builds. Original game by Heroic Labs; code under Apache 2.0, most art, music and sound under CC BY-NC.
How it works
Players sign in to Nakama with email and press Match. Nakama's matchmaker groups them.
Nakama's Fleet Manager starts an Edgegap deployment near the matched players, using the IP each player signed in from.
The game server boots, listens on UDP port 7777 and tells Nakama it's READY, with its IP and port.
Nakama sends each player the server's address. Players connect over ENet; the server checks each one's Nakama session and lets in only matched players.
The first fish to win 5 rounds wins. The server records the win on the
fish_game_winsleaderboard, then tells Nakama to STOP the deployment.
What the fork changed:
Path | What it does |
|---|---|
| Client: matchmaker ticket, server address notification, ENet connection. Server: lets matched players in. |
| Dedicated server mode: listens, reports READY, connections and STOP to Nakama, stops itself. |
| Online, the server owns rounds, pickups, hits and deaths. |
| Nakama 3.39 with a Go module: Fleet Manager, matchmaker hook, authoritative leaderboard. |
| Exports the "Linux Server" preset and runs it with headless Godot. |

Fish Game from Heroic Labs' Nakama, running on Edgegap
1. Before you start
A free Edgegap account and an API token from Dashboard → User Settings → Tokens. It's organization-wide, so it only goes into Nakama's settings file, never into the game.
Godot 4.7 (4.3 or later should work).
Docker Desktop, for Nakama and the game server image.
A public HTTPS address for Nakama. Edgegap servers call Nakama back, so
localhostwon't work. For a test, a tunnel is enough (step 3).Clone the fork.
2. Put the game server on Edgegap
Build the image from the repository root and push it to your Edgegap registry. The Container Registry page has your project, username and token:
docker build --platform linux/amd64 -f server/Dockerfile -t registry.edgegap.com/<project>/fishgame-godot:1.0.0 .
docker push registry.edgegap.com/<project>/fishgame-godot:1.0.0
In the dashboard, create the application fishgame-godot and a version 1.0.0:
Image
<project>/fishgame-godot, tag1.0.0, with your registry username and token.0.5 vCPU and 512 MB.
One port: name
gameport, 7777, UDP.A max duration of 30 minutes. The server also stops itself.
The server needs no environment variables of its own: the Fleet Manager passes it Nakama's callback addresses on every deployment.
3. Run Nakama
Copy nakama/.env.example to nakama/.env and fill it in:
EDGEGAP_API_TOKEN: your Edgegap API token, with itstokenprefix.EDGEGAP_APPLICATION,INITIAL_EDGEGAP_VERSION,EDGEGAP_PORT_NAME: the application, version and port name from step 2.NAKAMA_ACCESS_URL: Nakama's public HTTPS address.NAKAMA_HTTP_KEY: a long random string.
To test on your own machine, a Cloudflare quick tunnel gives Nakama a public address. Put the https://….trycloudflare.com address it prints in NAKAMA_ACCESS_URL:
docker run -d --name fishgame-tunnel cloudflare/cloudflared:latest tunnel --no-autoupdate --url http://host.docker.internal:7350
Then start Nakama and Postgres:
docker compose -p fishgame -f nakama/docker-compose.yml up -d --build
4. Play a match
Point the game at Nakama, either in the defaults at the top of autoload/Online.gd or on the command line:
godot --path . -- --nakama-host=your-tunnel.trycloudflare.com --nakama-port=443 --nakama-scheme=https
Players should reach Nakama through its public address too: Edgegap uses the IP each player signs in from to put the server near them.
Start two copies of the game, pick Online, create an account in each, and press Match in both. After "Match found! Starting a game server...", both land on the ready screen of the same Edgegap server. The first fish to win 5 rounds wins and gets +1 on the leaderboard. Then the deployment stops on its own.
5. Add it to your own Godot and Nakama game
The fork is a working reference: your coding agent can copy its tested files instead of writing them from scratch. Four changes make a Godot game run on Edgegap with Nakama:
Nakama starts the servers. Add the Edgegap Fleet Manager for Nakama to your Nakama Go module, and a matchmaker hook that creates an Edgegap deployment for each match (the fork's
nakama/folder).The game runs headless as the server. When Godot runs headless, the game starts in server mode, listens on a fixed UDP port and owns the game rules: hits, deaths, rounds, results (
autoload/EdgegapServer.gd,Game.gd).The server reports to Nakama. It sends READY with its IP and port, the connected players every 5 seconds, and STOP when the match ends, so Nakama ends the deployment and billing stops.
The client waits for its server. After matchmaking, the client receives the server's address in a Nakama notification, connects over ENet, and the server checks its Nakama session before letting it in (
autoload/OnlineMatch.gd).
Then containerize the server with the fork's server/Dockerfile as a model, and create the app version as in step 2.
With your agent:
"Load the edgegap skill, then edgegap-nakama and edgegap-godot. Using github.com/edgegap/backend-game-sample-godot-nakama-fishgame as the reference, add the Edgegap Fleet Manager to my Nakama module, a headless server mode to my Godot game that reports READY, connections and STOP to Nakama, and a client that connects to the address Nakama sends after matchmaking."
For each step in detail, by hand, see the Nakama integration guide.
6. How Nakama matches players and stops servers
Nakama's matchmaker groups the players, and its Fleet Manager plugin starts the Edgegap server and tells each player where to connect. You don't need Edgegap's matchmaker for this sample.
The server asks Nakama to stop its deployment, which ends billing:
when the match is won, after recording the win;
when fewer than 2 players are left mid-match;
when everyone leaves;
when nobody joins within 60 seconds;
after 20 minutes.
To add the same setup to your own Nakama game, follow the Nakama integration guide.
Known limits
No online play in the browser. ENet uses UDP, which browsers can't open. A web build would need Godot's WebSocket peer and a WS port with TLS Upgrade.
Movement is still client-owned. The server decides hits, deaths, pickups, rounds and wins, but each player sends their own fish's position, as in the original. For a competitive game, move movement to the server with client-side prediction.
No private matches by ID. Every match comes from the matchmaker. The Fleet Manager's
instance_createandinstance_joincalls could bring them back.
What was tested
Tested end to end on Edgegap on 20 October 2026. The fork ships 3 tests in tests/:
Local play:
godot --path . --script res://tests/smoke_test.gdloads the map; fish land, pick up, swing and throw without errors.Network, local server:
godot --headless --path . -- --test-auto-hit, then run the network test client twice (command inEDGEGAP.md).End to end on Edgegap: set
FISHGAME_TEST_AUTO_HIT=trueinnakama/.env, then run the network test client twice against your Nakama. The server hits one fish per round, so matches finish on their own. Leave it off for real games.
For netcode work without Nakama or Edgegap: godot --headless --path . starts a server, and godot --path . -- --connect=127.0.0.1:7777 connects a client to it.
Frequently Asked Questions
Questions about running Fish Game with Nakama and Edgegap.
Can Nakama start dedicated game servers?
Yes. With the Edgegap Fleet Manager for Nakama, Nakama's matchmaker starts an Edgegap server near the matched players and sends them its address. The server reports back to Nakama and stops when the match ends.
How do I make a Godot game server-authoritative with Nakama?
Run a headless Godot server per match that owns hits, deaths, rounds and results, and let Nakama handle accounts, matchmaking and leaderboards. Fish Game does this: players can't post wins themselves.
Does Fish Game work in Godot 4?
Yes. Edgegap's fork ports Heroic Labs' original Godot 3 game to Godot 4.7, and 4.3 or later should work. The original peer-hosted version stays on Heroic Labs' GitHub.
Can the Fish Game web export play online?
Not yet. The game uses ENet over UDP, which browsers can't open. A web build would need Godot's WebSocket peer and a WebSocket port with TLS Upgrade on Edgegap.

Clients
Learn more from clients who integrated Edgegap
31 case studies are available from studios that moved to Edgegap from another platform.

A Flawless Global Launch for Rivals of Aether 2
Aether Studios
Learn how Aether Studios quickly added Edgegap and delivered flawless launch & post-launch to their community.
Case Study

Overcome Latency Introduced by VR’s use of WiFi in Competitive Multiplayer
Halfbrick Studios
Discover how Halfbrick successfully launched & maintains a multiplayer-focused Early Access on META Quest's VR platform.
Case Study

MENA’s Social App Adds Online Games
WOLF
Learn how the highly popular MENA-region social app added matchmaking & multiplayer games orchestration easily to WOLF Qanawat.
Case Study

Hybrid Orchestration Keeps Kickoff Tactics Ready for Any Traffic
Birch Games
How hybrid orchestration helped Birch Games handle traffic, pairing egress-free Fleets with the regionless cloud.
Case Study

7 Days Blood Moons
The Fun Pimps & iLLOGIKA
Learn how Illogika dramatically reduced server costs & ensured the online experience the 7 Days to Die franchise expects.
Case Study

Authentic Online Warfare Requires the Ultimate Orchestration
Highwire Games
Learn how Highwire's need for performance required orchestration only Edgegap can deliver.
Case Study

22,000 Reviews, 4.8 Stars, and Infrastructure That Scaled Automatically
Sinn Studios
How a simple, Slack-supported integration got Sinn Studio's hit VR title online fast and keeps it there.
Case Study

Dynamic Server Orchestration
Under NDA - AAA Studio
Discover how one the world's biggest AAA studio improved its peer-to-peer multiplayer experience through edge computing.
Case Study

Near Zero Latency for AAA Fighting Game
AAA Studio - Under NDA
How an unannounced project delivered the lowest lag possible and improved fairness in its 1v1 game.
Case Study

Play Gods with Multiplayer Physics
Squido Studio
Learn how Squido uses Edgegap's highligh optimized game servers to deliver mind-bending & chaotic VR gameplay.
Case Study

A Fully Managed Solutions that Saves Time for Indies Multiplayer VR Horror
Dirty Pearl Studios
Discover how Dirty Pearl Studios saved development time thanks to Edgegap’s easy integration and automated orchestration alongside its Nakama integration.
Case Study

Instant Global Server Deployment for Collaborative XR Medical Education
AlensiaXR
How AlensiaXR uses Edgegap to deliver low-latency, always-available shared anatomy sessions to medical students worldwide.
Case Study

The Lightkeepers: A VR Social Co-op Game with Dedicated Servers
Spectral Games
How Spectral Games used Edgegap Matchmaking and Server Browser to launch dedicated servers for its VR social lobby, with no prior server experience.
Case Study

Fast & reliable deployments worldwide for PvPvE challenger Gravebound
Crater Studios
How Edgegap’s orchestration and matchmaking helped Crater Studios dramatically helped a small them focus on gameplay instead of infrastructure.
Case Study

Rapid Scaling of Web Metaverse
Hiber
Learn how Hiber eliminated the guesswork out of its server capacity planning with Edgegap.
Case Study

High Hardware Requirements & Custom Game Server Pools
Alderon Games
Learn how Alderon Games instantly leverages a custom pool of game servers across multiple providers worldwide for its popular MMO.
Case Study

Easy Integration for Indie Devs
WhaleFood Games
Read how WhaleFood Games "kicked out" its netcode issues with Edgegap.
Case Study

Cutting-edge tech that powers South-East Asia’s first-ever eSports title.
Anantarupa Studios
Learn how Edgegap transformed South-East Asia’s gaming landscape streamlining complex infrastructure and cutting-edge tech with one seamless solution.
Case Study

One Strike. Global Reach.
Triple Hill Interactive
How Triple Hill Interactive leverages Edgegap's orchestration to deliver low latency and improve fairness in a genre where every millisecond counts.
Case Study

Fast-paced Team Battle Royale... with Gun-totting Animal Plushes!
SANDYFLOOR
Discover how a Korea-based Indie Studio launched it multiplayer worldwide.
Case Study

Mobile Horse Racing Goes Global with Instant, Cost-Efficient Servers
Mirai Labs
How Mirai Labs powers Pegaxy Blaze's worldwide multiplayer races with just-in-time server deployment and fractional vCPU to keep cost per player low.
Case Study

Server Management & Distribution
Matrioshka Games
Read how Matrioshka Games were able to ship a Battle Royale in early access with limited ressources.
Case Study

At my Signal, Unleash Hell!
TyGames
Discover how Indie studio TyGames immerses players in third-person gladiatorial combat multiplayer.
Case Study

Instant Worldwide Orchestration
Soliton Interactive
Discover how Soliton Interactive did the impossible… Ship it's first playable as multiplayer!
Case Study

Competitive play with server-side physics ensures ideal sub-50 ms latency
NS7
Discover why solely Edgegap could enable an indie studio to deliver on its vision for a AAA-quality F2P sports gameplay through server-side physics and authority.
Case Study

Regional Deployments for iGaming
X1 Contra 1
X1 Contra 1 delivers real-time PvP casual games to its Brazilian player base through cost-effective hosting & regional deployments, ensuring data and legal compliance.
Case Study

Pay Only When Players Play: Affordable Multiplayer Infrastructure
Meltdown Interactive
How Edgegap helped indie developer Meltdown Interactive Media solve cost-effective scaling and matchmaking without the complexity, so they could focus on building the game.
Case Study

One Edgegap platform, three very different networking profiles
Warped Games
How Warped Games runs a social hub, real-time co-op, and turn-based co-op, all on the same Edgegap deployment API and the same container pipeline.
Case Study

Pool Live Tour Max
RETA Games
Case Study

Korea’s Web3 POP Extraction Shooter Goes Global, Instantly
NDUS Entertainment
How XOCIETY easily added Edgegap orchestration & integrated custom matchmaking working alongside Edgegap Ping Beacons to optimize latency.
Case Study

Multiplayer in Every Dimension
Arcadia.tv
Discover how Arcadia.tv uses Edgegap's edge network to deliver an innovative, team and location-based athletic VR sport.
Case Study

F2P Mobile Fighter Cuts Infrastructure Costs With Just-in-Time Servers
Game Changers Worldwide
How Game Changer Worldwide hosted Rumble Rush's real-time 3v3 PvP globally on mobile.
Case Study
Key reasons why they chose Edgegap
Discover the impact of Edgegap's automated game server orchestration for a flawless multiplayer experience.









