CLI tool
jhead/phantom avatar
jhead/phantom

phantom: makes a hosted Bedrock server show up as a LAN game on consoles

Use your own Minecraft server with your Xbox or PS4/5 and play with friends!

696 stars87 forksGoMIT

At a glance

What is it?
phantom is a Go command line proxy that advertises a remote Bedrock or MCPE server on the local network as if it were a LAN server, so Xbox and PlayStation clients can join a hosted world without Realms. It suits a player whose console cannot reach an internet hosted server directly, and it does not suit a Nintendo Switch user or a server that has LAN visibility turned off.
Who is it for?
Adopt phantom if you play Bedrock on a console that cannot reach your hosted server directly, you can keep a machine on the same LAN as the console, and you are willing to open UDP in the local firewall. Do not adopt it for a Nintendo Switch, which the supported platform list excludes, or if the console is on a different network than the machine running phantom, since the advertisement is a local broadcast.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 60 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A proxy that answers LAN discovery packets on your behalf

phantom makes hosted Bedrock and MCPE servers show up as LAN servers, specifically for consoles. The project's own summary of the goal is that you can play on remote servers, and specifically not Realms, on your Xbox and PS4 with friends.

The mechanism is a discovery trick plus a proxy. On Minecraft platforms that support LAN servers, the game broadcasts a server ping packet to every device on the same network and displays any valid replies as connectable servers. phantom runs on your computer, a desktop, a laptop, a Raspberry Pi or similar, and pretends to be a LAN server. It answers the discovery broadcast and then acts as a proxy, passing all traffic from your game through your computer and to the server, and back. The game therefore believes it is connected to a LAN server while the session is really happening on a remote host.

The practical consequence is that the traffic path stays inside your own network. The console only ever talks to the machine running phantom, and that machine holds the connection to the real server. For a console that will not connect to an arbitrary internet address, that is the whole trick.

Two operational details follow from the design and are worth knowing before you configure anything. The documentation recommends running phantom on a device connected via ethernet rather than WiFi, since a wireless connection could introduce some lag, while noting that your game device can be connected to WiFi. The remote server itself can be a computer, a VM, or a Minecraft hosting service.

Port 19132 is fixed, and that is not a configuration choice

The flag set looks generous until you read what the tool has to do to be discovered.

phantom must bind to port 19132 on all interfaces, or at least on the broadcast address, in order to receive ping packets from LAN devices. It always does that and there is no way to configure it otherwise. That is why the port is deliberately omitted from the flags, since the port it runs on is irrelevant to the user.

What you can choose is where the proxy itself listens. The -bind flag sets the IP address to listen on and defaults to all interfaces, 0.0.0.0. The -bind_port flag sets the port, and its default of 0 means a random port is selected. The documentation gives the reason to touch it: if you are behind a firewall or using Docker and want to open only the necessary ports to phantom. Even then, you will always need port 19132 open in addition to the bind port for phantom to work.

There are also two flags marked experimental. The -6 option enables IPv6 support on port 19133, and -remove_ports forces ports to be excluded from pong packets.

The remaining options are straightforward. The -server flag is required and takes a Bedrock or MCPE server IP address and port. The -timeout option is the number of seconds to wait before cleaning up a disconnected client, with a default of 60, and -debug turns on debug logging.

Download, make it executable and point it at a server

phantom is a command line application with no GUI yet, so the whole setup happens in a terminal. The build is a single binary, and you fetch it from the releases page.

On macOS and Linux you may need to add execute permissions:

bash
$ chmod u+x ./phantom-<os>

The angle bracket placeholder is filled with macos, linux or whatever matches your system. On Windows the binary is an executable file and there is no such step.

The core usage takes the address of the server you want to appear on the LAN list. Connecting to a server at the address lax.mcbr.cubed.host on port 19132 looks like this:

bash
./phantom-<os> -server lax.mcbr.cubed.host:19132

Open a command prompt on Windows or a terminal on macOS and Linux in the directory where you downloaded the binary, run that command, and the server should show up on the LAN server list within a few seconds. If it does not, something is wrong.

The extra flags are for the cases where the defaults do not fit. Binding to a specific local IP, pinning the proxy port, or doing both are all available:

bash
./phantom-<os> -bind 10.0.0.5 -bind_port 19133 -server lax.mcbr.cubed.host:19132

As long as the device running phantom is on the same LAN as your console, the default settings should be enough for other devices to see it when you open Minecraft.

Several servers need several instances and one firewall rule

If you have multiple Bedrock servers, you can run phantom multiple times on the same device, which allows all of your servers to show up on the LAN list. The instruction is simple: start one instance of phantom for each server and set the -server flag appropriately. You do not need to use -bind or change the port.

There is a catch, and it is a network one rather than a tool one. You probably do need to make sure you have a firewall rule that allows all UDP traffic for the phantom executable. Since the proxy port is randomised by default, and each instance picks its own, the practical effect is that you are opening a wide range of UDP rather than two specific ports.

The documentation repeats the firewall point later, in the supported platforms section, and adds that you almost definitely need to create a firewall rule for this to work. On macOS you are prompted automatically. On Windows you may need to open the Windows Firewall settings and open up all UDP ports for phantom. The -bind_port flag is the answer if you want to narrow that, since it lets you open one known port instead of a range, and the documentation mentions Docker as a case where that matters.

One troubleshooting note is specific to the server side rather than the client. If the server is online and phantom shows connections but the server is not appearing in the list, make sure that Visible to LAN players is turned on in the server settings, with a screenshot in the documentation showing the setting in the off state.

