DriftwoodServer runs an always-on dedicated server for How to Fish. The game does not ship one; this package adds one. The world lives on the server and keeps going whether or not anyone is online, and everyone joins it with the Driftwood app, you included.
Driftwood is third-party software and is not affiliated with or endorsed by Dazed Games. Every player needs their own Steam copy of the game.
The rest of this page sets one up on a Windows machine you control, start to finish. If you would rather rent one, SurvivalServers.com runs How to Fish servers with Driftwood installed and kept on the latest release. What changed in each release is in CHANGELOG.md.
- Windows 10 / 11 / Server, x64
- Your own Steam copy of How to Fish, installed. The server runs the game's files, and this repo ships none of them.
- Git and the .NET 8 SDK, both free, used once in step 4
- Two open ports: one UDP port for the game, plus the TCP port directly above it
C:\Driftwood\my-server\
How to Fish\ your copy of the game's files
Saves\ the world lives here
host-state\ status, logs, the stop file
Backups\
bin\ the supervisor
appsettings.json
The world, the logs and the state live outside the game folder, so nothing that replaces game
files can touch your world. (appsettings.json is created in step 5.)
Copy your installed game folder, by default
C:\Program Files (x86)\Steam\steamapps\common\How to Fish, to
C:\Driftwood\my-server\How to Fish. Copy it; never point the server at the Steam install
itself. Steam updates the original whenever it likes, and a server should take a game update when
you decide to (step 5 makes that a checked decision instead of an accident).
Optional: also copy steamapps\appmanifest_4001890.acf into C:\Driftwood\my-server\steamapps\.
The build check in step 5 then reads Steam's own install record too.
Download DriftwoodServer-<version>.zip from the
latest release and extract it
somewhere temporary, not into the game folder. Everything in the zip nests under
DriftwoodServer\bepinex\, and extracted straight into the game folder nothing loads: the game
boots vanilla, silently, with no error anywhere.
Copy the pieces in from where you extracted them:
$overlay = "C:\Driftwood\overlay\DriftwoodServer\bepinex" # wherever you extracted it
$game = "C:\Driftwood\my-server\How to Fish"
Copy-Item "$overlay\winhttp.dll" $game
Copy-Item "$overlay\doorstop_config.ini" $game
Copy-Item "$overlay\BepInEx" $game -Recurse -ForceDone when winhttp.dll and doorstop_config.ini sit next to How to Fish.exe, and
BepInEx\plugins\DriftwoodHost.dll exists.
The supervisor is the program that starts the server, watches it, and takes the backups. The release zip does not include it; build it from this repo with two commands:
git clone https://github.com/HumanGenome/DriftwoodServer.git
dotnet publish DriftwoodServer/src/DriftwoodServer/DriftwoodServer.csproj -c Release -o C:\Driftwood\my-server\binCopy appsettings.example.json from the folder you just cloned to
C:\Driftwood\my-server\appsettings.json, open it in any text editor, and set:
- every path to your layout from step 1 (
instanceIdis any short name, e.g.my-server) steamAppsDirectory: yoursteamappscopy from step 2, or""if you skipped itserverName: what players see in the Driftwood appauthToken: the admin password for this server's console and backups in the Driftwood app. Set one; without it every admin route refuses.gamePort: the UDP port players connect to.httpPortstays0: the status/admin API then takes the port directly abovegamePorton its own.discordWebhookUrl(optional): a Discord webhook URL, and the server posts joins and leaves, boss kills, island moves and blocked-join attempts to that channel. Leave it""for no alerts. A file nameddiscord-webhook.txtinC:\Driftwood\my-server\Driftwood\does the same and wins when both are set.
Leave worldName alone once the server has run. Renaming it later starts a fresh world under the
new name; the old world stays in Saves\ under the old one.
Last, pin the game build. The server refuses to start until you pin the build you copied, and
that is what stops a Steam update from silently breaking your server. Set
pinnedBuild.assemblySha256 to 64 zeros, then ask the install for its real values:
C:\Driftwood\my-server\bin\DriftwoodServer.exe --verify-build C:\Driftwood\my-server\appsettings.jsonIt prints BUILD_PIN_FAILED plus the truth:
assemblySha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
steamBuildId=19842631
Paste both into pinnedBuild (buildId stays "" if you skipped the steamapps copy), run it
again, and expect BUILD_PIN_OK.
When Steam updates the game: update your Steam copy, re-copy the game folder, re-run
--verify-build, and paste in the new values. If the update moved something the server depends
on, it names what moved and refuses to host broken; take the next release of this package.
New-NetFirewallRule -DisplayName "Driftwood game" -Direction Inbound -Protocol UDP -LocalPort 22003 -Action Allow
New-NetFirewallRule -DisplayName "Driftwood api" -Direction Inbound -Protocol TCP -LocalPort 22004 -Action AllowUse your gamePort and gamePort + 1. Hosting from home, forward both on your router too.
C:\Driftwood\my-server\bin\DriftwoodServer.exe --config C:\Driftwood\my-server\appsettings.jsonTwo lines mean it worked. First BUILD_PIN_OK, then, after the world loads (give a fresh world a
few minutes):
DRIFTWOOD_HOSTING port=22003 slots=8 world=Driftwood pid=4242
Everyone joins from the Driftwood app: add <your address>:22003, Connect.
Once in, players can type !help, !stuck (back to the island spawn), !playtime and !top
(the catch leaderboard) into the game's own chat - nothing to install. The owner's console has
rescue <player> and top for the same two things from the outside.
- Stop:
Ctrl+Cin the console, or create a file namedstop.requestedinhost-state\. Either way the world is saved before the process exits. - Back up, while it runs:
DriftwoodServer.exe --snapshot appsettings.jsonsaves the world and zips it intoBackups\. - It will not start? Read
host-state\host-ready.json.reasonis one plain sentence, and the common ones are decoded in docs/operations.md. The game's own output is inhost-state\unity.log. - Survive reboots: a Task Scheduler task, At startup, running the step 7 command.
- More servers on the same box: repeat from step 1 in a second directory with its own ports, ten apart (22013, 22023, ...).
MIT © HumanGenome