The Makefile builds nine binaries from one Go source file

phantom is written in Go, and the build is driven by a Makefile that produces nine executables covering desktop and embedded targets.

bash
make

The output list in the Makefile names them: phantom-windows.exe, phantom-windows-32bit.exe, phantom-macos, phantom-macos-arm8, phantom-linux, phantom-linux-arm5, phantom-linux-arm6, phantom-linux-arm7 and phantom-linux-arm8. Each rule sets GOOS and GOARCH, and the ARM Linux targets set GOARM to 5, 6, 7 or 8, with the arm8 target using arm64. There is also a prep target that creates the bin directory, a clean target that removes it, and a test target.

The test target is a single standard Go command:

bash
go test ./...

The module definition is minimal and dated in an informative way. The module path is github.com/jhead/phantom and the go directive says 1.12. The required dependencies are few and each has a clear job: go-reuseport from libp2p, which is how the tool manages multiple listeners on the same port, zerolog for logging, testify for the tests, and abool for atomic boolean flags.

The repository layout matches a small Go project: cmd/ holds the command entry point, internal/ holds the packages, with go.mod, go.sum, a Makefile and a LICENSE at the root.

The supported platform list has gaps and the last release is old

The platform list is explicit. The tool should work on Windows, macOS and Linux, with ARM builds available for Raspberry Pi and similar system on chips. On the client side, Minecraft for Windows 10, iOS and Android, Xbox One and PS4 are currently supported, and the Nintendo Switch is not supported.

That last exclusion is a hard boundary, and the console support list is narrower than the repository description suggests, since the description mentions playing with a PS4 or PS5 while the supported platform section names PS4 only. If a PlayStation 5 user is reading this, the documentation does not confirm their client.

The maintenance picture needs the same honesty. The repository is not archived and the last push was on 2026-08-24, so work has continued. The release history, however, stops much earlier: v0.5.4 with support for Apple Silicon on 2021-12-19, v0.5.3 on 2021-01-01 and v0.5.2 on 2020-07-15. There is a newer commit than the newest tag, and no release notes for it.

The licence is MIT, which is the permissive end of things for a tool you run on your own machine.

The practical read is that phantom is a small, stable, well documented utility whose upstream activity is now sporadic. That is fine for the job it does, since the discovery and proxy behaviour it implements has not obviously changed, but it does mean the Apple Silicon build and the current console landscape are worth verifying on your own hardware.

What phantom is competing with

There are two honest alternatives, and neither is another tool that does exactly this.

The first is to not need it. If your Bedrock server runs on a machine on the same network as the console, it is already a real LAN server and the game will find it by itself. phantom exists for the case where the server is elsewhere and cannot be moved, so the tool is a workaround for a network shape rather than a better way to host.

The second is a hosted service that the console can reach directly. The documentation notes that the remote server can be a computer, a VM, or a Minecraft hosting service. A hosting service with a direct address removes the need for a proxy on your LAN entirely, and it also removes the firewall rule, the second machine, and the latency of routing traffic through that machine. The trade is that the console has to be able to open a connection to that host, which is exactly the constraint phantom works around.

The difference in approach between them is where the traffic goes. With phantom, the console only ever sees an address inside your own network, and the proxy machine is responsible for everything beyond it. With a direct hosting service, the console talks to the server over the internet, and your network's outbound rules and the hosting provider's inbound rules are what have to line up.

For a console with a restricted network, that first model is the only one that works, which is the reason this tool exists at all.

Editorial conclusion

Adopt phantom if you play Bedrock on a console that cannot reach your hosted server directly, you can keep a machine on the same LAN as the console, and you are willing to open UDP in the local firewall. Do not adopt it for a Nintendo Switch, which the supported platform list excludes, or if the console is on a different network than the machine running phantom, since the advertisement is a local broadcast. Verify first that Visible to LAN players is turned on in the server settings, that port 19132 is open, and that you are using a build newer than v0.5.4, the last tagged release from 2021-12-19, since the repository has seen commits since without a new release.

Frequently asked questions

What does phantom do for Minecraft Bedrock?

It answers the LAN discovery broadcast on your machine and proxies the connection, so a remote Bedrock or MCPE server appears on the console LAN list. The game believes it is on a LAN server while the session runs on the remote host.

How do I run phantom against a hosted Bedrock server?

Download the binary from the releases page, make it executable with chmod u+x if needed, then run it with the server address, for instance ./phantom-<os> -server lax.mcbr.cubed.host:19132. The server should appear in the LAN list within a few seconds.

Which ports does phantom need open?

Port 19132 always has to be open because phantom must bind it on all interfaces to receive LAN ping packets, and there is no way to change that. The proxy port is random by default and can be pinned with -bind_port, and you also need a firewall rule allowing UDP traffic for the executable.

Can I use phantom on a Nintendo Switch?

No. The supported platform list names Minecraft for Windows 10, iOS and Android, Xbox One and PS4 as supported, and states that Nintendo Switch is not supported.

Why is my server not showing up in the LAN list even though phantom shows connections?

Make sure that Visible to LAN players is turned on in the server settings, since the troubleshooting section points at that setting with a screenshot showing it off. On Windows you also usually need a firewall rule allowing all UDP ports for phantom.

Official sources

  1. Issues
  2. jhead/phantom on GitHub
  3. License: MIT
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/jhead-phantom.svg)](https://hysenlabs.com/projects/jhead-phantom)

Was this useful?