Add Crowdin, introduce new provider schema, introduce NetherNet blog post (#51)

* Begin testing i18n

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Add crowdin in-context demo for non-mdx

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Add crowdin-sync system

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Working sync system for translations

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Only build en locale for PRs

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Modify yarn install

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Do not immute cache

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Try with standard yarn install

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Revert to yarn --immutable

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Remove explicit url/file-loader resolutions

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Only log webpack errors

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Added MCServerHost to hosting providers (#47)

* Added MCServerHost to hosting providers

* Update providers.ts

* Correct grammar and make instructions more concise

---------

Co-authored-by: Kas-tle <26531652+Kas-tle@users.noreply.github.com>

* Update supported Bedrock versions

* Remove and Replace "TydiumCraft Skin API" (#53)

* Update community-geyser-projects.md

I no longer will run TydiumCraft Skin API. I have no interest in continuing it at this time (or anything minecraft related). However I have switched out the spot with an API that 100% is always updated and active. Hosted by my good friend Bret06. This works so much better as well. Thanks for everything over the years guys! Tydium out!

* Update wiki/other/community-geyser-projects.md

👍

Co-authored-by: chris <github@onechris.mozmail.com>

---------

Co-authored-by: chris <github@onechris.mozmail.com>

* Update wording for creepernation api

Update wording because it’s bothering me

* Update GeyserExtras description  (#52)

* Update community-geyser-projects.md

* Update wiki/other/community-geyser-projects.md

Co-authored-by: chris <github@onechris.mozmail.com>

---------

Co-authored-by: Luke <32024335+lukeeey@users.noreply.github.com>
Co-authored-by: chris <github@onechris.mozmail.com>

* Try matrix build strategy

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Fix matrix output

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Matrix goes to GITHUB_OUTPUT

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Fix deploy needs to combine

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Ensure correct commit is used if crowdin updates

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Make sure excluded content is respected

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Allow permission for commit action write

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Sync translations with Crowdin

* Update index.md to make clear that this is for servers, not purely for clients (#57)

* Update providers.ts (#58)

* Update providers.ts

VemoxHost added

* Maintain alphabetized list

---------

Co-authored-by: Kas-tle <26531652+Kas-tle@users.noreply.github.com>

* Start on re-writing the providers page to provide more useful details to improve the setup guide

* more work on this

* Rework paper page for setup

* Don't try and build paper setup as a full page

* adjust not listed message

* update mod/proxy pages

* Initial setup i18n

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Add ability to hide proxy setup instructions by provider

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Temporary auto deployment; fix broken links

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Fix heading consistency

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Update language on provider instructions

* Update language on new provider instructions

* Upgrade actions/setup-node due to hang issue

* Both

* Forgot how many times we setup node...

* Documentation for changes in API/2.6.2 (#62)

* Document latest Geyser changes:
- remote resource packs

* Update/Finish pack docs

* small typo fixes

* Update page content

* fix build

* Update supported Bedrock version

* Add Modrinth Servers to providers (#63)

* Update supported versions & api version

* Update versions.json to include 1.21.72 (#64)

* Update bedrock version (#67)

* Add 'we are not mojang' disclaimer to footer

* Stop translations from overriding footer message

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Fix Standalone dump view (#68)

* Add OrionNodes to providers (#69)

* Update supported Bedrock versions in versions.json (1.21.81, 1.21.82) (#70)

* Update faq.mdx to include recommended API (#73)

Tydium skin API is abandoned, please direct users to a working API such as the one recommended by Tydium

Derived from: https://github.com/GeyserMC/GeyserWebsite/commit/19ae50f95ddbfc24ff34a42d278bdc263e0200e6

* Update anticheat-compatibility.md (#74)

* Update versions.json

* Update versions.json (#75)

* Remove LAC because it is no longer being maintained (#76)

* Update versions.json for 1.21.7 (#77)

* Update versions.json for 1.21.93 (#78)

* Update versions.json for 1.21.94 (#79)

* Update versions.json for Java 1.21.8 (#80)

* Update Geyser Api version (#81)

* Readd Hydraulic and add Rainbow, provide Item API V2 warning for Hydraulic (#82)

* Fix incorrect Ubuntu on Oracle Cloud instructions (#84)

* Remove Geyser Android App and Tempest (#83)

* Update version.json for 1.21.100 (#88)

* Update getting-started-with-the-api.md (#89)

* Add and update wiki pages, add Thunder download. (#90)

* Add a Thunder and Rainbow wiki page, touch up some other pages

* Fix mobile sidebar

* Address review 1/2

* Address review 1.5/2 (oops)

* Address review 2/2

Co-authored-by: chris <github@onechris.mozmail.com>

---------

Co-authored-by: chris <github@onechris.mozmail.com>

* Indicate 1.21.101 on the Geyser Website (#93)

* Added GeyserFloatingPoints to FAQ (#92)

* Added GeyserFloatingPoints.

* Update wiki/geyser/faq.mdx

Co-authored-by: chris <github@onechris.mozmail.com>

---------

Co-authored-by: chris <github@onechris.mozmail.com>

* Update versions.json to indicate support for bedrock 1.21.111

* Update versions.json for Java 1.21.9/1.21.10 (#97)

* Update versions.json for Java 1.21.9

* Update versions.json to include 1.21.10

* Update supported Bedrock version

---------

Co-authored-by: Aurorawr <auroranova8756@gmail.com>
Co-authored-by: chris <github@onechris.mozmail.com>

* Update extensions file for new dependency system (#98)

* Update extensions file for new dependency system

* Update version

* Update wiki/geyser/extensions.md

---------

Co-authored-by: chris <github@onechris.mozmail.com>

* Replace the Crowdin link with the current one (#101)

* Replace the Crowdin link with the current one

* Replace the link with the subdomain redirect

* Update versions.json to include 1.21.114 (#102)

* Update rainbow.md to indicate 1.21.9/.10 (#103)

* Revise port forwarding instructions for Ubuntu

Updated instructions for allowing Minecraft and Geyser through the OS firewall on Ubuntu.

* Update providers and deploy action

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Sync translations with Crowdin

* Correct providers syntax

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Use more templates wherever possible

* Add build cache; update docusaurus-og

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Test deploy time with cache hit

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Use read-only cache for matrix build

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Unlikely we will use gh actions on arm...

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* This time cache will hit

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Hopefully correct yarn cache path...

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Maybe npm?

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Surely...

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* This time...

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Include yarn/docusaurus cache for PRs

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Add page IDs to more pages, fix broken pages

* Update i18n pages

* Sync translations with Crowdin

* Add missing support pages and articles on providers, add Discord links

* Add blog post on preparing Geyser servers for NetherNet

Drafted with the help of Claude Opus 5.5.

* Rewrite the hosted setup guide for NetherNet, add hosting page

Provider entries now describe ports, signaling and install steps, grouped
in the order the setup guide shows them. The guide generates the NetherNet
config from them, and the old supported hosting providers list is replaced
by a hosting page for Open Collaboration supporters.

Drafted with the help of Claude Opus 5.5.

* Rewrite the self-hosted setup guides for NetherNet

The self-hosting pages now use the same steps and generated config as the
hosted guide, and point out that the Geyser port needs both TCP and UDP.

Drafted with the help of Claude Opus 5.5.

* Add HTTPS for NetherNet page

Covers serving built-in signaling over HTTPS, with a certificate in the
Geyser config or with a reverse proxy (Caddy, nginx).

Drafted with the help of Claude Opus 5.5.

* Skip Crowdin sync in deploy workflow when no token is set

Forks do not have the Crowdin secrets, so the sync step failed there and
nothing got deployed. Without a token, the workflow now builds and deploys
the pushed commit as is.

Drafted with the help of Claude Opus 5.5.

* Address: rtm's comments

* Improve layout, drop confusing 26.40 note on setup guide

* Cleanup blog post language / line breaks

* Merge proxy server guides for server hosts, adjust exarotron provider entry, adjust setup guides to work with crowdin

* Split the proxy setup guides back into Velocity and BungeeCord

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Update hosting providers to upstream and collapse strings into defaults

Port upstream's provider changes to the new format: add Minehost and
ConsulHosting, update MCServerHost, rename Feather to Dawn and Modrinth
Servers to Modrinth Hosting, merge RamShard into RackGenius, add MyArena,
and drop hosts upstream removed. Restore link fixes the rewrite undid
and install details dropped from the live page.

Replace host-specific strings with templates or the generated steps
where they say the same thing. Hosts that pick the port themselves show
where it comes from instead of the config step.

Hosts without NetherNet details that shared the Java server's port now
ask for a new port, open for both TCP and UDP, and the generated config
turns clone-remote-port off. Hosts that cannot give out a port fall back
to the "Not listed" guide for the Java server's port, which uses Warden.
BisectHosting no longer uses assumed example data. Entries keep the date
of their last edit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Remove Dawn and date Aternos and exaroton today

Dawn now integrates with Aternos, so it no longer needs its own entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Remove unused translation strings and fix the English GeyserConnect text

Drop keys the code no longer uses from every locale: the old EmoteOffhand
description ID, the theme's old unlisted content strings, strings removed
on this branch, and the removed Custom Resource Packs sidebar category.
The English GeyserConnect description had an outdated message that
overrode the current one on the English site.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Hide the NetherNet and RakNet option when only the Java port is available

With only the Java server's port there is no second UDP port for RakNet,
so the "Not listed" Java port guide shows the NetherNet config without
transport tabs. Drop the placeholder text that only applied there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Add an HTTPS step to the self-hosted guides and correct external signaling HTTPS claims

Self-hosted guides end with a recommended step to serve signaling over
HTTPS, since Geyser's built-in signaling uses plain HTTP by default and
players get a "Trust on First Use?" prompt. External signaling services
do not all provide HTTPS, so the blog post and HTTPS page now name Warden
as one that does instead of implying all do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Update port forwarding guide, update OVH note

* Sync translations with Crowdin

* Hide entire placeholder strings and correcntly mark chrome json in crowdin

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Update actions and yarn

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Sync translations with Crowdin

* Apply batched suggestions from code review

Co-authored-by: Eclipse <eclipse@eclipseisoffline.xyz>

* Fix NetherNet docs for the final Geyser PR

- Built-in signaling serves HTTPS instead of HTTP once a certificate is configured (blog, system properties)
- "Free port" is now "available port" in the blog
- System properties: drop the removed "none" signaling mode, fix the signaling port default
- playit.gg: note that the guide is for RakNet, and link playit.gg's NetherNet progress

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Build the setup guides from translation strings

The per-platform setup pages are replaced by SetupGuide.tsx, which renders the
hosted and self-hosted guides from shared MDXTranslatable strings, so Crowdin
translates each sentence once instead of every page separately.

Also:
- "Not listed" with only the Java port sets mode: nxs instead of relying on Geyser's fallback
- The playit.gg note links playit.gg's NetherNet progress instead of describing a setup
- "free port" is now "available port"

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Remove the trustedProxies.fetch system property for now

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fix crowdin sync and don't translate trade names

Signed-off-by: GitHub <noreply@github.com>

* Sync translations with Crowdin

* Fix build

Signed-off-by: GitHub <noreply@github.com>

* Sync translations with Crowdin

* Address more concerns with nethernet https guide

Signed-off-by: GitHub <noreply@github.com>

* Fix signaling-trusted-proxies config in nethernet https article

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>

* Remove port forwarding from the HTTPS guide

Ports are already covered by the setup guide, and HTTPS does not change
which ports need to be opened. Reverse proxies now use
signaling-trusted-proxies, which reads X-Forwarded-For.

* Remove placeholder hosts, hide the hosting page until it launches

- Remove the placeholder hosts and their logos
- Aternos and exaroton are bronze supporters: highlighted with a badge in
  the setup guide, without a "last updated" date, but not listed on the
  hosting page, which only shows gold and silver
- Hide the hosting page and its links for now, and mention in the blog
  post that it is coming soon

* Supporting hosts configure Geyser, they do not install it

* Sync translations with Crowdin

* Move nethernet https guide up on sidebar

* Update to docusaurus 3.10 and fix all type errors

Signed-off-by: GitHub <noreply@github.com>

* HTTP and HTTPS do not both run at once

* Link win-acme's and nginx's own Windows guides in the HTTPS guide

* Fix crowdin key exclusion logic

Signed-off-by: GitHub <noreply@github.com>

* Sync translations with Crowdin

* Address reviews, clear up instructions for users. Adds info on haproxy, NXS and MOTD forwarding

* Note certificate permissions and where to save the Caddyfile

* Sync translations with Crowdin

* Document the geyser nethernet command

* Sync translations with Crowdin

* Support directly linking to the "not listed" or a specific hosts' guide

* Mention warden supporting custom domains

* Add HOSTING_PROVIDERS.md, update existing server host setup entries to reduce translation strings used

* Sync translations with Crowdin

---------

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>
Signed-off-by: GitHub <noreply@github.com>
Co-authored-by: Yara Durand <87721861+Roolps@users.noreply.github.com>
Co-authored-by: chris <github@onechris.mozmail.com>
Co-authored-by: Tydium <67938521+Tydium@users.noreply.github.com>
Co-authored-by: Creeperz653 <76449952+Creeperz653@users.noreply.github.com>
Co-authored-by: LetsGoAway <68365423+letsgoawaydev@users.noreply.github.com>
Co-authored-by: Luke <32024335+lukeeey@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dan <20766261+D4n2021@users.noreply.github.com>
Co-authored-by: santevemox <57247088+santevemox@users.noreply.github.com>
Co-authored-by: rtm516 <ryantmilner@hotmail.co.uk>
Co-authored-by: Emma Alexia <wafflecoffee7@gmail.com>
Co-authored-by: Alex <zomka@fard.ing>
Co-authored-by: Aurorawr <100384210+Novampr@users.noreply.github.com>
Co-authored-by: Jens Collaert <63231928+Jens-Co@users.noreply.github.com>
Co-authored-by: OrionNodes <ethan@orionnodes.com>
Co-authored-by: SylentHuntress <91935048+sylenthuntress@users.noreply.github.com>
Co-authored-by: oryxel <gamingnoob681@gmail.com>
Co-authored-by: Eclipse <eclipse@eclipseisoffline.xyz>
Co-authored-by: Nebojsa Majic <79749977+Onako2@users.noreply.github.com>
Co-authored-by: qscbm187531 <1309635304@qq.com>
Co-authored-by: Eveline Carter <6444703+drakon64@users.noreply.github.com>
Co-authored-by: SleepyPop <81194303+SleepyPopp@users.noreply.github.com>
Co-authored-by: Aurorawr <auroranova8756@gmail.com>
Co-authored-by: rtm516 <rtm516@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
315 files changed
+27919 -9717

No files matched your search

+120 -15
View File
@@ -4,6 +4,8 @@ on:
push:
branches:
- master
# Remove before merging
- feature/i18n
paths-ignore:
- '.github/CODEOWNERS'
- '.github/workflows/pr.yml'
@@ -26,55 +28,158 @@ concurrency:
cancel-in-progress: true
jobs:
build:
sync:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
outputs:
locales: ${{ steps.locales.outputs.locales }}
commit: ${{ steps.commit.outputs.commit-hash == '' && steps.commit.outputs.commit-hash || github.sha }}
permissions:
contents: write
env:
# Forks have no Crowdin secrets: skip the translation sync there, and deploy the pushed commit as is
CROWDIN_ENABLED: ${{ secrets.CROWDIN_TOKEN != '' }}
steps:
- uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1
with:
node-version: 22
package-manager-cache: false
- name: Enable Corepack
run: corepack enable
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
fetch-depth: 0
- name: Setup Pages
uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b
- uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1
with:
node-version: 22
cache: yarn
package-manager-cache: true
- name: Install dependencies
run: yarn install --frozen-lockfile
run: yarn install --immutable
- uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57
- name: Sync Translations
if: env.CROWDIN_ENABLED == 'true'
run: yarn crowdin-sync
env:
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
CROWDIN_ORGANIZATION: ${{ secrets.CROWDIN_ORGANIZATION }}
- name: Commit Changes
if: env.CROWDIN_ENABLED == 'true'
id: commit
# See https://github.com/planetscale/ghcommit-action/releases
uses: planetscale/ghcommit-action@f24050e41f8694750427d111b52f4ef9ca81a32d # v0.2.18
with:
commit_message: "Sync translations with Crowdin"
repo: ${{ github.repository }}
branch: ${{ github.head_ref || github.ref_name }}
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
- name: Get locales
run: yarn output-locales
- name: Define matrix
id: locales
run: echo "locales=$(cat locales.json)" >> $GITHUB_OUTPUT
build:
runs-on: ubuntu-latest
needs: sync
strategy:
matrix:
locales: ${{ fromJson(needs.sync.outputs.locales) }}
steps:
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1
with:
node-version: 22
package-manager-cache: false
- name: Enable Corepack
run: corepack enable
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
fetch-depth: 0
ref: ${{ needs.sync.outputs.commit }}
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1
with:
node-version: 22
package-manager-cache: false
- name: Restore Yarn Cache
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: /home/runner/.yarn/berry/cache
key: |
node-cache-${{ runner.os }}-x64-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
node-cache-${{ runner.os }}-x64-yarn-
- name: Install dependencies
run: yarn install --immutable
- name: Restore Docusaurus Cache
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: |
${{ github.workspace }}/.docusaurus
${{ github.workspace }}/**/.cache
key: |
${{ runner.os }}-docusaurus-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
${{ runner.os }}-docusaurus-${{ matrix.locales }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
restore-keys: |
${{ runner.os }}-docusaurus-${{ hashFiles('**/yarn.lock') }}
${{ runner.os }}-docusaurus-${{ matrix.locales }}-${{ hashFiles('**/yarn.lock') }}
- name: Build website
run: yarn build
- name: Build Locale
run: yarn build --locale ${{ matrix.locales }}
env:
# The Mermaid theme makes the client bundle too large for Node's default heap
NODE_OPTIONS: --max-old-space-size=8192
- name: Upload artifact
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
with:
path: build
name: ${{ matrix.locales }}
combine:
runs-on: ubuntu-latest
needs: [build, sync]
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
fetch-depth: 0
ref: ${{ needs.sync.outputs.commit }}
- name: Setup Pages
uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b
- name: Download artifacts
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
path: build
- name: Move default locale to root build
run: |
mv build/en/* build/
rm -rf build/en
- name: Upload artifact
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b
with:
path: build
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
needs: combine
steps:
- name: Deploy to GitHub Pages
id: deployment
+13 -9
View File
@@ -8,39 +8,43 @@ jobs:
name: Build PR
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1
with:
node-version: 22
- name: Enable Corepack
run: corepack enable
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
fetch-depth: 0
- uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
- uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1
with:
node-version: 22
cache: yarn
package-manager-cache: true
- name: Install dependencies
run: yarn install --frozen-lockfile
run: yarn install --immutable
- uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57
- uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: |
${{ github.workspace }}/.docusaurus
${{ github.workspace }}/**/.cache
key: |
${{ runner.os }}-docusaurus-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
${{ runner.os }}-docusaurus-en-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
restore-keys: |
${{ runner.os }}-docusaurus-${{ hashFiles('**/yarn.lock') }}
${{ runner.os }}-docusaurus-en-${{ hashFiles('**/yarn.lock') }}
- name: Build website
run: yarn build
run: yarn build --locale en
env:
# The Mermaid theme makes the client bundle too large for Node's default heap
NODE_OPTIONS: --max-old-space-size=8192
- name: Upload artifact
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b
with:
path: build
+1
View File
@@ -22,6 +22,7 @@ vendor
.env.development.local
.env.test.local
.env.production.local
locales.json
npm-debug.log*
yarn-debug.log*
+7
View File
@@ -1 +1,8 @@
approvedGitRepositories:
- "**"
enableScripts: true
nodeLinker: node-modules
npmMinimalAgeGate: 0
+38 -28
View File
@@ -18,42 +18,52 @@ Small changes can be made directly in the GitHub interface, but larger changes s
## Adding a Supported Hosting Provider
Supported hosting providers are listed in `src/data/providers.ts`. Hosting providers are grouped into three subcategories:
If you run a hosting service, see [HOSTING_PROVIDERS.md](HOSTING_PROVIDERS.md) for what to fill in, and which pre-configured strings to use.
- `built_in`: Providers that have fully automatic Geyser installation.
- `supported`: Providers that work with Geyser but require manual installation.
- `no_support`: Providers that do not work with Geyser.
Hosting providers are listed in `src/data/providers.ts`, in alphabetical order. The setup guide generates the Geyser config changes and connection instructions from each entry.
Set `updated` to the date you add or edit an entry (`'YYYY-MM-DD'`); the setup guide shows it as "Instructions last updated on".
See `src/types/providers.ts` for all fields. They are grouped in the order the setup guide shows them: `links` to the host's own help pages, `install` (step 1), `config` (step 2), `extra_step` (step 3), `connect` (step 4), and `notices` shown around the guide.
To add a new provider, add an object to the appropriate subcategory in alphabetical order. For example, to add a provider named `Example Hosting Provider` to the `supported` subcategory, edit the `providers.ts` file as follows:
Geyser uses NetherNet for Bedrock connections, which needs:
- **UDP** for game traffic flowing over WebRTC (`config.udp`), and
- **TCP** for signaling, which is how Bedrock players find the server. Geyser can do this itself ("built-in" signaling, which needs a **TCP** port that is not the Java server's port), or through an external signaling service ([Warden](https://warden.cloud) by default), which needs no extra port.
Ports (`udp` and `builtin_signaling`) can be:
- `'java'`: the Java server's port (UDP only; built-in signaling cannot share the Java server's TCP port),
- a number, e.g. `19132`, if it is always the same,
- `{ obtain: translate({...}) }` with how to get one, e.g. "Open an allocation in the Network tab.". The guide adds which config option to set it as.
Prefer a single port: use `builtin_signaling: 'same_as_udp'` when the UDP port is also open on TCP (e.g. Pterodactyl allocations), so users only need one port. Only give `builtin_signaling` its own port if the host really hands out TCP and UDP separately. Leave `builtin_signaling` out if your servers only support external signaling, and set `external_signaling` if you run your own signaling service (or `false` if external signaling is blocked).
Anything else users need to change in the config, such as which Bedrock address to use, goes in `config.notes`, which are shown below the generated config.
Every string is translated, so keep them few: use the templates at the top of `src/data/providers.ts` (such as `ports.assign` or `customInstallLocations.plugin_list`) where they fit, and only set `install`, `connect` or notes when the generated steps are not enough.
If the host has not confirmed these details yet, set `config.confirmed: false`, and the guide shows a warning. Remove it once the host confirms them.
```diff
{
name: 'Cubes Hosting',
url: 'https://www.cubes.host/',
description: translate({
id: 'providers.provider.cubes_hosting.description',
message: "Install Geyser using the plugin manager. Then restart the server and Geyser will run on an additional port - you can check it in the server console. Geyser-Standalone can be set up through a support ticket."
})
},
+ {
+ name: 'Example Hosting Provider',
+ url: 'https://example.com/',
+ description: translate({
+ id: 'providers.provider.example_hosting_provider.description',
+ message: "Add a description of how to install Geyser on this hosting provider."
+ })
+ name: 'Example Hosting Provider',
+ url: 'https://example.com/',
+ updated: '2026-10-11',
+ links: { article: 'https://example.com/docs/geyser' },
+ config: {
+ udp: {
+ obtain: translate({
+ id: 'providers.provider.example_hosting_provider.port',
+ message: "Open an additional port in the Network tab."
+ })
+ },
+ builtin_signaling: 'same_as_udp'
+ }
+ },
{
name: 'exaroton',
url: 'https://exaroton.com/',
description: translate({
id: 'providers.provider.exaroton.description',
message: descriptionTemplates.default
})
},
```
If possible, use one of the templates listed at the top of the file, such as `descriptionTemplates.default`.
Hosts that support Geyser through Open Collaboration also get an `open_collaboration` entry with their `tier` (`bronze`, `silver` or `gold`), and an optional `logo` (placed in `static/img/hosts`) and `description`. Silver and gold hosts are listed on the [Hosting Providers](https://geysermc.org/hosting) page, and pinned at the top of the setup guide; bronze hosts are listed like any other host.
If Geyser is installed and configured by the host, use `config: { preconfigured: true, port }` instead, where `port` is the port players connect with, and explain the installation in `install`. Hosts can configure Geyser without config changes using [system properties](https://geysermc.org/wiki/geyser/geyser-command-line-arguments-and-system-properties), such as `-DgeyserTransport`, `-DgeyserSignalingMode`, `-DgeyserWebrtcPort` and `-DgeyserSignalingPort`.
## Creating a New Page
+175
View File
@@ -0,0 +1,175 @@
# Listing Your Hosting Service in the Geyser Setup Guide
This page is for hosting providers that want to add or update their entry in the [Geyser setup guide](https://geysermc.org/wiki/geyser/setup/).
The setup guide system works by using properties instructing users what to do. These are steps users will see:
downloading Geyser, the exact config changes, and what to enter in Minecraft: Bedrock Edition to connect.
Whenever possible, please use the pre-configured strings at the top of `providers.ts`! This makes it possible for us to
translate the guide with the help of our translators. You can add your own guide with images if you'd like, but please
ensure that the info provided to us is enough to get Geyser running.
Entries are found in [`src/data/providers.ts`](src/data/providers.ts), in alphabetical order. The fields are documented in [`src/types/providers.ts`](src/types/providers.ts).
## How to Submit Changes
- Open a [pull request](https://github.com/GeyserMC/GeyserWebsite/pulls) that edits your entry, or
- Contact us on [Discord](https://discord.gg/geysermc) with the details below if you're unsure about details.
## What We Need to Know
Bedrock Edition connects over NetherNet, which needs:
- a **UDP** port for gameplay (WebRTC), and
- a **TCP** port for signaling, which is how players find the server. Geyser can run signaling itself ("built-in signaling"),
or use an external signaling service ([Warden](https://warden.cloud) by default), which needs no TCP port.
The Java server's port cannot be used for built-in signaling, because the Java server already uses it over TCP.
If your servers can only use the Java server's port, Geyser falls back to external signaling.
These questions may help you:
1. **Do you install and configure Geyser for your customers?** For example, a toggle in your panel, or Geyser set up on every server by default.
2. **If not, how does a customer get a port for Geyser?** For example, the customer adds one in the panel, picks one from ports already assigned to the server, or asks support.
3. **Is that port open for both TCP and UDP?** Pterodactyl allocations usually are.
4. **Do you run your own NXS-compatible signaling service or have a reverse-proxy set up?**
5. **Which links should we show?** These can be your own Geyser article, your support page and your Discord server.
If you have further specific instructions that you can't fit into the guide, please reach out to us on Discord so we can discuss them!
## Use the Pre-Configured Strings
Every sentence in an entry is sent to translators for every language the website supports. So we ask hosts to use the pre-configured
strings at the top of `providers.ts` wherever they fit, and to write their own text only for steps that are specific to their panel.
| Situation | Use |
|---------------------------------------------------------------------|-------------------------------------------------------------------|
| The customer adds a port in your panel | `udp: ports.assign` |
| The customer picks one of the ports already assigned to the server | `udp: ports.allocated` |
| The customer asks support for a port | `udp: ports.askHost` |
| You configure Geyser, and show customers their Bedrock port | `config: { preconfigured: true, port: ports.fromHost }` |
| You use the same port for every server | a number, e.g. `port: 19132` |
| Geyser is installed through your plugin or mod list | `install: customInstallLocations.plugin_list` |
| Geyser is installed and configured on every server | `install: infos.installed_by_default` |
| An "Enable Bedrock crossplay?" option when changing server software | `install: customInstallLocations.enable_bedrock_crossplay_option` |
| Players use a different address than the Java server's | `config.notes: [javaAddressInstruction]` |
| You only serve one region | `notices: { info: onlyServesRegion('Australia') }` |
`ports.newPort` is for hosts we have no details on yet. Please replace it with one of the options above.
### What the Guide Already Covers
Do not add text for these. The guide generates them for you:
- downloading Geyser and placing the jar,
- the `bedrock` section of the config, including `port`, `webrtc-port`, `transport` and the signaling mode,
- which config option to set your port as,
- turning off `clone-remote-port`, which many hosts used to preset,
- what players enter to connect: the Java server's address and the Bedrock port.
### Writing Your Own Text
When a pre-configured string does not fit, add a `translate({ id, message })`:
- **Write full sentences.** Translators see each string on its own, so do not split a sentence across strings or values.
- **Name the place in your panel**, e.g. "Open an additional port in the Network tab."
- **Do not link to images or screenshots.** If your panel needs pictures to explain, put them in your own Geyser article and link it as `links.article`.
- **Do not link to order or pricing pages.** Links are limited to your article, support and Discord.
- **Use an id in the form `providers.provider.<your_host>.<field>`**, e.g. `providers.provider.example_host.install`.
When you change the text of an existing string, give it a new id, so translations of the old text are not shown for the new one.
## Which Fields Go Where
The setup guide shows an entry in this order:
| Field | Shown as |
|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
| `links` | Buttons at the top: `article` (your Geyser guide), `support`, `discord` |
| `install` | Step 1, instead of the download steps |
| `config` | Step 2: your ports, and what to change in the Geyser config |
| `extra_step` | Step 3, e.g. a panel option the customer has to turn on |
| `connect` | Step 4, instead of the generated connect instructions. Only set this if players connect differently, e.g. through a lobby with `/join` |
| `notices.info` / `notices.warn` | Notes next to the guide |
| `notices.unsupported` | Replaces the guide, for hosts Geyser does not work on |
| `proxies_banned` | Hides the Velocity, BungeeCord, Standalone and ViaProxy guides |
Set `updated` to the date you add or change the entry, as `'YYYY-MM-DD'`. The guide shows it as "Instructions last updated on".
## Confirming Your Entry
Most entries were reported by the community, and have `confirmed: false`. The guide then shows a warning that the steps
have not been checked for NetherNet, and points players to the "Not listed" guide.
Once you have tested the steps on your service, remove `confirmed: false`. Only do this for steps you have tested.
## Configuring Geyser for Your Customers
If you set up Geyser for your customers, you can do it without editing their config by using [system properties](https://geysermc.org/wiki/geyser/geyser-command-line-arguments-and-system-properties#nethernet-system-properties) in the start command, for example:
```sh
java -DgeyserTransport=nethernet -DgeyserUdpPort=19132 -jar server.jar
```
Please see our [documentation](https://geysermc.org/wiki/geyser/geyser-command-line-arguments-and-system-properties) for more information.
Built-in signaling uses plain HTTP by default, which makes Minecraft show a "Trust on First Use?" prompt. See [HTTPS for NetherNet](https://geysermc.org/wiki/geyser/nethernet-https) to avoid it.
Then use `config: { preconfigured: true, port }` in your entry, and describe how customers turn Geyser on in `install`.
## Examples
A host whose customers add a port in the panel, open for TCP and UDP:
```ts
{
name: 'Example Host',
url: 'https://example.com/',
updated: '2026-10-16',
links: { article: 'https://example.com/docs/geyser', discord: 'https://discord.gg/example' },
install: customInstallLocations.plugin_list,
config: {
udp: {
obtain: translate({
id: 'providers.provider.example_host.port',
message: "Open an additional port in the Network tab of your panel."
})
},
builtin_signaling: 'same_as_udp'
}
},
```
A host that configures Geyser itself:
```ts
{
name: 'Example Host',
url: 'https://example.com/',
updated: '2026-10-16',
links: { support: 'https://example.com/support' },
install: translate({
id: 'providers.provider.example_host.install',
message: "Turn on 'Bedrock crossplay' in the Software tab of your panel, and restart the server."
}),
config: { preconfigured: true, port: ports.fromHost }
},
```
A host where customers ask support for a port, and only get one with a dedicated IP address:
```ts
{
name: 'Example Host',
url: 'https://example.com/',
updated: '2026-10-16',
config: {
udp: ports.askHost,
builtin_signaling: 'same_as_udp',
notes: [otherInstructions.dedicatedIp]
}
},
```
## Supporting Geyser
Hosts that support Geyser's development through [Open Collaboration](https://opencollaboration.dev) get an `open_collaboration` entry with their
`tier` (`bronze`, `silver` or `gold`), and are highlighted in the setup guide. Silver and gold hosts can add a `logo` (placed in `static/img/hosts`) and a short `description`.
+6 -3
View File
@@ -1,9 +1,12 @@
---
title: "1.18 Release, MCProtocolLib, Refactors & More!"
slug: "1-18-release-and-more"
title: '1.18 Release, MCProtocolLib, Refactors & More!'
slug: 1-18-release-and-more
authors: RednedEpic
hide_table_of_contents: false
description: "In this post, we will be covering all the changes that led up to the 1.18 release."
description: >-
In this post, we will be covering all the changes that led up to the 1.18
release.
crowdin_page_id: cd16bcf9-0de9-4239-946a-4ccdbeb372f6
---
Hi everyone 👋
+4 -3
View File
@@ -1,9 +1,10 @@
---
title: "Looking back at 2022"
slug: "looking-back-at-2022"
title: Looking back at 2022
slug: looking-back-at-2022
authors: Camotoy
hide_table_of_contents: false
description: "A look back at the year of 2022 for Geyser."
description: A look back at the year of 2022 for Geyser.
crowdin_page_id: 921bcb8d-70cb-49d1-9f83-deb59979eafa
---
Hi.
+4 -3
View File
@@ -1,9 +1,10 @@
---
title: "Four Years of Geyser"
slug: "four-years-of-geyser"
title: Four Years of Geyser
slug: four-years-of-geyser
authors: RednedEpic
hide_table_of_contents: false
description: "Geyser is now four years old!"
description: Geyser is now four years old!
crowdin_page_id: 67cfbd70-8366-42ed-b564-b84ed9ce65b5
---
Hi everyone,
+5 -4
View File
@@ -1,9 +1,10 @@
---
title: "Geyser Available for Java 1.20.5/1.20.6"
slug: "geyser-1-20-5"
title: Geyser Available for Java 1.20.5/1.20.6
slug: geyser-1-20-5
authors: Camotoy
hide_table_of_contents: false
description: "Support for Java 1.20.5 and 1.20.6 has been released"
description: Support for Java 1.20.5 and 1.20.6 has been released
crowdin_page_id: f0219b8c-1dab-417d-99bb-6a068307fae9
---
Support for Java 1.20.5 and 1.20.6 has been released. Thank you for your patience as we work on the update!
@@ -56,4 +57,4 @@ This update would have been a nightmare without the many hands we had to help im
[AJ Ferguson](https://github.com/AJ-Ferguson) and [Chris](https://github.com/onebeastchris) both helped with implementing new features and fixing regressions.
[Kastle](https://github.com/Kas-tle), hot off the heels of stronger security protections on the Bedrock side, assisted with custom skull reimplementation and entity properties implementation.
[Kastle](https://github.com/Kas-tle), hot off the heels of stronger security protections on the Bedrock side, assisted with custom skull reimplementation and entity properties implementation.
@@ -1,9 +1,10 @@
---
title: "RakNet Amplification Attack Summary and Response"
slug: "raknet-amplification-attack"
title: RakNet Amplification Attack Summary and Response
slug: raknet-amplification-attack
authors: Kas-tle
hide_table_of_contents: false
description: "A look at how we dealt with an exploit in the RakNet protocol"
description: A look at how we dealt with an exploit in the RakNet protocol
crowdin_page_id: 4a2c95a7-61af-4d0b-aa13-d034e0e5a0b9
---
In March, we were made aware of an exploit in the RakNet networking library used by Geyser, making Geyser instances vulnerable to use in a Distributed Denial of Service (DDoS) amplification attack. This bug was patched on all builds of Geyser numbered 478 and later. If you are still running an outdated build of Geyser, you should update immediately by downloading the latest build from [https://geysermc.org/download](https://geysermc.org/download). The original [security advisory](https://github.com/CloudburstMC/Network/security/advisories/GHSA-6h3m-c6fv-8hvh) for this vulnerability was published on the [CloudburstMC/Network](https://github.com/CloudburstMC/Network) repository. This post will detail the timeline, anatomy of the attack, our response, and additional measures we have taken to prevent similar attacks in the future.
@@ -239,4 +240,4 @@ It is extremely important that all those running vulnerable instances of Geyser
## Acknowledgements
We thank the community for their patience as we addressed this issue, all those who responsibly disclosed this issue to us, the developers at Cloudburst and Geyser that worked to mitigate the issue, the server hosts that took an active role in ensuring instances on their hosting services were patched as soon as possible, all donors for their financial support of Geyser, and Cubecraft for their continued financial and operational support of the project.
We thank the community for their patience as we addressed this issue, all those who responsibly disclosed this issue to us, the developers at Cloudburst and Geyser that worked to mitigate the issue, the server hosts that took an active role in ensuring instances on their hosting services were patched as soon as possible, all donors for their financial support of Geyser, and Cubecraft for their continued financial and operational support of the project.
+475 -472
View File
@@ -1,472 +1,475 @@
---
title: "Bedrock Early Packet Handling DoS Attack Summary and Response"
slug: "early-packet-handling-attack"
authors: Kas-tle
hide_table_of_contents: false
description: "A summary of how we addressed a series of exploits targeting Geyser's early handling of Bedrock game packets"
---
Back in July, we received reports of multiple Geyser instances experiencing targeted Denial of Service (DoS) attacks exhibiting similar characteristics. Out of an abundance of caution, we delayed making this post to ensure that users had adequate time to upgrade. The bugs that allowed for this string of attacks were patched on Geyser builds numbered 897 and later. In the unlikely event you are still running an outdated build of Geyser from many months ago, you should update immediately by downloading the latest build from [https://geysermc.org/download](https://geysermc.org/download). The original [security advisory](https://github.com/GeyserMC/Geyser/security/advisories/GHSA-m2q6-2hwr-643w) for this vulnerability was published on the [GeyserMC/Geyser](https://github.com/GeyserMC/Geyser) repository. This response will detail the timeline, attack vectors, how they were patched, and additional measures we took to prevent future attacks.
<!-- truncate -->
## Timeline (UTC)
- **July 29th, 9:40PM:** Server being attacked privately reports the issue to Geyser and shares logs
- **July 29th, 11:45PM:** Preemptive patch is released to limit the number of authenticated connections per address
- **July 30th, 5:36PM:** Large servers continue to report attacks with newer builds of Geyser
- **July 30th, 6:20PM:** A server being attacked provides us with packet logs, illustrating what Bedrock packets malicious clients are using to carry out the attack
- **July 30th, 6:52PM:** Second patch is released to ensure the Bedrock client can only signal complete of resource pack sending once per session
- **July 30th, 7:45PM:** Issue regarding connections failing to close out is reported to upstream Bedrock protocol library
- **July 30th, 9:35PM:** Upstream Bedrock protocol library publishes patch to ensure connections are properly closed when Bedrock users are disconnected
- **July 30th, 10:45PM:** Third patch is released updating the upstream Bedrock protocol library and ensuring Bedrock connections that cause exceptions are closed immediately
- **July 31st, 11:24PM:** An @everyone ping is made in the Geyser Discord advising users to update their Geyser instances, and the initial security advisory is published to GitHub.
## Initial Disclosure
Use of this attack was first privately reported to us by multiple larger servers using Geyser. We were provided server logs showing a single user appearing to be authenticated multiple times. The logs generally took a form of:
```log
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
[17:26:09.183 GeyserServerChild-4-1/ERROR] BedrockPleyer is already logged in!
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.183 clientNetworkSession-6-3/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[17:26:09.183 clientNetworkSession-6-1/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[17:26:09.183 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[17:26:09.184 clientNetworkSession-6-4/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[17:26:09.185 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.185 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
```
Based on the content of these logs, we initially suspected that packets in the early phase of the Bedrock connection were being exploited. However, we were not yet sure of what specific packets the attacker was sending. Based on these logs, we released a preemptive patch to ensure that the number of authenticated users from a single IP address at any given time was limited. This alone, however, would prove to be insufficient to mitigate the attack.
## Game Packet and Code Analysis of the First Attack Vector
Understanding this attack requires a basic understanding of the general Bedrock login process. This is detailed below:
![chart_04 Bedrock Login Process](/img/blog/2025-11-30-early-packet-handling-attack/chart_04.svg#gh-light-mode-only)![chart_04 Bedrock Login Process](/img/blog/2025-11-30-early-packet-handling-attack/chart_04_dark.svg#gh-dark-mode-only)
In order to fully mitigate this attack, we required packet capture samples from a server being actively exploited. This is somewhat challenging to achieve, as traffic at the Bedrock protocol level is generally encrypted after the player has logged into the server. As a result, a modified build of Geyser is required to capture this traffic. We were fortunate to have the cooperation of a server being targeted with this attack, who installed a build of Geyser we provided to log packets. This was the resulting log, with IP addresses and usernames redacted:
```log
[18:16:37.767 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ClientToServerHandshakePacket
[18:16:37.795 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.808 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.808 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.809 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.809 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.809 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.809 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.812 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.812 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.820 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:16:37.820 clientNetworkSession-6-1/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:16:37.820 clientNetworkSession-6-4/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:16:37.820 clientNetworkSession-6-3/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:16:37.848 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.849 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.849 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[18:16:37.849 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.849 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.850 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[18:16:37.850 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.850 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.850 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[18:16:37.850 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
```
The above log clearly indicates that the packet being exploited is the [ResourcePackClientResponsePacket](https://mojang.github.io/bedrock-protocol-docs/html/ResourcePackClientResponsePacket.html). This leads to code paths in Geyser being called multiple times a way that is not intended, ultimately leading to increased resource consumption. We can essentially summarize the attack as follows:
![chart_02 Attack Summary](/img/blog/2025-11-30-early-packet-handling-attack/chart_02.svg#gh-light-mode-only)![chart_02 Attack Summary](/img/blog/2025-11-30-early-packet-handling-attack/chart_02_dark.svg#gh-dark-mode-only)
The initial response to the ResourcePackClientResponsePacket is handled by `UpstreamPacketHandler`:
```java
package org.geysermc.geyser.network;
// ...
public class UpstreamPacketHandler extends LoggingPacketHandler {
// ...
public PacketSignal handle(ResourcePackClientResponsePacket packet) {
// ...
switch (packet.getStatus()) {
case COMPLETED -> {
if (geyser.getConfig().getRemote().authType() != AuthType.ONLINE) {
session.authenticate(session.getAuthData().name());
} else if (!couldLoginUserByName(session.getAuthData().name())) {
// We must spawn the white world
session.connect();
}
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.connect", session.getAuthData().name()));
}
// ...
}
return PacketSignal.HANDLED;
}
// ...
}
```
We see in the code above that this will lead to the invocation of `GeyserSession#authenticate` for most connections, as most Geyser instances use `AuthType.FLOODGATE`:
```java
package org.geysermc.geyser.session;
// ...
public class GeyserSession implements GeyserConnection, GeyserCommandSource {
// ...
public void authenticate(String username) {
if (loggedIn) {
geyser.getLogger().severe(GeyserLocale.getLocaleStringLog("geyser.auth.already_loggedin", username));
return;
}
loggingIn = true;
// Always replace spaces with underscores to avoid illegal nicknames, e.g. with GeyserConnect
protocol = new MinecraftProtocol(username.replace(' ', '_'));
try {
connectDownstream();
} catch (Throwable t) {
t.printStackTrace();
}
}
// ...
}
```
This leads to the calling of `GeyserSession#connectDownstream`, which triggers a variety of logic to open a connection to the Java server:
```java
package org.geysermc.geyser.session;
// ...
public class GeyserSession implements GeyserConnection, GeyserCommandSource {
// ...
private void connectDownstream() {
SessionLoginEvent loginEvent = new SessionLoginEvent(this, remoteServer, new Object2ObjectOpenHashMap<>());
GeyserImpl.getInstance().eventBus().fire(loginEvent);
if (loginEvent.isCancelled()) {
String disconnectReason = loginEvent.disconnectReason() == null ?
BedrockDisconnectReasons.DISCONNECTED : loginEvent.disconnectReason();
disconnect(disconnectReason);
return;
}
this.cookies = loginEvent.cookies();
// Don't allow changing the remote server when it's not up to us
// Just imagine the chaos of using an integrated world manager for an external server :)
this.remoteServer = this.geyser.platformType() == PlatformType.STANDALONE ? loginEvent.remoteServer() : remoteServer;
// Start ticking
tickThread = tickEventLoop.scheduleAtFixedRate(this::tick, nanosecondsPerTick, nanosecondsPerTick, TimeUnit.NANOSECONDS);
ClientSession downstream;
if (geyser.getBootstrap().getSocketAddress() != null) {
// We're going to connect through the JVM and not through TCP
downstream = new LocalSession(geyser.getBootstrap().getSocketAddress(),
upstream.getAddress().getAddress().getHostAddress(),
this.protocol, this.tickEventLoop);
downstream.setFlag(MinecraftConstants.CLIENT_HOST, this.remoteServer.address());
downstream.setFlag(MinecraftConstants.CLIENT_PORT, this.remoteServer.port());
this.downstream = new DownstreamSession(downstream);
} else {
downstream = new ClientNetworkSession(new InetSocketAddress(this.remoteServer.address(), this.remoteServer.port()), this.protocol, tickEventLoop, null, null);
this.downstream = new DownstreamSession(downstream);
boolean resolveSrv = false;
try {
resolveSrv = this.remoteServer.resolveSrv();
} catch (AbstractMethodError | NoSuchMethodError ignored) {
// Ignore if the method doesn't exist
// This will happen with extensions using old APIs
}
this.downstream.getSession().setFlag(BuiltinFlags.ATTEMPT_SRV_RESOLVE, resolveSrv);
}
// Disable automatic creation of a new TcpClientSession when transferring - we don't use that functionality.
this.downstream.getSession().setFlag(MinecraftConstants.FOLLOW_TRANSFERS, false);
if (geyser.getConfig().getRemote().isUseProxyProtocol()) {
downstream.setFlag(BuiltinFlags.CLIENT_PROXIED_ADDRESS, upstream.getAddress());
}
if (geyser.getConfig().isForwardPlayerPing()) {
// Let Geyser handle sending the keep alive
downstream.setFlag(MinecraftConstants.AUTOMATIC_KEEP_ALIVE_MANAGEMENT, false);
}
// We'll handle this since we have the registry data on hand
downstream.setFlag(MinecraftConstants.SEND_BLANK_KNOWN_PACKS_RESPONSE, false);
// We manually add the default listener to ensure the order of listeners.
protocol.setUseDefaultListeners(false);
// MCPL listener comes first to handle protocol state switching before Geyser translates packets
downstream.addListener(new ClientListener(HandshakeIntent.LOGIN));
// Geyser adapter second to ensure translating packets in the correct states
downstream.addListener(new GeyserSessionAdapter(this));
downstream.setFlag(BuiltinFlags.CLIENT_TRANSFERRING, loginEvent.transferring());
downstream.connect(false);
if (!daylightCycle) {
setDaylightCycle(true);
}
}
// ...
}
```
Notably, this allows for multiple downstream sessions (representing Geyser's connection to the Java server per player) to be created for a single Bedrock session. This is not intended behavior, as it leads to significantly increased resource consumption. This is especially true on Geyser Standalone, which, as seen in the code above, must open a TCP session to the Java server. The window of time for an attacker to pull this off is relatively short, as once Geyser completes the Java login process on behalf of the Bedrock client, `GeyserSession.loggedIn` is set to true, preventing further calls to `GeyserSession#connectDownstream`. However, this is still enough time for an attacker to create numerous downstream sessions, leading to a DoS attack. We attempted to mitigate this by disconnecting clients that send multiple ResourcePackClientResponsePacket in a single session. The following class diagram summarizes this:
![chart_05 Multiple Sessions Class Diagram](/img/blog/2025-11-30-early-packet-handling-attack/chart_05.svg#gh-light-mode-only)![chart_05 Multiple Sessions Class Diagram](/img/blog/2025-11-30-early-packet-handling-attack/chart_05_dark.svg#gh-dark-mode-only)
## Code Analysis of the Second Attack Vector
While we thought we had addressed the root issue and provided the affected users with a patch for testing, we quickly received logs that indicated otherwise:
```log
[18:54:29.235 GeyserServerChild-4-3/INFO] Player connected with username BedrockPlayer
[18:54:29.237 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:54:49.257 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:49.259 GeyserServerChild-4-3/INFO] BedrockPlayer has disconnected from remote Java server on address 127.0.0.1 because of An internal error occurred!
[18:54:52.836 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:55.620 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:56.186 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:56.872 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:59.508 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:02.551 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:03.025 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:03.619 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:04.254 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:04.922 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:05.435 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:07.662 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:08.139 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:08.650 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:11.066 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:13.498 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:14.023 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:14.466 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:15.057 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:15.712 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:16.211 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:18.431 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:18.966 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:19.443 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:21.599 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:23.904 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:24.409 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:24.971 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:25.539 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:26.225 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
```
These exceptions are thrown by Geyser's InvalidPacketHandler, which is designed to quickly disconnect players that send malformed packets or packets that exceed the expected size limits. This is a security measure to prevent potential exploits or crashes caused by invalid data.
```java
package org.geysermc.geyser.network;
// ...
public class InvalidPacketHandler extends ChannelInboundHandlerAdapter {
public static final String NAME = "rak-error-handler";
private final GeyserSession session;
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
Throwable rootCause = Stream.iterate(cause, Throwable::getCause)
.filter(element -> element.getCause() == null)
.findFirst()
.orElse(cause);
GeyserLogger logger = GeyserImpl.getInstance().getLogger();
if (!(rootCause instanceof IllegalArgumentException)) {
// Kick users that cause exceptions
logger.warning("Exception caught in session of " + session.bedrockUsername() + ": " + rootCause.getMessage());
session.disconnect("An internal error occurred!");
return;
}
// Kick users that try to send illegal packets
logger.warning("Illegal packet from " + session.bedrockUsername() + ": " + rootCause.getMessage());
if (logger.isDebug()) {
cause.printStackTrace();
}
session.disconnect("Invalid packet received!");
}
}
```
This makes the aforementioned logs of particular concern, as it should not be possible for any exceptions to be triggered from this handler multiple times. The first exception should be logged and trigger an immediate disconnect, preventing further exceptions from being thrown. Despite this, the log clearly indicates that multiple exceptions are being thrown in quick succession, suggesting that the disconnect is not being handled as intended. This is summarized below:
![chart_03 Exception Handler](/img/blog/2025-11-30-early-packet-handling-attack/chart_03.svg#gh-light-mode-only)![chart_03 Exception Handler](/img/blog/2025-11-30-early-packet-handling-attack/chart_03_dark.svg#gh-dark-mode-only)
We first followed the chain of `GeyserSession#disconnect`. This invokes Geyser's `UpstreamSession#disconnect`, which contains `BedrockServerSession` and invokes `BedrockServerSession#disconnect`. Beyond this, the disconnect logic is handled by the upstream Bedrock protocol library used by Geyser, [CloudburstMC/Protocol](https://github.com/CloudburstMC/Protocol). The overall logic is summarized below:
![chart_01 GeyserSession Disconnect Chain](/img/blog/2025-11-30-early-packet-handling-attack/chart_01.svg#gh-light-mode-only)![chart_01 GeyserSession Disconnect Chain](/img/blog/2025-11-30-early-packet-handling-attack/chart_01_dark.svg#gh-dark-mode-only)
Upon further investigation, we found that the Bedrock protocol library did not actually close the underlying Netty channel when a disconnect was triggered:
```java
package org.cloudburstmc.protocol.bedrock;
// ...
public class BedrockServerSession extends BedrockSession {
// ...
public void disconnect(@Nullable String reason, boolean hideReason) {
this.checkForClosed();
DisconnectPacket packet = new DisconnectPacket();
if (reason == null || hideReason) {
packet.setMessageSkipped(true);
reason = BedrockDisconnectReasons.DISCONNECTED;
}
packet.setKickMessage(reason);
this.sendPacketImmediately(packet);
}
}
```
This allows an attacker that should have been disconnected to continue to send malicous packets that lead to expensive deserialization logic. The result is another potential denial of service (DoS) attack vector.
## Patch and Mitigation
We mitigated the first attack vector by ensuring that the Bedrock client can only signal completion of resource pack sending once per session. This was done by modifying the `UpstreamPacketHandler` to check if the `finishedResourcePackSending` flag is already set before proceeding with authentication logic:
```java
package org.geysermc.geyser.network;
// ...
public class UpstreamPacketHandler extends LoggingPacketHandler {
// ...
public PacketSignal handle(ResourcePackClientResponsePacket packet) {
// ...
// highlight-start
if (finishedResourcePackSending) {
session.disconnect("Illegal duplicate resource pack response packet received!");
return PacketSignal.HANDLED;
}
// highlight-end
// ...
switch (packet.getStatus()) {
case COMPLETED -> {
// highlight-start
finishedResourcePackSending = true;
// highlight-end
if (geyser.getConfig().getRemote().authType() != AuthType.ONLINE) {
session.authenticate(session.getAuthData().name());
} else if (!couldLoginUserByName(session.getAuthData().name())) {
// We must spawn the white world
session.connect();
}
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.connect", session.getAuthData().name()));
}
// ...
}
return PacketSignal.HANDLED;
}
// ...
}
```
This ensures that any further attempts to send a `ResourcePackClientResponsePacket` after the first one will result in an immediate disconnect, preventing the creation of multiple downstream sessions.
The second attack vector was mitigated by ensuring that the disconnect logic in the Bedrock protocol library properly closes the underlying Netty channel. This was achieved by modifying the `BedrockServerSession#disconnect` method to schedule a task that closes the session after a timeout, ensuring that the channel is closed after the disconnect packet is sent. Packet serialzation is also stopped immediately for disconnected clients:
```java
package org.cloudburstmc.protocol.bedrock;
// ...
public class BedrockServerSession extends BedrockSession {
private static final int TIMEOUT_SECONDS = SystemPropertyUtil.getInt("org.cloudburstmc.protocol.bedrock.disconnectTimeout", 10);
// ...
public void disconnect(@Nullable String reason, boolean hideReason) {
this.checkForClosed();
DisconnectPacket packet = new DisconnectPacket();
String finalReason;
if (reason == null || hideReason) {
packet.setMessageSkipped(true);
finalReason = BedrockDisconnectReasons.DISCONNECTED;
} else {
finalReason = reason;
}
packet.setKickMessage(finalReason);
this.sendPacketImmediately(packet);
// highlight-start
if (!this.isSubClient()) {
this.getPeer().blackholeInboundPackets();
}
this.getPeer().channel.eventLoop().schedule(() -> {
if (this.isConnected()) {
this.close(finalReason);
}
}, TIMEOUT_SECONDS, TimeUnit.SECONDS);
// highlight-end
}
}
```
Logic was also added to Geyser's `InvalidPacketHandler` to ensure that invalid packets result in an immediate closing of the underlying Netty channel:
```java
package org.geysermc.geyser.network;
// ...
public class InvalidPacketHandler extends ChannelInboundHandlerAdapter {
public static final String NAME = "rak-error-handler";
private final GeyserSession session;
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
Throwable rootCause = Stream.iterate(cause, Throwable::getCause)
.filter(element -> element.getCause() == null)
.findFirst()
.orElse(cause);
GeyserLogger logger = GeyserImpl.getInstance().getLogger();
if (!(rootCause instanceof IllegalArgumentException)) {
// Kick users that cause exceptions
logger.error("Exception caught in session of " + session.bedrockUsername(), cause);
session.disconnect("An internal error occurred!");
// highlight-start
session.forciblyCloseUpstream();
// highlight-end
return;
}
// Kick users that try to send illegal packets
logger.error("Illegal packet from " + session.bedrockUsername(), cause);
session.disconnect("Invalid packet received!");
// highlight-start
session.forciblyCloseUpstream();
// highlight-end
}
}
```
## Long Term Impact
All users of Geyser running outdated builds should update as soon as possible to ensure they are not vulnerable to the attacks described in this post. During the process of investigating this attack, we were made aware of multiple servers being exploited, meaning this is being exploited in the wild. Unlike the previous RakNet amplification attack, this attack is limited in scope to the selected Geyser instance. We expect the number of unpatched instances to decrease over time as Bedrock updates require server owners to update their Geyser instances. As of November 2025, we have not received any recent reports of Geyser instances being targeted by this attack vector, indicating that most instances have been patched.
## Acknowledgements
We thank the community for their patience as we addressed this issue, the server owners who responsibly disclosed this issue to us, the developers at Cloudburst and Geyser that worked to mitigate the issue, all donors for their financial support of Geyser, and Cubecraft and Open Collaboration for their continued financial and operational support of the project.
---
title: Bedrock Early Packet Handling DoS Attack Summary and Response
slug: early-packet-handling-attack
authors: Kas-tle
hide_table_of_contents: false
description: >-
A summary of how we addressed a series of exploits targeting Geyser's early
handling of Bedrock game packets
crowdin_page_id: 7573bcfd-c352-458c-b052-c4d74568453c
---
Back in July, we received reports of multiple Geyser instances experiencing targeted Denial of Service (DoS) attacks exhibiting similar characteristics. Out of an abundance of caution, we delayed making this post to ensure that users had adequate time to upgrade. The bugs that allowed for this string of attacks were patched on Geyser builds numbered 897 and later. In the unlikely event you are still running an outdated build of Geyser from many months ago, you should update immediately by downloading the latest build from [https://geysermc.org/download](https://geysermc.org/download). The original [security advisory](https://github.com/GeyserMC/Geyser/security/advisories/GHSA-m2q6-2hwr-643w) for this vulnerability was published on the [GeyserMC/Geyser](https://github.com/GeyserMC/Geyser) repository. This response will detail the timeline, attack vectors, how they were patched, and additional measures we took to prevent future attacks.
<!-- truncate -->
## Timeline (UTC)
- **July 29th, 9:40PM:** Server being attacked privately reports the issue to Geyser and shares logs
- **July 29th, 11:45PM:** Preemptive patch is released to limit the number of authenticated connections per address
- **July 30th, 5:36PM:** Large servers continue to report attacks with newer builds of Geyser
- **July 30th, 6:20PM:** A server being attacked provides us with packet logs, illustrating what Bedrock packets malicious clients are using to carry out the attack
- **July 30th, 6:52PM:** Second patch is released to ensure the Bedrock client can only signal complete of resource pack sending once per session
- **July 30th, 7:45PM:** Issue regarding connections failing to close out is reported to upstream Bedrock protocol library
- **July 30th, 9:35PM:** Upstream Bedrock protocol library publishes patch to ensure connections are properly closed when Bedrock users are disconnected
- **July 30th, 10:45PM:** Third patch is released updating the upstream Bedrock protocol library and ensuring Bedrock connections that cause exceptions are closed immediately
- **July 31st, 11:24PM:** An @everyone ping is made in the Geyser Discord advising users to update their Geyser instances, and the initial security advisory is published to GitHub.
## Initial Disclosure
Use of this attack was first privately reported to us by multiple larger servers using Geyser. We were provided server logs showing a single user appearing to be authenticated multiple times. The logs generally took a form of:
```log
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
[17:26:09.183 GeyserServerChild-4-1/ERROR] BedrockPleyer is already logged in!
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.183 clientNetworkSession-6-3/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[17:26:09.183 clientNetworkSession-6-1/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[17:26:09.183 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[17:26:09.184 clientNetworkSession-6-4/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[17:26:09.185 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[17:26:09.185 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
```
Based on the content of these logs, we initially suspected that packets in the early phase of the Bedrock connection were being exploited. However, we were not yet sure of what specific packets the attacker was sending. Based on these logs, we released a preemptive patch to ensure that the number of authenticated users from a single IP address at any given time was limited. This alone, however, would prove to be insufficient to mitigate the attack.
## Game Packet and Code Analysis of the First Attack Vector
Understanding this attack requires a basic understanding of the general Bedrock login process. This is detailed below:
![chart_04 Bedrock Login Process](/img/blog/2025-11-30-early-packet-handling-attack/chart_04.svg#gh-light-mode-only)![chart_04 Bedrock Login Process](/img/blog/2025-11-30-early-packet-handling-attack/chart_04_dark.svg#gh-dark-mode-only)
In order to fully mitigate this attack, we required packet capture samples from a server being actively exploited. This is somewhat challenging to achieve, as traffic at the Bedrock protocol level is generally encrypted after the player has logged into the server. As a result, a modified build of Geyser is required to capture this traffic. We were fortunate to have the cooperation of a server being targeted with this attack, who installed a build of Geyser we provided to log packets. This was the resulting log, with IP addresses and usernames redacted:
```log
[18:16:37.767 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ClientToServerHandshakePacket
[18:16:37.795 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.808 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.808 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.809 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.809 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.809 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.809 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.812 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.812 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.820 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:16:37.820 clientNetworkSession-6-1/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:16:37.820 clientNetworkSession-6-4/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:16:37.820 clientNetworkSession-6-3/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:16:37.848 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.849 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.849 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[18:16:37.849 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.849 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.850 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[18:16:37.850 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
[18:16:37.850 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
[18:16:37.850 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
[18:16:37.850 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
```
The above log clearly indicates that the packet being exploited is the [ResourcePackClientResponsePacket](https://mojang.github.io/bedrock-protocol-docs/html/ResourcePackClientResponsePacket.html). This leads to code paths in Geyser being called multiple times a way that is not intended, ultimately leading to increased resource consumption. We can essentially summarize the attack as follows:
![chart_02 Attack Summary](/img/blog/2025-11-30-early-packet-handling-attack/chart_02.svg#gh-light-mode-only)![chart_02 Attack Summary](/img/blog/2025-11-30-early-packet-handling-attack/chart_02_dark.svg#gh-dark-mode-only)
The initial response to the ResourcePackClientResponsePacket is handled by `UpstreamPacketHandler`:
```java
package org.geysermc.geyser.network;
// ...
public class UpstreamPacketHandler extends LoggingPacketHandler {
// ...
public PacketSignal handle(ResourcePackClientResponsePacket packet) {
// ...
switch (packet.getStatus()) {
case COMPLETED -> {
if (geyser.getConfig().getRemote().authType() != AuthType.ONLINE) {
session.authenticate(session.getAuthData().name());
} else if (!couldLoginUserByName(session.getAuthData().name())) {
// We must spawn the white world
session.connect();
}
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.connect", session.getAuthData().name()));
}
// ...
}
return PacketSignal.HANDLED;
}
// ...
}
```
We see in the code above that this will lead to the invocation of `GeyserSession#authenticate` for most connections, as most Geyser instances use `AuthType.FLOODGATE`:
```java
package org.geysermc.geyser.session;
// ...
public class GeyserSession implements GeyserConnection, GeyserCommandSource {
// ...
public void authenticate(String username) {
if (loggedIn) {
geyser.getLogger().severe(GeyserLocale.getLocaleStringLog("geyser.auth.already_loggedin", username));
return;
}
loggingIn = true;
// Always replace spaces with underscores to avoid illegal nicknames, e.g. with GeyserConnect
protocol = new MinecraftProtocol(username.replace(' ', '_'));
try {
connectDownstream();
} catch (Throwable t) {
t.printStackTrace();
}
}
// ...
}
```
This leads to the calling of `GeyserSession#connectDownstream`, which triggers a variety of logic to open a connection to the Java server:
```java
package org.geysermc.geyser.session;
// ...
public class GeyserSession implements GeyserConnection, GeyserCommandSource {
// ...
private void connectDownstream() {
SessionLoginEvent loginEvent = new SessionLoginEvent(this, remoteServer, new Object2ObjectOpenHashMap<>());
GeyserImpl.getInstance().eventBus().fire(loginEvent);
if (loginEvent.isCancelled()) {
String disconnectReason = loginEvent.disconnectReason() == null ?
BedrockDisconnectReasons.DISCONNECTED : loginEvent.disconnectReason();
disconnect(disconnectReason);
return;
}
this.cookies = loginEvent.cookies();
// Don't allow changing the remote server when it's not up to us
// Just imagine the chaos of using an integrated world manager for an external server :)
this.remoteServer = this.geyser.platformType() == PlatformType.STANDALONE ? loginEvent.remoteServer() : remoteServer;
// Start ticking
tickThread = tickEventLoop.scheduleAtFixedRate(this::tick, nanosecondsPerTick, nanosecondsPerTick, TimeUnit.NANOSECONDS);
ClientSession downstream;
if (geyser.getBootstrap().getSocketAddress() != null) {
// We're going to connect through the JVM and not through TCP
downstream = new LocalSession(geyser.getBootstrap().getSocketAddress(),
upstream.getAddress().getAddress().getHostAddress(),
this.protocol, this.tickEventLoop);
downstream.setFlag(MinecraftConstants.CLIENT_HOST, this.remoteServer.address());
downstream.setFlag(MinecraftConstants.CLIENT_PORT, this.remoteServer.port());
this.downstream = new DownstreamSession(downstream);
} else {
downstream = new ClientNetworkSession(new InetSocketAddress(this.remoteServer.address(), this.remoteServer.port()), this.protocol, tickEventLoop, null, null);
this.downstream = new DownstreamSession(downstream);
boolean resolveSrv = false;
try {
resolveSrv = this.remoteServer.resolveSrv();
} catch (AbstractMethodError | NoSuchMethodError ignored) {
// Ignore if the method doesn't exist
// This will happen with extensions using old APIs
}
this.downstream.getSession().setFlag(BuiltinFlags.ATTEMPT_SRV_RESOLVE, resolveSrv);
}
// Disable automatic creation of a new TcpClientSession when transferring - we don't use that functionality.
this.downstream.getSession().setFlag(MinecraftConstants.FOLLOW_TRANSFERS, false);
if (geyser.getConfig().getRemote().isUseProxyProtocol()) {
downstream.setFlag(BuiltinFlags.CLIENT_PROXIED_ADDRESS, upstream.getAddress());
}
if (geyser.getConfig().isForwardPlayerPing()) {
// Let Geyser handle sending the keep alive
downstream.setFlag(MinecraftConstants.AUTOMATIC_KEEP_ALIVE_MANAGEMENT, false);
}
// We'll handle this since we have the registry data on hand
downstream.setFlag(MinecraftConstants.SEND_BLANK_KNOWN_PACKS_RESPONSE, false);
// We manually add the default listener to ensure the order of listeners.
protocol.setUseDefaultListeners(false);
// MCPL listener comes first to handle protocol state switching before Geyser translates packets
downstream.addListener(new ClientListener(HandshakeIntent.LOGIN));
// Geyser adapter second to ensure translating packets in the correct states
downstream.addListener(new GeyserSessionAdapter(this));
downstream.setFlag(BuiltinFlags.CLIENT_TRANSFERRING, loginEvent.transferring());
downstream.connect(false);
if (!daylightCycle) {
setDaylightCycle(true);
}
}
// ...
}
```
Notably, this allows for multiple downstream sessions (representing Geyser's connection to the Java server per player) to be created for a single Bedrock session. This is not intended behavior, as it leads to significantly increased resource consumption. This is especially true on Geyser Standalone, which, as seen in the code above, must open a TCP session to the Java server. The window of time for an attacker to pull this off is relatively short, as once Geyser completes the Java login process on behalf of the Bedrock client, `GeyserSession.loggedIn` is set to true, preventing further calls to `GeyserSession#connectDownstream`. However, this is still enough time for an attacker to create numerous downstream sessions, leading to a DoS attack. We attempted to mitigate this by disconnecting clients that send multiple ResourcePackClientResponsePacket in a single session. The following class diagram summarizes this:
![chart_05 Multiple Sessions Class Diagram](/img/blog/2025-11-30-early-packet-handling-attack/chart_05.svg#gh-light-mode-only)![chart_05 Multiple Sessions Class Diagram](/img/blog/2025-11-30-early-packet-handling-attack/chart_05_dark.svg#gh-dark-mode-only)
## Code Analysis of the Second Attack Vector
While we thought we had addressed the root issue and provided the affected users with a patch for testing, we quickly received logs that indicated otherwise:
```log
[18:54:29.235 GeyserServerChild-4-3/INFO] Player connected with username BedrockPlayer
[18:54:29.237 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
[18:54:49.257 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:49.259 GeyserServerChild-4-3/INFO] BedrockPlayer has disconnected from remote Java server on address 127.0.0.1 because of An internal error occurred!
[18:54:52.836 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:55.620 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:56.186 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:56.872 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:54:59.508 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:02.551 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:03.025 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:03.619 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:04.254 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:04.922 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:05.435 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:07.662 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:08.139 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:08.650 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:11.066 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:13.498 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:14.023 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:14.466 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:15.057 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:15.712 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:16.211 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:18.431 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:18.966 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:19.443 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:21.599 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:23.904 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:24.409 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:24.971 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:25.539 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
[18:55:26.225 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
```
These exceptions are thrown by Geyser's InvalidPacketHandler, which is designed to quickly disconnect players that send malformed packets or packets that exceed the expected size limits. This is a security measure to prevent potential exploits or crashes caused by invalid data.
```java
package org.geysermc.geyser.network;
// ...
public class InvalidPacketHandler extends ChannelInboundHandlerAdapter {
public static final String NAME = "rak-error-handler";
private final GeyserSession session;
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
Throwable rootCause = Stream.iterate(cause, Throwable::getCause)
.filter(element -> element.getCause() == null)
.findFirst()
.orElse(cause);
GeyserLogger logger = GeyserImpl.getInstance().getLogger();
if (!(rootCause instanceof IllegalArgumentException)) {
// Kick users that cause exceptions
logger.warning("Exception caught in session of " + session.bedrockUsername() + ": " + rootCause.getMessage());
session.disconnect("An internal error occurred!");
return;
}
// Kick users that try to send illegal packets
logger.warning("Illegal packet from " + session.bedrockUsername() + ": " + rootCause.getMessage());
if (logger.isDebug()) {
cause.printStackTrace();
}
session.disconnect("Invalid packet received!");
}
}
```
This makes the aforementioned logs of particular concern, as it should not be possible for any exceptions to be triggered from this handler multiple times. The first exception should be logged and trigger an immediate disconnect, preventing further exceptions from being thrown. Despite this, the log clearly indicates that multiple exceptions are being thrown in quick succession, suggesting that the disconnect is not being handled as intended. This is summarized below:
![chart_03 Exception Handler](/img/blog/2025-11-30-early-packet-handling-attack/chart_03.svg#gh-light-mode-only)![chart_03 Exception Handler](/img/blog/2025-11-30-early-packet-handling-attack/chart_03_dark.svg#gh-dark-mode-only)
We first followed the chain of `GeyserSession#disconnect`. This invokes Geyser's `UpstreamSession#disconnect`, which contains `BedrockServerSession` and invokes `BedrockServerSession#disconnect`. Beyond this, the disconnect logic is handled by the upstream Bedrock protocol library used by Geyser, [CloudburstMC/Protocol](https://github.com/CloudburstMC/Protocol). The overall logic is summarized below:
![chart_01 GeyserSession Disconnect Chain](/img/blog/2025-11-30-early-packet-handling-attack/chart_01.svg#gh-light-mode-only)![chart_01 GeyserSession Disconnect Chain](/img/blog/2025-11-30-early-packet-handling-attack/chart_01_dark.svg#gh-dark-mode-only)
Upon further investigation, we found that the Bedrock protocol library did not actually close the underlying Netty channel when a disconnect was triggered:
```java
package org.cloudburstmc.protocol.bedrock;
// ...
public class BedrockServerSession extends BedrockSession {
// ...
public void disconnect(@Nullable String reason, boolean hideReason) {
this.checkForClosed();
DisconnectPacket packet = new DisconnectPacket();
if (reason == null || hideReason) {
packet.setMessageSkipped(true);
reason = BedrockDisconnectReasons.DISCONNECTED;
}
packet.setKickMessage(reason);
this.sendPacketImmediately(packet);
}
}
```
This allows an attacker that should have been disconnected to continue to send malicous packets that lead to expensive deserialization logic. The result is another potential denial of service (DoS) attack vector.
## Patch and Mitigation
We mitigated the first attack vector by ensuring that the Bedrock client can only signal completion of resource pack sending once per session. This was done by modifying the `UpstreamPacketHandler` to check if the `finishedResourcePackSending` flag is already set before proceeding with authentication logic:
```java
package org.geysermc.geyser.network;
// ...
public class UpstreamPacketHandler extends LoggingPacketHandler {
// ...
public PacketSignal handle(ResourcePackClientResponsePacket packet) {
// ...
// highlight-start
if (finishedResourcePackSending) {
session.disconnect("Illegal duplicate resource pack response packet received!");
return PacketSignal.HANDLED;
}
// highlight-end
// ...
switch (packet.getStatus()) {
case COMPLETED -> {
// highlight-start
finishedResourcePackSending = true;
// highlight-end
if (geyser.getConfig().getRemote().authType() != AuthType.ONLINE) {
session.authenticate(session.getAuthData().name());
} else if (!couldLoginUserByName(session.getAuthData().name())) {
// We must spawn the white world
session.connect();
}
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.connect", session.getAuthData().name()));
}
// ...
}
return PacketSignal.HANDLED;
}
// ...
}
```
This ensures that any further attempts to send a `ResourcePackClientResponsePacket` after the first one will result in an immediate disconnect, preventing the creation of multiple downstream sessions.
The second attack vector was mitigated by ensuring that the disconnect logic in the Bedrock protocol library properly closes the underlying Netty channel. This was achieved by modifying the `BedrockServerSession#disconnect` method to schedule a task that closes the session after a timeout, ensuring that the channel is closed after the disconnect packet is sent. Packet serialzation is also stopped immediately for disconnected clients:
```java
package org.cloudburstmc.protocol.bedrock;
// ...
public class BedrockServerSession extends BedrockSession {
private static final int TIMEOUT_SECONDS = SystemPropertyUtil.getInt("org.cloudburstmc.protocol.bedrock.disconnectTimeout", 10);
// ...
public void disconnect(@Nullable String reason, boolean hideReason) {
this.checkForClosed();
DisconnectPacket packet = new DisconnectPacket();
String finalReason;
if (reason == null || hideReason) {
packet.setMessageSkipped(true);
finalReason = BedrockDisconnectReasons.DISCONNECTED;
} else {
finalReason = reason;
}
packet.setKickMessage(finalReason);
this.sendPacketImmediately(packet);
// highlight-start
if (!this.isSubClient()) {
this.getPeer().blackholeInboundPackets();
}
this.getPeer().channel.eventLoop().schedule(() -> {
if (this.isConnected()) {
this.close(finalReason);
}
}, TIMEOUT_SECONDS, TimeUnit.SECONDS);
// highlight-end
}
}
```
Logic was also added to Geyser's `InvalidPacketHandler` to ensure that invalid packets result in an immediate closing of the underlying Netty channel:
```java
package org.geysermc.geyser.network;
// ...
public class InvalidPacketHandler extends ChannelInboundHandlerAdapter {
public static final String NAME = "rak-error-handler";
private final GeyserSession session;
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
Throwable rootCause = Stream.iterate(cause, Throwable::getCause)
.filter(element -> element.getCause() == null)
.findFirst()
.orElse(cause);
GeyserLogger logger = GeyserImpl.getInstance().getLogger();
if (!(rootCause instanceof IllegalArgumentException)) {
// Kick users that cause exceptions
logger.error("Exception caught in session of " + session.bedrockUsername(), cause);
session.disconnect("An internal error occurred!");
// highlight-start
session.forciblyCloseUpstream();
// highlight-end
return;
}
// Kick users that try to send illegal packets
logger.error("Illegal packet from " + session.bedrockUsername(), cause);
session.disconnect("Invalid packet received!");
// highlight-start
session.forciblyCloseUpstream();
// highlight-end
}
}
```
## Long Term Impact
All users of Geyser running outdated builds should update as soon as possible to ensure they are not vulnerable to the attacks described in this post. During the process of investigating this attack, we were made aware of multiple servers being exploited, meaning this is being exploited in the wild. Unlike the previous RakNet amplification attack, this attack is limited in scope to the selected Geyser instance. We expect the number of unpatched instances to decrease over time as Bedrock updates require server owners to update their Geyser instances. As of November 2025, we have not received any recent reports of Geyser instances being targeted by this attack vector, indicating that most instances have been patched.
## Acknowledgements
We thank the community for their patience as we addressed this issue, the server owners who responsibly disclosed this issue to us, the developers at Cloudburst and Geyser that worked to mitigate the issue, all donors for their financial support of Geyser, and Cubecraft and Open Collaboration for their continued financial and operational support of the project.
+153
View File
@@ -0,0 +1,153 @@
---
title: Preparing Your Geyser Server for NetherNet
slug: preparing-for-nethernet
authors: Chris
hide_table_of_contents: false
description: >-
Minecraft Bedrock Edition 26.60 fully switches over to a new networking layer,
NetherNet. This blog post explains how you can also switch over, so your
crossplay server will continue to work.
crowdin_page_id: 54c391d9-7dfb-4b06-a7a0-d20628cb2b18
---
With Minecraft: Bedrock Edition 26.60, [planned for October 27th, 2026](https://minecraft.wiki/w/Bedrock_Edition_26.60),
Bedrock clients will stop connecting over RakNet. From then on, every Bedrock server has to speak NetherNet, the new transport
Mojang has been rolling out since 26.40. Any Geyser build from 1237 onward supports NetherNet, but it is not enabled by default yet.
This post covers what changes with NetherNet, how to switch over on a hosting provider or on your own machine, and how to check that everything works.
## TL;DR
- **Update Geyser** by downloading the latest build from [https://geysermc.org/download](https://geysermc.org/download), and turn on NetherNet in your Geyser config.
- **Your server needs a TCP port** in addition to the usual UDP port, unless you use external signaling. See our [setup guide](/wiki/geyser/setup/) for detailed instructions!
- If your server is on a hosting provider for which we do not have an updated setup guide, contact their support. You can send them a link to this post.
- **`clone-remote-port` only works with external signaling.** If you use it, read [this section](#notes-for-hosting-provider-users-with-clone-remote-port-enabled) below.
- **Do it before October 27th.** After that date, Bedrock players can't join servers that haven't made the switch.
<!-- truncate -->
## What Changes
With RakNet, Bedrock players connected directly to the server over UDP. NetherNet adds a step before that, called signaling.
Bedrock clients now send the server a web request over TCP, asking how to connect. The signaling server then responds with
the server information needed to connect over WebRTC (which runs on UDP), finishing the join process.
The MOTD and player count shown in the server list are now also fetched through signaling. This allows Geyser's built-in
signaling server to receive the address initially pinged by the client, and forward it to the Java server for MOTD passthrough.
Players who connect through an IP address, or through a domain without HTTPS, will see a "trust on first use" prompt on their first join.
In practice, this means your Geyser instance now needs a TCP port for signaling, in addition to the UDP port for gameplay.
By default, Geyser uses port 19132 for both. As long as your address and port stay the same, your players can keep using the server entry they already have.
However, if Geyser previously ran on the same port as your Java server, as it does on many hosts, players will need to change the port in their saved server.
Geyser also supports using HTTPS to avoid the "trust on first use" prompt. See the [HTTPS section](#https-and-the-trust-prompt) for details.
## Enabling NetherNet
Start by downloading the latest build from [https://geysermc.org/download](https://geysermc.org/download).
Any build from 1237 onward supports NetherNet, but newer builds include a number of fixes, so we recommend always using the latest one.
RakNet is currently still Geyser's default, so NetherNet has to be turned on in the config. For this, take a look at our
[setup guide](/wiki/geyser/setup/): it shows the exact config changes needed. Also, check the server console for any errors or warnings!
If you need help with the migration, please join our [Discord](https://discord.gg/geysermc) and ask for help. Provide the following information:
- Where you host the server
- A Geyser dump (get it by running `/geyser dump` in the server console)
- A description of the issues you are seeing
## Using NetherNet and RakNet Together
If some of your players are still on versions older than 26.40, you can also set `transport` to `both`. Geyser then accepts NetherNet and RakNet side by side.
However, the two transport modes cannot run on the same UDP port, so in this mode you also need to set `webrtc-port` to a separate UDP port for
NetherNet and open it. Once 26.60 is out and everyone has updated, you can switch to `nethernet` and close the old RakNet port.
Note: 26.30 support will be removed once we add support for 26.60, so if you have players on old versions, ask them to update!
## HTTPS and the Trust Prompt
Built-in signaling uses plain HTTP by default. While this works, players see a "trust on first use" prompt the first time they join your server.
Serving signaling over HTTPS removes the prompt. We strongly recommend configuring HTTPS if you can!
There are two ways to enable HTTPS signaling. You can point Geyser to a TLS certificate in its built-in signaling config,
and it will serve HTTPS instead of HTTP on the same port. Alternatively, you can put a reverse proxy in front of the signaling
port and let it handle HTTPS. See our [HTTPS guide](/wiki/geyser/nethernet-https) for detailed information.
If neither option is available, you can use an external signaling service that provides HTTPS, such as [Warden](https://warden.cloud).
## Checking That It Works
After restarting, try joining from a Bedrock client on version 26.40 or newer. If the connection fails, the Geyser console is the first place to look,
since Geyser reports most NetherNet problems there. The table below covers the most common ones.
| What you see | Likely cause | What to do |
|-----------------------------------------------------------------------------------------|--------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|
| Console: "Built-in signaling cannot use port … because the Java server already uses it" | Bedrock and Java share a port, e.g. with `clone-remote-port` | Ask your host for a separate port, or keep using external signaling, which Geyser switches to automatically |
| Console: "RakNet and NetherNet each need their own UDP port" | `both` is set, but `webrtc-port` equals the Bedrock port | Set `webrtc-port` to a different available port |
| Console: "… is a loopback address" | The Bedrock `address` is set to 127.0.0.1 or similar | Set `address` to 0.0.0.0 |
| Players get a "trust on first use" prompt | Signaling runs over plain HTTP | Set up HTTPS, see above |
If none of these apply, please join our [Discord](https://discord.gg/geysermc) and share a `/geyser dump`, along with any other useful information about your setup.
## Notes For Hosting Provider Users With `clone-remote-port` Enabled
Many hosts have relied on `clone-remote-port`, which makes Geyser use the same port as the Java server. **This does not work with built-in signaling.**
Signaling needs a TCP port, and the Java server already uses TCP on that port, so the two cannot share it. If your server only works with `clone-remote-port`,
you have two options: ask your host for a separate port for Geyser that is open for both TCP and UDP, or use external signaling, which does not need a TCP port.
When Geyser detects that the Java server already uses its port, it falls back to external signaling through [Warden](https://warden.cloud),
a free service run by Ziax, the creators of CubeCraft, and the console shows where players can join.
If your host has no notes in our [setup guide](/wiki/geyser/setup/), pick "Not listed": it covers both options, including keeping a single port with `clone-remote-port` and Warden.
Keep in mind that with this setup, players no longer join with your Java server's address, but with the address and port Geyser shows in the console unless
a custom domain is registered on [Warden](https://warden.cloud). It also takes care of HTTPS for you, so users will not see a "trust on first use" prompt.
You may also notice that the "Supported hosting providers" list is gone from our website. Soon, it will be replaced with
a list of hosts that support our work through the Open Collaboration program, and work with us to automatically configure Geyser
for their users. This is also highlighted in the setup guide. However, a host's absence from that list will not mean Geyser
won't run there, and the setup guide will continue to include community-collected setup instructions.
## If You Run a Hosting Provider
If you offer Minecraft servers, we recommend automatically configuring Geyser for your users, so NetherNet works without
them touching the config. For this purpose, Geyser reads [system properties](/wiki/geyser/geyser-command-line-arguments-and-system-properties)
that can be set in the server's startup command, and take priority over the config.
The most important ones are:
- `-DgeyserTransport=nethernet` turns on NetherNet.
- `-DgeyserUdpPort` sets the Bedrock port. If you give each server its own port that is open for both TCP and UDP, built-in signaling works without further changes.
- `-DgeyserSignalingPort` and `-DgeyserWebrtcPort` split signaling (TCP) and gameplay (UDP) onto different ports, if your network hands them out separately.
- `-DgeyserSignalingMode=nxs` switches to external signaling, if you cannot give servers a TCP port. You can also run your own NXS-compatible signaling service.
- `-DgeyserAdvertiseAddresses` tells players which public address to connect to, if servers run in containers or behind a NAT and do not hold their public address themselves.
Once you have set this up, please let us know by [opening a pull request](https://github.com/GeyserMC/GeyserWebsite) or
reaching out on [Discord](https://discord.gg/geysermc), so our setup guide can tell your users that there is nothing for them to do.
In case you need further system properties, please reach out to us! If you would also like to support Geyser's
development and be featured on our upcoming hosting page, have a look at [Open Collaboration](https://opencollaboration.dev/).
## NetherNet External Signaling (NXS)
Geyser supports using external signaling providers which follow the NetherNet External Signaling (NXS) standard. It can be useful for
load-balancing between multiple Geyser instances, central certificate management, or avoiding running multiple built-in signaling servers,
amongst other benefits. See the [Open Collaboration blog post](https://opencollaboration.dev/articles/nethernet) to find out more about NXS.
Note that NXS does not support live forwarding of the MOTD and player count. Instead, they are updated periodically.
## HAProxy Support
HAProxy headers are currently supported for RakNet and for built-in signaling, but not yet for NetherNet gameplay over
WebRTC. This feature will be added soon.
## Further Reading
- [Geyser setup guide](/wiki/geyser/setup/): setup steps, including notes for individual hosts
- [HTTPS for NetherNet](/wiki/geyser/nethernet-https): removing the trust prompt with a certificate or a reverse proxy
- [NetherNet HTTP Signaling onboarding guide](https://mojang.github.io/bedrock-protocol-docs/guides/nether-net-onboarding-guide/): Mojang's official documentation
- [Open Collaboration blog post](https://opencollaboration.dev/articles/nethernet): detailed information about NetherNet and the
external signaling specification
- [System properties supported by Geyser](/wiki/geyser/geyser-command-line-arguments-and-system-properties): every NetherNet setting you can set at startup
## Acknowledgements
We thank Mojang for documenting NetherNet and signaling ahead of the switch, and Ziax for running Warden, a free external
signaling service open to every Geyser server. NetherNet support in Geyser would not have been possible without [Kas-tle](https://github.com/Kas-tle),
whose early NetherNet transport in [NetworkCompatible](https://github.com/Kas-tle/NetworkCompatible) and first NetherNet
support in [CloudburstMC/Network](https://github.com/CloudburstMC/Network) got this started, [rtm516](https://github.com/rtm516),
for HTTP signaling and the move to libdatachannel, and [irrld](https://github.com/irrld), for bringing NetherNet and NXS into Geyser.
Thank you as well to the community members who tested NetherNet support in Geyser and reported issues along the way.
We would also like to thank all donors, and [Open Collaboration](https://opencollaboration.dev/) and its members, for their continued support of the project.
+7 -1
View File
@@ -14,4 +14,10 @@ Kas-tle:
name: Kas-tle
title: Developer
url: https://github.com/Kas-tle
image_url: https://github.com/Kas-tle.png
image_url: https://github.com/Kas-tle.png
Chris:
name: onechris
title: Project Lead
url: https://github.com/onebeastchris
image_url: https://github.com/onebeastchris.png
+97 -8
View File
@@ -15,11 +15,44 @@ const config: Config = {
projectName: 'GeyserWebsite',
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',
i18n: {
defaultLocale: 'en',
locales: ['en'],
locales: ['en', 'ar','crp', 'cs', 'de', 'fr', 'it', 'ja', 'ru', 'tr', 'uk', 'zh-CN'],
localeConfigs: {
crp: {
label: 'Crowdin',
direction: 'ltr',
htmlLang: 'crp',
calendar: 'gregory',
path: 'crp',
}
}
},
markdown: {
mermaid: true,
hooks: {
onBrokenMarkdownLinks: 'warn'
},
...(process.env.DOCUSAURUS_CURRENT_LOCALE === 'crp' ? {
preprocessor: ({ fileContent }) => {
const lines = fileContent.split('\n');
for (let i = 0; i < lines.length; i++) {
if (lines[i].startsWith('#')) {
const lastOpenCurly = lines[i].lastIndexOf('{');
const lastCloseCurly = lines[i].lastIndexOf('}');
if (lastCloseCurly !== -1 && lastOpenCurly !== -1 && lastCloseCurly > lastOpenCurly) {
const curly = lines[i].substring(lastOpenCurly, lastCloseCurly + 1);
lines[i] = lines[i].replace(curly, '').replace('\\', '') + ' ' + curly;
}
}
}
return lines.join('\n');
}
} : {})
},
presets: [
@@ -80,9 +113,58 @@ const config: Config = {
],
'docusaurus-plugin-sass',
'./src/plugins/create-versions-json.ts',
'./src/plugins/create-providers-json.ts'
[
'./src/plugins/crowdin-sync.ts',
{
projectId: 11,
markdownFolders: [
{ path: 'wiki', destination: 'docusaurus-plugin-content-docs/current' },
{ path: 'blog', destination: 'docusaurus-plugin-content-blog' },
],
jsonKeyExclusions: [
'providers.provider.',
'sidebar.apiSidebar.',
'link.item.label.Geyser',
'link.item.label.Floodgate',
'link.item.label.Crowdin',
'link.item.label.Discord',
'link.item.label.GitHub',
'link.item.label.Reddit',
'link.item.label.Twitter',
'title',
'item.label.Geyser',
'item.label.Floodgate'
]
}
],
'./src/plugins/output-locales.ts',
'./src/plugins/modify-webpack.ts',
],
themes: ["docusaurus-theme-openapi-docs"],
themes: ["docusaurus-theme-openapi-docs", "@docusaurus/theme-mermaid"],
headTags: process.env.DOCUSAURUS_CURRENT_LOCALE === 'crp' ? [
{
tagName: 'script',
attributes: {
type: 'text/javascript',
},
innerHTML: `
var _jipt = [];
_jipt.push(['project', '88ac5ea17501f26d48048e17e149fee3']);
_jipt.push(['domain', 'geysermc']);
_jipt.push(['before_dom_insert', function(text, node, attribute) {
return text.replace(/.?\{#[^}]+\}/g, '');
}]);
`
},
{
tagName: 'script',
attributes: {
type: 'text/javascript',
src: '//cdn.crowdin.com/jipt/jipt.js'
}
}
] : [],
themeConfig: {
image: 'img/site/geyser.png',
@@ -147,6 +229,13 @@ const config: Config = {
position: 'left',
className: 'header-download-link'
},
// TODO: hidden until the hosting page launches
// {
// to: 'hosting',
// label: 'Hosting',
// position: 'left',
// className: 'header-hosting-link'
// },
{ // Name on mobile sidebar specified in custom.scss
href: 'https://github.com/GeyserMC/Geyser',
position: 'right',
@@ -157,10 +246,10 @@ const config: Config = {
position: 'right',
className: 'header-discord-link'
},
// {
// type: 'localeDropdown',
// position: 'right',
// },
{
type: 'localeDropdown',
position: 'right',
},
],
},
footer: {
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "Setup",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "Common Issues",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "Configuring Geyser",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "FAQ",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,83 @@
---
title: Commands and Permissions
description: Commands and their associated permission nodes for Geyser.
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# Commands and Permissions
Geyser features many built-in commands that can be used by players or server owners.
:::info
When using BungeeCord and Velocity, you will need to use a permission plugin such as [LuckPerms](https://luckperms.net/)
on the proxy server to assign permissions to players. Assigning permissions on the backend servers will not work.
:::
## Geyser commands & their permissions {#geyser-commands--their-permissions}
| Command | Permission | Description |
| :-----------------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| `geyser` <br/> Geyser root command | `geyser.command` | The permission required to see/run any Geyser commands. |
| `geyser help` <br/> `geyser ?` | `geyser.command.help` | Shows help for all registered commands. |
| `geyser advancements` | `geyser.command.advancements` | Open the Java advancements menu. |
| `geyser dump` | `geyser.command.dump` | Dumps Geyser debug information for bug reports. |
| `geyser list` | `geyser.command.list` | List all players connected through Geyser. |
| `geyser nethernet` | `geyser.command.nethernet` | Shows NetherNet signaling status and diagnostics, for use with external signaling. |
| `geyser offhand` | `geyser.command.offhand` | Puts an item in your offhand. |
| `geyser reload` | `geyser.command.reload` | Reloads the Geyser configurations. Kicks all players when used! |
| `geyser settings` | `geyser.command.settings` | Opens a settings menu allowing you to modify aspects of the world. |
| `geyser shutdown` <br/> `geyser stop` | `geyser.command.shutdown` | Shuts down Geyser.<br/>*This command only works on Standalone.* |
| `geyser statistics` | `geyser.command.statistics` | Open the Java statistics menu. |
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
## Permissions for Geyser extensions {#extension-permissions}
For the following, `<id>` refers to the extensions' id.
| Command | Permission | Description |
| :------------------------- | :---------------------------- | :------------------------------------------------------------------------ |
| `<id> help` <br/> `<id> ?` | `geyser.command.exthelp.<id>` | Shows help for all commands registered by this extension. |
## Other Permissions {#other-permissions}
Besides commands, there are other permissions that are used to guard specific Geyser features.
| Permission | Description |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | Allow players to use the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.settings.gamerules` | Defines whether a user can alter gamerules in the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.update` | Whether this player will receive Geyser update notifications upon joining. |
## Permissions when using Geyser-Standalone/Geyser-ViaProxy {#standalone-viaproxy-permissions}
Geyser-ViaProxy and Geyser-Standalone feature their own basic permission handler. To edit base permissions,
open the `permissions.yml` file and add or remove permissions that Geyser players should receive when joining.
See the file for more information.
You can further customize permission handling by creating a [Geyser extension](/wiki/geyser/extensions/) that makes use of Geysers API
to deal with permission checking.
## Permissions when using Geyser on platforms without permission handlers {#permissions-platforms-no-permission-handlers}
The following affects Geyser-BungeeCord, Geyser-Velocity, and Geyser-Fabric.
These platforms unfortunately do not have built-in permission handlers. Because of that, you will need to grant permissions on those platforms
manually using permission handlers, such as [LuckPerms](https://luckperms.net/). Geyser's permission are listed above. For extension permissions, consult their documentation.
Alternatively, you can use [LuckLink](https://github.com/onebeastchris/LuckLink), a third-party Geyser extension, to automatically register permissions using [LuckPerms](https://luckperms.net/).
- Install [LuckPerms](https://luckperms.net/) on the platform where you've installed Geyser (BungeeCord/Velocity/Fabric).
- To allow Geyser to automatically register permission defaults, install the [LuckLink](https://github.com/onebeastchris/LuckLink) Geyser extension
by downloading the `LuckLink.jar` and adding it to Geyser's `extensions` folder.
- Restart the server, and permissions should be automatically registered.
## Floodgate commands and permissions {#floodgate-commands-and-permissions}
For Floodgate commands, see [here](/wiki/floodgate/commands/).
@@ -0,0 +1,62 @@
---
title: playit.gg Setup
description: How to set up playit.gg to use Geyser without port forwarding.
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## Prerequisites {#prerequisites}
:::info
You must be able to connect to your Geyser instance locally!
:::
:::warning
The playit.gg Minecraft server plugin does not support UDP tunnels. You will need to use the program agent instead!
:::
:::caution
This guide was written for RakNet, and does not cover NetherNet. For NetherNet, see [playit.gg's progress on NetherNet support](https://status.playit.gg/3/adding-nethernet-support).
:::
## Setup {#setup}
1. Head over to [playit.gg's website](https://playit.gg/) - download the program & run it.
2. The program will provide a claiming link. Visit that link, log in.
![img](/img/wiki/playit-gg/playit_claim.png)
3. Confirm your agent.
![img](/img/wiki/playit-gg/playit_claim_confirm.png)
4. Add the agent.
![img](/img/wiki/playit-gg/playit_add_agent.png)
5. After the agent is created, create a tunnel.
![img](/img/wiki/playit-gg/playit_add_tunnel.png)
6. Name your tunnel and click Next.
![img](/img/wiki/playit-gg/playit_name_tunnel.png)
7. Select "Minecraft Bedrock" as the tunnel type and click Next.
![img](/img/wiki/playit-gg/playit_tunnel_type.png)
8. Select the Free Network and click Next.
![img](/img/wiki/playit-gg/playit_select_network.png)
**Do not change your Geyser port in `config.yml` unless you have a reason (for example, hosting another Geyser server on the same machine).** The Bedrock (Geyser) port in `config.yml` and the playit.gg ports are separate. playit.gg will forward its port to the default Geyser port and should work as-is. Changing it can cause errors. If you have changed your config port, set the Bedrock port back to the default `19132` and ensure `clone-remote-port` is `false`.
9. If the playit.gg agent and Geyser are running on the same device, leave the IP as `127.0.0.1` and set the port to whatever you configured in Geyser's config.
![img](/img/wiki/playit-gg/playit_set_ipandport.png)
10. Select `proxy-protocol-v2` for the Proxy Protocol section and click Next.
11. In the Geyser config, under `advanced:` `bedrock:`, set `use-haproxy-protocol` to `true`.
12. Click Create Tunnel and wait for the tunnel to be created.
![img](/img/wiki/playit-gg/playit_create_tunnel.png)
13. Copy your tunnel's port. For example, if your tunnel address is `visiting-phone.gl.at.ply.gg:6695`, then `6695` is the tunnel port.
14. In the Geyser config under `advanced:` `bedrock:`, set `broadcast-port` to your tunnel port (`6695` in the example).
15. Save your config. Start your Minecraft server and connect using your tunnel's IP and port.
16. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
## Troubleshooting {#troubleshooting}
### I can't connect to my server! {#i-cant-connect-to-my-server}
- *Try going to the Agents page, set your agent to IPv4 only, and change the region. You may need to switch regions a few times before you can connect.*
- *Are there errors in your minecraft server console?*
- *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
- *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 8.*
- *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
- *Make sure that you have the program agent open while trying to join.*
- *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
@@ -0,0 +1,208 @@
---
title: Port forwarding
description: Information on how to set up port forwarding required for Geyser.
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# Port forwarding {#port-forwarding}
This page contains information on how to set up port forwarding required for Geyser to work when self-hosting.
There are also guides for specific configurations, such as Docker/Pterodactyl, or on specific VPS/KVM providers, such as OVH or Oracle Cloud.
:::caution
If you are using a Minecraft server hosting provider (e.g. Aternos, or Nodecraft), you should refer to the hosting provider setup on the [setup](/wiki/geyser/setup) page instead.
:::
:::info Ports that need to be opened
With NetherNet, the Geyser port (by default 19132) has to be open for **both TCP and UDP**: players find the server over TCP (signaling), and play on it over UDP.
If you use the "NetherNet and RakNet" option, also open the `webrtc-port` for UDP.
With external signaling, such as [Warden](https://warden.cloud), only UDP for WebRTC is needed.
:::
## Port forwarding on Linux/Windows/macOS {#port-forwarding-on-linuxwindowsmacos}
To allow others to play on your server, you will need to set up port forwarding on the device hosting Geyser.
Additionally, you will need to port forward the port on your router/modem (in other words, allow and route traffic on that port to the proper machine) if you want the server to be accessible outside your own home network.
Forward it for both TCP and UDP; many routers offer a "TCP/UDP" or "Both" option for this.
See [here](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/) or [here](https://www.lifewire.com/how-to-port-forward-4163829) for helpful guides.
Do note: if you do not have a static IP address, your IP address may change over time.
:::info
Some ISPs (Internet Service Providers) block certain ports, or don't allow you to open ports (e.g. by using CGNAT, which doesn't allow you to open a port with a dynamic IP).
Other ISPs may require you to pay extra for a static IP address.
As an alternative to port forwarding, you can use [playit.gg](/wiki/geyser/playit-gg/) to create a tunnel.
:::
### Windows {#windows}
To open a port on Windows, you will need to open the port through the Windows Firewall. There are multiple ways to do this:
- `Powershell` (recommended)
To open a port on TCP and UDP (in our example, port 19132), run the following commands in an administrator Powershell:
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
Running these commands creates two rules that allow TCP and UDP traffic on port 19132.
- Windows Defender Firewall with Advanced Security (GUI)
1. Search for "Windows Defender Firewall with Advanced Security" in the start menu, and open it. ([Image](/img/wiki/port-forwarding/windows-1.png))
2. Click on "Inbound Rules" in the left sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
3. Click on "New Rule..." in the right sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
4. Select "Port" as the rule type and click "Next". ([Example](/img/wiki/port-forwarding/windows-3.png))
5. Select "UDP" and "Specific local ports", and enter the port you want to open (in our example, 19132). Click "Next". ([Example](/img/wiki/port-forwarding/windows-4.png))
6. Select "Allow the connection" and click "Next". ([Example](/img/wiki/port-forwarding/windows-5.png))
7. Select the profiles you want to apply the rule to (e.g. "Domain", "Private", "Public"), and click "Next". ([Example](/img/wiki/port-forwarding/windows-6.png))
8. Enter a name for the rule (e.g. "Geyser (UDP)"), and click "Finish". ([Image](/img/wiki/port-forwarding/windows-7.png))
9. Repeat these steps, selecting "TCP" in step 5 and naming the rule e.g. "Geyser (TCP)".
### Linux {#linux}
Different Linux distributions, even different VPS providers ship and configure different firewalls. In the following examples, we will use `19132` as the port to open, but you should replace this with the port you are using for Geyser.
- `ufw` is a simple firewall front-end for iptables that is commonly used on Ubuntu and Debian. To open a port on TCP and UDP, run the following commands:
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
Then, reload the firewall with `sudo ufw reload`, and see all open rules with `sudo ufw status`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server), [Baeldung](https://www.baeldung.com/linux/uncomplicated-firewall)
- `firewalld` Add a port on TCP and UDP by running:
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
Then, reload the firewall with `sudo firewall-cmd --reload`, and see all open rules with `sudo firewall-cmd --list-all`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)
- `iptables` is a common firewall that is used on many Linux distributions. To open a port on TCP and UDP, run the following commands:
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
Then, save the firewall with `sudo iptables-save`, and see all open rules with `sudo iptables -L`.
Further helpful guides for iptables: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04), [Ubuntu](https://help.ubuntu.com/community/IptablesHowTo)
### macOS {#macos}
You will need to disable `Block all incoming connections` in your Firewall settings, as that will block any connections and won't allow you to make exceptions.
To allow incoming connections, click `Allow` when getting [these prompts](/img/wiki/port-forwarding/macos_warning.png).
If you are still facing issues, see Apple's official guide [here](https://support.apple.com/guide/mac-help/MH11783) to open a port on macOS.
## Using Docker or Pterodactyl {#using-docker-or-pterodactyl}
In addition to port forwarding the port in your server's firewall (and, if applicable, your router/modem), you will need to assign the port in Docker/Pterodactyl.
### Pterodactyl {#pterodactyl}
Make sure to allocate the port(s) to the server in the Pterodactyl panel's `Network` tab, additionally to port forwarding the port(s).
See [here](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel) for more information.
![Pterodactyl panel, Network section](/img/wiki/port-forwarding/pterodactyl-1.png)
There are also different Geyser eggs for Pterodactyl, which can be found [here](https://github.com/GeyserMC/pterodactyl-stuff).
:::caution
If you are not able to allocate ports in the Pterodactyl panel, you will need to contact your server host to allocate one for you or try to use an existing port allocation.
:::
### Docker {#docker}
For Geyser to work under Docker (e.g. using [Itzg's Docker image](https://github.com/itzg/docker-minecraft-server)), you will need to add the Geyser port on TCP and UDP to the docker-compose file. This is done by adding the following to the `ports` section:
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
Without a suffix, Docker exposes the port on TCP. The additional `/udp` suffix exposes it on UDP.
Alternatively, add the ports with the `-p 19132:19132 -p 19132:19132/udp` flags to the docker run command.
## Issues with specific VPS/KVM providers {#issues-with-specific-vpskvm-providers}
Some providers, such as OVH, Oracle Cloud, and SoYouStart, have a firewall that blocks the ports Geyser needs by default/in most cases.
### OVH and SoYouStart {#ovh-and-soyoustart}
OVH's GAME firewall filters traffic with rules made for specific games. The Minecraft Bedrock and Minecraft Pocket Edition rules currently only support RakNet, the protocol Bedrock used before NetherNet.
With NetherNet, players find the server over HTTP (TCP) and play over WebRTC (UDP), which these rules currently do not support.
For now, use the `Other` rule for the Geyser port(s) instead.
:::caution
If you do not have access to these firewall settings, but got linked to this page, please contact your server host and provide them with this link - they are likely using OVH internally.
:::
**To resolve it:**
OVH:
1. Navigate to `Network interfaces`
2. Click on the `...` button on the table for your IP -> then `...` and `Configure the GAME firewall` -> `Add rule` -> `Other protocol`
3. Add your Geyser port into `outgoing port`. If you use the "NetherNet and RakNet" option, add a rule for the `webrtc-port` as well.
4. If you use OVH's Edge Network Firewall, make sure it allows the Geyser port over both TCP and UDP.
SoYouStart (subsidiary of OVH):
1. Click the IP tab.
2. Click the gear at the right of the public IP address; select "Game mitigation".
3. Pick "Add a rule".
4. Select "Other" in the dropdown list and enter the Geyser port. If you use the "NetherNet and RakNet" option, add the `webrtc-port` as well.
5. Save and wait a few seconds for the changes to come into effect.
### Oracle Cloud/OCI {#oracle-cloudoci}
By default, Oracle Cloud will block all incoming traffic except for SSH and RDP. This must be resolved within Oracle Cloud itself and the Compute Instance running Geyser.
The steps below assume that you are using the default ports for the Java server and Geyser, and should be adjusted accordingly.
1. Find your Compute Instance in the OCI Console
2. Click on the instances Virtual Cloud Network (this will be under "Instance details")
3. On the left-hand side, select "Security Lists"
4. Select one of the security lists. By default only one security list will exist. It doesn't matter which security list we add the rules to.
5. Select "Add Ingress Rules"
6. Configure rules for Java (optional)
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `25565-25565`
- Select "Another Ingress Rule"
7. Configure rules for Geyser, once for TCP and once for UDP
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `19132-19132`
- Set "IP Protocol" to TCP
- Select "Another Ingress Rule", and repeat with "IP Protocol" set to UDP
8. Select "Add Ingress Rules"
#### Oracle Linux {#oracle-linux}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### Ubuntu {#ubuntu}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,47 @@
---
title: Supported versions
description: Information on the versions Geyser supports.
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# Currently supported versions \ {#currently-supported-versions}
:::info
**Geyser currently supports Minecraft Bedrock <Versions.bedrock /> and Minecraft Java <Versions.java />**.
:::
## Using Geyser with older Minecraft: Bedrock edition versions \ {#using-geyser-with-older-minecraft-bedrock-edition-versions}
Older Bedrock versions are not supported. Minecraft: Bedrock Edition updates automatically on all platforms, so there are few users who would
want to use older versions. Further, older Bedrock versions do not have all features which Geyser support, which would lead to a sub-par experience.
## Using Geyser on older Minecraft: Java edition servers \ {#using-geyser-on-older-minecraft-java-edition-servers}
Geyser emulates a <Versions.java /> client, so a Java server must accept users using that version in order for Geyser to work.
This is possible thanks to [ViaVersion](https://viaversion.com/viaversion), which allows Java edition players with newer versions to join servers
that run older versions of the game.
### Using Geyser-Spigot on a Spigot/Paper server running on 1.20.5 or above
You can use Geyser-Spigot on servers that run on 1.20.5 or above. You will also need to run at least Java 21 or later to use Geyser. See [here](https://docs.papermc.io/misc/java-install) for more info on updating Java. Paper versions not supporting Java 21 can add `-DPaper.IgnoreJavaVersion=true` flag to the Java startup arguments to allow Paper to run on Java 21.
In order for Bedrock players to chat (1.19.3+) or join (1.19.1/1.19.2), you need to disable chat signing. More information about that can be read on the [chat signing page](/wiki/geyser/secure-chat).
### Using Geyser-Spigot on a Spigot/Paper server running on a version below 1.20.5
This is unfortunately not possible. You'll need to use a proxy such as Velocity or BungeeCord, or set up Geyser-Standalone separately with the [ViaVersion](https://viaversion.com/viaversion) plugin. Another alternative would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it.
### Using Geyser on Fabric/NeoForge servers not on the latest Minecraft version \ {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
Unfortunately, Geyser-Fabric and Geyser-NeoForge only support the latest version of Minecraft: Java edition. The recommended way to still use
Geyser with older versions would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it. This will also work with Floodgate auth.
### Using Geyser-Velocity or Geyser-BungeeCord on a proxy
Make sure you update your proxy software to the latest available version, and, if the backend servers are not on <Versions.java />, also install the [ViaVersion](https://viaversion.com/viaversion) plugin on the backend servers. Velocity/BungeeCord support most Minecraft versions, so you can update them regardless of the backend server versions.
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "Wiki",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "Downloads",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "REST APIs",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "Other",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "Blog",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "Donate",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "Global Linking",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "Privacy Policy",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "Copyright © 2026 GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "Wiki",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "Blog",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "Utilities",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "Download",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "REST APIs",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "Other",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "crwdns34774:0crwdne34774:0",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "crwdns34776:0crwdne34776:0",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "crwdns34778:0crwdne34778:0",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "crwdns34780:0crwdne34780:0",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "crwdns34782:0crwdne34782:0",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "crwdns34784:0crwdne34784:0",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "crwdns34786:0crwdne34786:0",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "crwdns34788:0crwdne34788:0",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "crwdns34790:0crwdne34790:0",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "crwdns34792:0crwdne34792:0",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,78 @@
---
title: crwdns33550:0crwdne33550:0
description: crwdns33552:0crwdne33552:0
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# crwdns33554:0crwdne33554:0
crwdns33556:0crwdne33556:0
:::info
crwdns33558:0[crwdnd33558:0](https://luckperms.net/)crwdne33558:0 crwdns33560:0crwdne33560:0
:::
## crwdns33562:0{#geyser-commands--their-permissions}crwdne33562:0
| crwdns33564:0crwdne33564:0 | crwdns33566:0crwdne33566:0 | crwdns33568:0crwdne33568:0 |
| :-------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------: |
| crwdns33570:0`geyser`crwdne33570:0 | `geyser.command` | crwdns33574:0crwdne33574:0 |
| crwdns33576:0`geyser help`crwdnd33576:0`geyser ?`crwdne33576:0 | `geyser.command.help` | crwdns33580:0crwdne33580:0 |
| `geyser advancements` | `geyser.command.advancements` | crwdns33586:0crwdne33586:0 |
| `geyser dump` | `geyser.command.dump` | crwdns33592:0crwdne33592:0 |
| `geyser list` | `geyser.command.list` | crwdns33598:0crwdne33598:0 |
| `geyser nethernet` | `geyser.command.nethernet` | crwdns34840:0crwdne34840:0 |
| `geyser offhand` | `geyser.command.offhand` | crwdns33604:0crwdne33604:0 |
| `geyser reload` | `geyser.command.reload` | crwdns33610:0crwdne33610:0 crwdns33612:0crwdne33612:0 |
| `geyser settings` | `geyser.command.settings` | crwdns33618:0crwdne33618:0 |
| crwdns33620:0`geyser shutdown`crwdnd33620:0`geyser stop`crwdne33620:0 | `geyser.command.shutdown` | crwdns33624:0crwdne33624:0crwdns33626:0crwdne33626:0 |
| `geyser statistics` | `geyser.command.statistics` | crwdns33632:0crwdne33632:0 |
| `geyser version` | `geyser.command.version` | crwdns33638:0crwdne33638:0 |
| `geyser tooltips` | `geyser.command.tooltips` | crwdns33644:0crwdne33644:0 |
| `geyser extensions` | `geyser.command.extensions` | crwdns33650:0crwdne33650:0 crwdns33652:0crwdne33652:0 |
| `geyser ping` | `geyser.command.ping` | crwdns33658:0crwdne33658:0 |
| `geyser options` | `geyser.command.options` | crwdns33664:0crwdne33664:0 |
| `geyser quickactions` | `geyser.command.quickactions` | crwdns33670:0crwdne33670:0 |
## crwdns33672:0{#extension-permissions}crwdne33672:0
crwdns33674:0`<id>`crwdne33674:0
| crwdns33676:0crwdne33676:0 | crwdns33678:0crwdne33678:0 | crwdns33680:0crwdne33680:0 |
| :--------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------- |
| crwdns33682:0`<id> help`crwdnd33682:0`<id> ?`crwdne33682:0 | crwdns33684:0crwdne33684:0crwdns33686:0crwdne33686:0 | crwdns33688:0crwdne33688:0 |
## crwdns33690:0{#other-permissions}crwdne33690:0
crwdns33692:0crwdne33692:0
| crwdns33694:0crwdne33694:0 | crwdns33696:0crwdne33696:0 |
| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | crwdns33700:0[crwdnd33700:0](/img/wiki/game_menu.png)crwdne33700:0 crwdns33702:0crwdne33702:0 |
| `geyser.settings.gamerules` | crwdns33706:0[crwdnd33706:0](/img/wiki/game_menu.png)crwdne33706:0 crwdns34842:0crwdne34842:0 |
| `geyser.update` | crwdns33712:0crwdne33712:0 |
## crwdns33714:0{#standalone-viaproxy-permissions}crwdne33714:0
crwdns33716:0crwdne33716:0 crwdns33718:0`permissions.yml`crwdne33718:0
crwdns33720:0crwdne33720:0
crwdns33722:0[crwdnd33722:0](/wiki/geyser/extensions/)crwdne33722:0
## crwdns33724:0{#permissions-platforms-no-permission-handlers}crwdne33724:0
crwdns33726:0crwdne33726:0
crwdns33728:0crwdne33728:0 crwdns33730:0[crwdnd33730:0](https://luckperms.net/)crwdne33730:0 crwdns33732:0crwdne33732:0 crwdns33734:0crwdne33734:0
crwdns33736:0[crwdnd33736:0](https://github.com/onebeastchris/LuckLink)crwdnd33736:0[crwdnd33736:0](https://luckperms.net/)crwdne33736:0
- crwdns33738:0[crwdnd33738:0](https://luckperms.net/)crwdne33738:0
- crwdns33740:0[crwdnd33740:0](https://github.com/onebeastchris/LuckLink)crwdnd33740:0`LuckLink.jar`crwdnd33740:0`extensions`crwdne33740:0
- crwdns33742:0crwdne33742:0
## crwdns33744:0{#floodgate-commands-and-permissions}crwdne33744:0
crwdns33746:0[crwdnd33746:0](/wiki/floodgate/commands/)crwdne33746:0
@@ -0,0 +1,61 @@
---
title: crwdns33748:0crwdne33748:0
description: crwdns33750:0crwdne33750:0
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## crwdns33752:0{#prerequisites}crwdne33752:0
:::info
crwdns33754:0crwdne33754:0
:::
:::warning
crwdns33756:0crwdne33756:0 crwdns33758:0crwdne33758:0
:::
:::caution
crwdns33760:0crwdne33760:0 crwdns33762:0[crwdnd33762:0](https://status.playit.gg/3/adding-nethernet-support)crwdne33762:0
:::
## crwdns33764:0{#setup}crwdne33764:0
1. crwdns33766:0[crwdnd33766:0](https://playit.gg/)crwdne33766:0
2. crwdns33768:0crwdne33768:0 crwdns33770:0crwdne33770:0
crwdns33772:0![crwdnd33772:0](/img/wiki/playit-gg/playit_claim.png)crwdne33772:0
3. crwdns33774:0crwdne33774:0
crwdns33776:0![crwdnd33776:0](/img/wiki/playit-gg/playit_claim_confirm.png)crwdne33776:0
4. crwdns33778:0crwdne33778:0
crwdns33780:0![crwdnd33780:0](/img/wiki/playit-gg/playit_add_agent.png)crwdne33780:0
5. crwdns33782:0crwdne33782:0
crwdns33784:0![crwdnd33784:0](/img/wiki/playit-gg/playit_add_tunnel.png)crwdne33784:0
6. crwdns33786:0crwdne33786:0
crwdns33788:0![crwdnd33788:0](/img/wiki/playit-gg/playit_name_tunnel.png)crwdne33788:0
7. crwdns33790:0crwdne33790:0
crwdns33792:0![crwdnd33792:0](/img/wiki/playit-gg/playit_tunnel_type.png)crwdne33792:0
8. crwdns33794:0crwdne33794:0
crwdns33796:0![crwdnd33796:0](/img/wiki/playit-gg/playit_select_network.png)crwdnd33796:0`config.yml`crwdnd33796:0`config.yml`crwdne33796:0 crwdns33798:0crwdne33798:0 crwdns33800:0crwdne33800:0 crwdns33802:0`19132`crwdnd33802:0`clone-remote-port`crwdnd33802:0`false`crwdne33802:0
9. crwdns33804:0`127.0.0.1`crwdne33804:0
crwdns33806:0![crwdnd33806:0](/img/wiki/playit-gg/playit_set_ipandport.png)crwdne33806:0
10. crwdns33808:0`proxy-protocol-v2`crwdne33808:0
11. crwdns33810:0`advanced:`crwdnd33810:0`bedrock:`crwdnd33810:0`use-haproxy-protocol`crwdnd33810:0`true`crwdne33810:0
12. crwdns33812:0crwdne33812:0
crwdns33814:0![crwdnd33814:0](/img/wiki/playit-gg/playit_create_tunnel.png)crwdne33814:0
13. crwdns33816:0crwdne33816:0 crwdns33818:0`visiting-phone.gl.at.ply.gg:6695`crwdnd33818:0`6695`crwdne33818:0
14. crwdns33820:0`advanced:`crwdnd33820:0`bedrock:`crwdnd33820:0`broadcast-port`crwdnd33820:0`6695`crwdne33820:0
15. crwdns33822:0crwdne33822:0 crwdns33824:0crwdne33824:0
16. crwdns33826:0crwdne33826:0 crwdns33828:0crwdne33828:0 crwdns33830:0crwdne33830:0
crwdns33832:0[crwdnd33832:0](#troubleshooting)crwdne33832:0
## crwdns33834:0{#troubleshooting}crwdne33834:0
### crwdns33836:0crwdne33836:0 crwdns33838:0{#i-cant-connect-to-my-server}crwdne33838:0
- crwdns33840:0crwdne33840:0 crwdns33842:0crwdne33842:0
- crwdns33844:0crwdne33844:0
- crwdns33846:0`19132`crwdnd33846:0`clone-remote-port`crwdnd33846:0`false`crwdne33846:0
- crwdns33848:0`bedrock-port`crwdnd33848:0`clone-remote-port`crwdnd33848:0`true`crwdne33848:0 crwdns33850:0crwdne33850:0
- crwdns33852:0crwdne33852:0
- crwdns33854:0crwdne33854:0
- crwdns33856:0[crwdnd33856:0](/wiki/geyser/fixing-unable-to-connect-to-world/)crwdne33856:0
@@ -0,0 +1,208 @@
---
title: crwdns33858:0crwdne33858:0
description: crwdns33860:0crwdne33860:0
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# crwdns33862:0{#port-forwarding}crwdne33862:0
crwdns33864:0crwdne33864:0
crwdns33866:0crwdne33866:0
:::caution
crwdns33868:0[crwdnd33868:0](/wiki/geyser/setup)crwdne33868:0
:::
:::info crwdns33870:0crwdne33870:0
crwdns33872:0crwdne33872:0
crwdns33874:0`webrtc-port`crwdne33874:0
crwdns33876:0[crwdnd33876:0](https://warden.cloud)crwdne33876:0
:::
## crwdns33878:0{#port-forwarding-on-linuxwindowsmacos}crwdne33878:0
crwdns33880:0crwdne33880:0
crwdns33882:0crwdne33882:0
crwdns33884:0crwdne33884:0
crwdns33886:0[crwdnd33886:0](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/)crwdnd33886:0[crwdnd33886:0](https://www.lifewire.com/how-to-port-forward-4163829)crwdne33886:0
crwdns33888:0crwdne33888:0
:::info
crwdns33890:0crwdne33890:0
crwdns33892:0crwdne33892:0
crwdns33894:0[crwdnd33894:0](/wiki/geyser/playit-gg/)crwdne33894:0
:::
### crwdns33896:0{#windows}crwdne33896:0
crwdns33898:0crwdne33898:0 crwdns33900:0crwdne33900:0
- crwdns33902:0`Powershell`crwdne33902:0
crwdns33904:0crwdne33904:0
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
crwdns33906:0crwdne33906:0
- crwdns33908:0crwdne33908:0
1. crwdns33910:0crwdne33910:0 crwdns33912:0[crwdnd33912:0](/img/wiki/port-forwarding/windows-1.png)crwdne33912:0
2. crwdns33914:0crwdne33914:0 crwdns33916:0[crwdnd33916:0](/img/wiki/port-forwarding/windows-2.png)crwdne33916:0
3. crwdns33918:0crwdne33918:0 crwdns33920:0[crwdnd33920:0](/img/wiki/port-forwarding/windows-2.png)crwdne33920:0
4. crwdns33922:0crwdne33922:0 crwdns33924:0[crwdnd33924:0](/img/wiki/port-forwarding/windows-3.png)crwdne33924:0
5. crwdns33926:0crwdne33926:0 crwdns33928:0crwdne33928:0 crwdns33930:0[crwdnd33930:0](/img/wiki/port-forwarding/windows-4.png)crwdne33930:0
6. crwdns33932:0crwdne33932:0 crwdns33934:0[crwdnd33934:0](/img/wiki/port-forwarding/windows-5.png)crwdne33934:0
7. crwdns33936:0crwdne33936:0 crwdns33938:0[crwdnd33938:0](/img/wiki/port-forwarding/windows-6.png)crwdne33938:0
8. crwdns33940:0crwdne33940:0 crwdns33942:0[crwdnd33942:0](/img/wiki/port-forwarding/windows-7.png)crwdne33942:0
9. crwdns33944:0crwdne33944:0
### crwdns33946:0{#linux}crwdne33946:0
crwdns33948:0crwdne33948:0 crwdns33950:0`19132`crwdne33950:0
- crwdns33952:0`ufw`crwdne33952:0 crwdns33954:0crwdne33954:0
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
crwdns33956:0`sudo ufw reload`crwdnd33956:0`sudo ufw status`crwdne33956:0
crwdns33958:0[crwdnd33958:0](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server)crwdnd33958:0[crwdnd33958:0](https://www.baeldung.com/linux/uncomplicated-firewall)crwdne33958:0
- crwdns33960:0`firewalld`crwdne33960:0
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
crwdns33962:0`sudo firewall-cmd --reload`crwdnd33962:0`sudo firewall-cmd --list-all`crwdne33962:0
crwdns33964:0[crwdnd33964:0](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)crwdne33964:0
- crwdns33966:0`iptables`crwdne33966:0 crwdns33968:0crwdne33968:0
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
crwdns33970:0`sudo iptables-save`crwdnd33970:0`sudo iptables -L`crwdne33970:0
crwdns33972:0[crwdnd33972:0](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04)crwdnd33972:0[crwdnd33972:0](https://help.ubuntu.com/community/IptablesHowTo)crwdne33972:0
### crwdns33974:0{#macos}crwdne33974:0
crwdns33976:0`Block all incoming connections`crwdne33976:0
crwdns33978:0`Allow`crwdnd33978:0[crwdnd33978:0](/img/wiki/port-forwarding/macos_warning.png)crwdne33978:0
crwdns33980:0[crwdnd33980:0](https://support.apple.com/guide/mac-help/MH11783)crwdne33980:0
## crwdns33982:0{#using-docker-or-pterodactyl}crwdne33982:0
crwdns33984:0crwdne33984:0
### crwdns33986:0{#pterodactyl}crwdne33986:0
crwdns33988:0`Network`crwdne33988:0
crwdns33990:0[crwdnd33990:0](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel)crwdne33990:0
crwdns33992:0![crwdnd33992:0](/img/wiki/port-forwarding/pterodactyl-1.png)crwdne33992:0
crwdns33994:0[crwdnd33994:0](https://github.com/GeyserMC/pterodactyl-stuff)crwdne33994:0
:::caution
crwdns33996:0crwdne33996:0
:::
### crwdns33998:0{#docker}crwdne33998:0
crwdns34000:0[crwdnd34000:0](https://github.com/itzg/docker-minecraft-server)crwdne34000:0 crwdns34002:0`ports`crwdne34002:0
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
crwdns34004:0crwdne34004:0 crwdns34006:0`/udp`crwdne34006:0
crwdns34008:0`-p 19132:19132 -p 19132:19132/udp`crwdne34008:0
## crwdns34010:0{#issues-with-specific-vpskvm-providers}crwdne34010:0
crwdns34012:0crwdne34012:0
### crwdns34014:0{#ovh-and-soyoustart}crwdne34014:0
crwdns34016:0crwdne34016:0 crwdns34018:0crwdne34018:0
crwdns34020:0crwdne34020:0
crwdns34022:0`Other`crwdne34022:0
:::caution
crwdns34024:0crwdne34024:0
:::
crwdns34026:0crwdne34026:0
crwdns34028:0crwdne34028:0
1. crwdns34030:0`Network interfaces`crwdne34030:0
2. crwdns34032:0`...`crwdnd34032:0`...`crwdnd34032:0`Configure the GAME firewall`crwdnd34032:0`Add rule`crwdnd34032:0`Other protocol`crwdne34032:0
3. crwdns34034:0`outgoing port`crwdne34034:0 crwdns34036:0`webrtc-port`crwdne34036:0
4. crwdns34038:0crwdne34038:0
crwdns34040:0crwdne34040:0
1. crwdns34042:0crwdne34042:0
2. crwdns34044:0crwdne34044:0
3. crwdns34046:0crwdne34046:0
4. crwdns34048:0crwdne34048:0 crwdns34050:0`webrtc-port`crwdne34050:0
5. crwdns34052:0crwdne34052:0
### crwdns34054:0{#oracle-cloudoci}crwdne34054:0
crwdns34056:0crwdne34056:0 crwdns34058:0crwdne34058:0
crwdns34060:0crwdne34060:0
1. crwdns34062:0crwdne34062:0
2. crwdns34064:0crwdne34064:0
3. crwdns34066:0crwdne34066:0
4. crwdns34068:0crwdne34068:0 crwdns34070:0crwdne34070:0 crwdns34072:0crwdne34072:0
5. crwdns34074:0crwdne34074:0
6. crwdns34076:0crwdne34076:0
- crwdns34078:0`0.0.0.0/0`crwdne34078:0
- crwdns34080:0`25565-25565`crwdne34080:0
- crwdns34082:0crwdne34082:0
7. crwdns34084:0crwdne34084:0
- crwdns34086:0`0.0.0.0/0`crwdne34086:0
- crwdns34088:0`19132-19132`crwdne34088:0
- crwdns34090:0crwdne34090:0
- crwdns34092:0crwdne34092:0
8. crwdns34094:0crwdne34094:0
#### crwdns34096:0{#oracle-linux}crwdne34096:0
crwdns34098:0crwdne34098:0
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### crwdns34100:0{#ubuntu}crwdne34100:0
crwdns34102:0crwdne34102:0
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,42 @@
---
title: crwdns34104:0crwdne34104:0
description: crwdns34106:0crwdne34106:0
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# crwdns34110:0crwdne34110:0 {#currently-supported-versions}
:::info
crwdns34112:0crwdne34112:0
:::
## crwdns34114:0crwdne34114:0 {#using-geyser-with-older-minecraft-bedrock-edition-versions}
crwdns34116:0crwdne34116:0 crwdns34118:0crwdne34118:0 crwdns34120:0crwdne34120:0
## crwdns34122:0crwdne34122:0 {#using-geyser-on-older-minecraft-java-edition-servers}
crwdns34124:0crwdne34124:0
crwdns34126:0[crwdnd34126:0](https://viaversion.com/viaversion)crwdne34126:0
### crwdns34128:0crwdne34128:0
crwdns34130:0crwdne34130:0 crwdns34132:0crwdne34132:0 crwdns34134:0[crwdnd34134:0](https://docs.papermc.io/misc/java-install)crwdne34134:0 crwdns34136:0`-DPaper.IgnoreJavaVersion=true`crwdne34136:0
crwdns34138:0crwdne34138:0 crwdns34140:0[crwdnd34140:0](/wiki/geyser/secure-chat)crwdne34140:0
### crwdns34142:0crwdne34142:0
crwdns34144:0crwdne34144:0 crwdns34146:0[crwdnd34146:0](https://viaversion.com/viaversion)crwdne34146:0 crwdns34148:0[crwdnd34148:0](https://viaversion.com/viaproxy)crwdne34148:0
### crwdns34150:0crwdne34150:0 {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
crwdns34152:0crwdne34152:0 crwdns34154:0[crwdnd34154:0](https://viaversion.com/viaproxy)crwdne34154:0 crwdns34156:0crwdne34156:0
### crwdns34158:0crwdne34158:0
crwdns34160:0[crwdnd34160:0](https://viaversion.com/viaversion)crwdne34160:0 crwdns34162:0crwdne34162:0
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "crwdns34794:0crwdne34794:0",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "crwdns34796:0crwdne34796:0",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "crwdns34798:0crwdne34798:0",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "crwdns34800:0crwdne34800:0",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "crwdns34802:0crwdne34802:0",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "crwdns34804:0crwdne34804:0",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "crwdns34806:0crwdne34806:0",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "crwdns34808:0crwdne34808:0",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "crwdns34810:0crwdne34810:0",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "crwdns34812:0crwdne34812:0",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "crwdns34814:0crwdne34814:0",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "crwdns34816:0crwdne34816:0",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "crwdns34818:0crwdne34818:0",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "crwdns34820:0crwdne34820:0",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "crwdns34822:0crwdne34822:0",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "crwdns34824:0crwdne34824:0",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "crwdns34826:0crwdne34826:0",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "crwdns34828:0crwdne34828:0",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "crwdns34830:0crwdne34830:0",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "crwdns34832:0crwdne34832:0",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "crwdns34834:0crwdne34834:0",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "Setup",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "Common Issues",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "Configuring Geyser",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "FAQ",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,83 @@
---
title: Commands and Permissions
description: Commands and their associated permission nodes for Geyser.
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# Commands and Permissions
Geyser features many built-in commands that can be used by players or server owners.
:::info
When using BungeeCord and Velocity, you will need to use a permission plugin such as [LuckPerms](https://luckperms.net/)
on the proxy server to assign permissions to players. Assigning permissions on the backend servers will not work.
:::
## Geyser commands & their permissions {#geyser-commands--their-permissions}
| Command | Permission | Description |
| :-----------------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| `geyser` <br/> Geyser root command | `geyser.command` | The permission required to see/run any Geyser commands. |
| `geyser help` <br/> `geyser ?` | `geyser.command.help` | Shows help for all registered commands. |
| `geyser advancements` | `geyser.command.advancements` | Open the Java advancements menu. |
| `geyser dump` | `geyser.command.dump` | Dumps Geyser debug information for bug reports. |
| `geyser list` | `geyser.command.list` | List all players connected through Geyser. |
| `geyser nethernet` | `geyser.command.nethernet` | Shows NetherNet signaling status and diagnostics, for use with external signaling. |
| `geyser offhand` | `geyser.command.offhand` | Puts an item in your offhand. |
| `geyser reload` | `geyser.command.reload` | Reloads the Geyser configurations. Kicks all players when used! |
| `geyser settings` | `geyser.command.settings` | Opens a settings menu allowing you to modify aspects of the world. |
| `geyser shutdown` <br/> `geyser stop` | `geyser.command.shutdown` | Shuts down Geyser.<br/>*This command only works on Standalone.* |
| `geyser statistics` | `geyser.command.statistics` | Open the Java statistics menu. |
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
## Permissions for Geyser extensions {#extension-permissions}
For the following, `<id>` refers to the extensions' id.
| Command | Permission | Description |
| :------------------------- | :---------------------------- | :------------------------------------------------------------------------ |
| `<id> help` <br/> `<id> ?` | `geyser.command.exthelp.<id>` | Shows help for all commands registered by this extension. |
## Other Permissions {#other-permissions}
Besides commands, there are other permissions that are used to guard specific Geyser features.
| Permission | Description |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | Allow players to use the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.settings.gamerules` | Defines whether a user can alter gamerules in the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.update` | Whether this player will receive Geyser update notifications upon joining. |
## Permissions when using Geyser-Standalone/Geyser-ViaProxy {#standalone-viaproxy-permissions}
Geyser-ViaProxy and Geyser-Standalone feature their own basic permission handler. To edit base permissions,
open the `permissions.yml` file and add or remove permissions that Geyser players should receive when joining.
See the file for more information.
You can further customize permission handling by creating a [Geyser extension](/wiki/geyser/extensions/) that makes use of Geysers API
to deal with permission checking.
## Permissions when using Geyser on platforms without permission handlers {#permissions-platforms-no-permission-handlers}
The following affects Geyser-BungeeCord, Geyser-Velocity, and Geyser-Fabric.
These platforms unfortunately do not have built-in permission handlers. Because of that, you will need to grant permissions on those platforms
manually using permission handlers, such as [LuckPerms](https://luckperms.net/). Geyser's permission are listed above. For extension permissions, consult their documentation.
Alternatively, you can use [LuckLink](https://github.com/onebeastchris/LuckLink), a third-party Geyser extension, to automatically register permissions using [LuckPerms](https://luckperms.net/).
- Install [LuckPerms](https://luckperms.net/) on the platform where you've installed Geyser (BungeeCord/Velocity/Fabric).
- To allow Geyser to automatically register permission defaults, install the [LuckLink](https://github.com/onebeastchris/LuckLink) Geyser extension
by downloading the `LuckLink.jar` and adding it to Geyser's `extensions` folder.
- Restart the server, and permissions should be automatically registered.
## Floodgate commands and permissions {#floodgate-commands-and-permissions}
For Floodgate commands, see [here](/wiki/floodgate/commands/).
@@ -0,0 +1,62 @@
---
title: playit.gg Setup
description: How to set up playit.gg to use Geyser without port forwarding.
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## Prerequisites {#prerequisites}
:::info
You must be able to connect to your Geyser instance locally!
:::
:::warning
The playit.gg Minecraft server plugin does not support UDP tunnels. You will need to use the program agent instead!
:::
:::caution
This guide was written for RakNet, and does not cover NetherNet. For NetherNet, see [playit.gg's progress on NetherNet support](https://status.playit.gg/3/adding-nethernet-support).
:::
## Setup {#setup}
1. Head over to [playit.gg's website](https://playit.gg/) - download the program & run it.
2. The program will provide a claiming link. Visit that link, log in.
![img](/img/wiki/playit-gg/playit_claim.png)
3. Confirm your agent.
![img](/img/wiki/playit-gg/playit_claim_confirm.png)
4. Add the agent.
![img](/img/wiki/playit-gg/playit_add_agent.png)
5. After the agent is created, create a tunnel.
![img](/img/wiki/playit-gg/playit_add_tunnel.png)
6. Name your tunnel and click Next.
![img](/img/wiki/playit-gg/playit_name_tunnel.png)
7. Select "Minecraft Bedrock" as the tunnel type and click Next.
![img](/img/wiki/playit-gg/playit_tunnel_type.png)
8. Select the Free Network and click Next.
![img](/img/wiki/playit-gg/playit_select_network.png)
**Do not change your Geyser port in `config.yml` unless you have a reason (for example, hosting another Geyser server on the same machine).** The Bedrock (Geyser) port in `config.yml` and the playit.gg ports are separate. playit.gg will forward its port to the default Geyser port and should work as-is. Changing it can cause errors. If you have changed your config port, set the Bedrock port back to the default `19132` and ensure `clone-remote-port` is `false`.
9. If the playit.gg agent and Geyser are running on the same device, leave the IP as `127.0.0.1` and set the port to whatever you configured in Geyser's config.
![img](/img/wiki/playit-gg/playit_set_ipandport.png)
10. Select `proxy-protocol-v2` for the Proxy Protocol section and click Next.
11. In the Geyser config, under `advanced:` `bedrock:`, set `use-haproxy-protocol` to `true`.
12. Click Create Tunnel and wait for the tunnel to be created.
![img](/img/wiki/playit-gg/playit_create_tunnel.png)
13. Copy your tunnel's port. For example, if your tunnel address is `visiting-phone.gl.at.ply.gg:6695`, then `6695` is the tunnel port.
14. In the Geyser config under `advanced:` `bedrock:`, set `broadcast-port` to your tunnel port (`6695` in the example).
15. Save your config. Start your Minecraft server and connect using your tunnel's IP and port.
16. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
## Troubleshooting {#troubleshooting}
### I can't connect to my server! {#i-cant-connect-to-my-server}
- *Try going to the Agents page, set your agent to IPv4 only, and change the region. You may need to switch regions a few times before you can connect.*
- *Are there errors in your minecraft server console?*
- *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
- *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 8.*
- *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
- *Make sure that you have the program agent open while trying to join.*
- *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
@@ -0,0 +1,208 @@
---
title: Port forwarding
description: Information on how to set up port forwarding required for Geyser.
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# Port forwarding {#port-forwarding}
This page contains information on how to set up port forwarding required for Geyser to work when self-hosting.
There are also guides for specific configurations, such as Docker/Pterodactyl, or on specific VPS/KVM providers, such as OVH or Oracle Cloud.
:::caution
If you are using a Minecraft server hosting provider (e.g. Aternos, or Nodecraft), you should refer to the hosting provider setup on the [setup](/wiki/geyser/setup) page instead.
:::
:::info Ports that need to be opened
With NetherNet, the Geyser port (by default 19132) has to be open for **both TCP and UDP**: players find the server over TCP (signaling), and play on it over UDP.
If you use the "NetherNet and RakNet" option, also open the `webrtc-port` for UDP.
With external signaling, such as [Warden](https://warden.cloud), only UDP for WebRTC is needed.
:::
## Port forwarding on Linux/Windows/macOS {#port-forwarding-on-linuxwindowsmacos}
To allow others to play on your server, you will need to set up port forwarding on the device hosting Geyser.
Additionally, you will need to port forward the port on your router/modem (in other words, allow and route traffic on that port to the proper machine) if you want the server to be accessible outside your own home network.
Forward it for both TCP and UDP; many routers offer a "TCP/UDP" or "Both" option for this.
See [here](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/) or [here](https://www.lifewire.com/how-to-port-forward-4163829) for helpful guides.
Do note: if you do not have a static IP address, your IP address may change over time.
:::info
Some ISPs (Internet Service Providers) block certain ports, or don't allow you to open ports (e.g. by using CGNAT, which doesn't allow you to open a port with a dynamic IP).
Other ISPs may require you to pay extra for a static IP address.
As an alternative to port forwarding, you can use [playit.gg](/wiki/geyser/playit-gg/) to create a tunnel.
:::
### Windows {#windows}
To open a port on Windows, you will need to open the port through the Windows Firewall. There are multiple ways to do this:
- `Powershell` (recommended)
To open a port on TCP and UDP (in our example, port 19132), run the following commands in an administrator Powershell:
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
Running these commands creates two rules that allow TCP and UDP traffic on port 19132.
- Windows Defender Firewall with Advanced Security (GUI)
1. Search for "Windows Defender Firewall with Advanced Security" in the start menu, and open it. ([Image](/img/wiki/port-forwarding/windows-1.png))
2. Click on "Inbound Rules" in the left sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
3. Click on "New Rule..." in the right sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
4. Select "Port" as the rule type and click "Next". ([Example](/img/wiki/port-forwarding/windows-3.png))
5. Select "UDP" and "Specific local ports", and enter the port you want to open (in our example, 19132). Click "Next". ([Example](/img/wiki/port-forwarding/windows-4.png))
6. Select "Allow the connection" and click "Next". ([Example](/img/wiki/port-forwarding/windows-5.png))
7. Select the profiles you want to apply the rule to (e.g. "Domain", "Private", "Public"), and click "Next". ([Example](/img/wiki/port-forwarding/windows-6.png))
8. Enter a name for the rule (e.g. "Geyser (UDP)"), and click "Finish". ([Image](/img/wiki/port-forwarding/windows-7.png))
9. Repeat these steps, selecting "TCP" in step 5 and naming the rule e.g. "Geyser (TCP)".
### Linux {#linux}
Different Linux distributions, even different VPS providers ship and configure different firewalls. In the following examples, we will use `19132` as the port to open, but you should replace this with the port you are using for Geyser.
- `ufw` is a simple firewall front-end for iptables that is commonly used on Ubuntu and Debian. To open a port on TCP and UDP, run the following commands:
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
Then, reload the firewall with `sudo ufw reload`, and see all open rules with `sudo ufw status`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server), [Baeldung](https://www.baeldung.com/linux/uncomplicated-firewall)
- `firewalld` Add a port on TCP and UDP by running:
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
Then, reload the firewall with `sudo firewall-cmd --reload`, and see all open rules with `sudo firewall-cmd --list-all`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)
- `iptables` is a common firewall that is used on many Linux distributions. To open a port on TCP and UDP, run the following commands:
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
Then, save the firewall with `sudo iptables-save`, and see all open rules with `sudo iptables -L`.
Further helpful guides for iptables: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04), [Ubuntu](https://help.ubuntu.com/community/IptablesHowTo)
### macOS {#macos}
You will need to disable `Block all incoming connections` in your Firewall settings, as that will block any connections and won't allow you to make exceptions.
To allow incoming connections, click `Allow` when getting [these prompts](/img/wiki/port-forwarding/macos_warning.png).
If you are still facing issues, see Apple's official guide [here](https://support.apple.com/guide/mac-help/MH11783) to open a port on macOS.
## Using Docker or Pterodactyl {#using-docker-or-pterodactyl}
In addition to port forwarding the port in your server's firewall (and, if applicable, your router/modem), you will need to assign the port in Docker/Pterodactyl.
### Pterodactyl {#pterodactyl}
Make sure to allocate the port(s) to the server in the Pterodactyl panel's `Network` tab, additionally to port forwarding the port(s).
See [here](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel) for more information.
![Pterodactyl panel, Network section](/img/wiki/port-forwarding/pterodactyl-1.png)
There are also different Geyser eggs for Pterodactyl, which can be found [here](https://github.com/GeyserMC/pterodactyl-stuff).
:::caution
If you are not able to allocate ports in the Pterodactyl panel, you will need to contact your server host to allocate one for you or try to use an existing port allocation.
:::
### Docker {#docker}
For Geyser to work under Docker (e.g. using [Itzg's Docker image](https://github.com/itzg/docker-minecraft-server)), you will need to add the Geyser port on TCP and UDP to the docker-compose file. This is done by adding the following to the `ports` section:
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
Without a suffix, Docker exposes the port on TCP. The additional `/udp` suffix exposes it on UDP.
Alternatively, add the ports with the `-p 19132:19132 -p 19132:19132/udp` flags to the docker run command.
## Issues with specific VPS/KVM providers {#issues-with-specific-vpskvm-providers}
Some providers, such as OVH, Oracle Cloud, and SoYouStart, have a firewall that blocks the ports Geyser needs by default/in most cases.
### OVH and SoYouStart {#ovh-and-soyoustart}
OVH's GAME firewall filters traffic with rules made for specific games. The Minecraft Bedrock and Minecraft Pocket Edition rules currently only support RakNet, the protocol Bedrock used before NetherNet.
With NetherNet, players find the server over HTTP (TCP) and play over WebRTC (UDP), which these rules currently do not support.
For now, use the `Other` rule for the Geyser port(s) instead.
:::caution
If you do not have access to these firewall settings, but got linked to this page, please contact your server host and provide them with this link - they are likely using OVH internally.
:::
**To resolve it:**
OVH:
1. Navigate to `Network interfaces`
2. Click on the `...` button on the table for your IP -> then `...` and `Configure the GAME firewall` -> `Add rule` -> `Other protocol`
3. Add your Geyser port into `outgoing port`. If you use the "NetherNet and RakNet" option, add a rule for the `webrtc-port` as well.
4. If you use OVH's Edge Network Firewall, make sure it allows the Geyser port over both TCP and UDP.
SoYouStart (subsidiary of OVH):
1. Click the IP tab.
2. Click the gear at the right of the public IP address; select "Game mitigation".
3. Pick "Add a rule".
4. Select "Other" in the dropdown list and enter the Geyser port. If you use the "NetherNet and RakNet" option, add the `webrtc-port` as well.
5. Save and wait a few seconds for the changes to come into effect.
### Oracle Cloud/OCI {#oracle-cloudoci}
By default, Oracle Cloud will block all incoming traffic except for SSH and RDP. This must be resolved within Oracle Cloud itself and the Compute Instance running Geyser.
The steps below assume that you are using the default ports for the Java server and Geyser, and should be adjusted accordingly.
1. Find your Compute Instance in the OCI Console
2. Click on the instances Virtual Cloud Network (this will be under "Instance details")
3. On the left-hand side, select "Security Lists"
4. Select one of the security lists. By default only one security list will exist. It doesn't matter which security list we add the rules to.
5. Select "Add Ingress Rules"
6. Configure rules for Java (optional)
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `25565-25565`
- Select "Another Ingress Rule"
7. Configure rules for Geyser, once for TCP and once for UDP
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `19132-19132`
- Set "IP Protocol" to TCP
- Select "Another Ingress Rule", and repeat with "IP Protocol" set to UDP
8. Select "Add Ingress Rules"
#### Oracle Linux {#oracle-linux}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### Ubuntu {#ubuntu}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,47 @@
---
title: Supported versions
description: Information on the versions Geyser supports.
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# Currently supported versions \ {#currently-supported-versions}
:::info
**Geyser currently supports Minecraft Bedrock <Versions.bedrock /> and Minecraft Java <Versions.java />**.
:::
## Using Geyser with older Minecraft: Bedrock edition versions \ {#using-geyser-with-older-minecraft-bedrock-edition-versions}
Older Bedrock versions are not supported. Minecraft: Bedrock Edition updates automatically on all platforms, so there are few users who would
want to use older versions. Further, older Bedrock versions do not have all features which Geyser support, which would lead to a sub-par experience.
## Using Geyser on older Minecraft: Java edition servers \ {#using-geyser-on-older-minecraft-java-edition-servers}
Geyser emulates a <Versions.java /> client, so a Java server must accept users using that version in order for Geyser to work.
This is possible thanks to [ViaVersion](https://viaversion.com/viaversion), which allows Java edition players with newer versions to join servers
that run older versions of the game.
### Using Geyser-Spigot on a Spigot/Paper server running on 1.20.5 or above
You can use Geyser-Spigot on servers that run on 1.20.5 or above. You will also need to run at least Java 21 or later to use Geyser. See [here](https://docs.papermc.io/misc/java-install) for more info on updating Java. Paper versions not supporting Java 21 can add `-DPaper.IgnoreJavaVersion=true` flag to the Java startup arguments to allow Paper to run on Java 21.
In order for Bedrock players to chat (1.19.3+) or join (1.19.1/1.19.2), you need to disable chat signing. More information about that can be read on the [chat signing page](/wiki/geyser/secure-chat).
### Using Geyser-Spigot on a Spigot/Paper server running on a version below 1.20.5
This is unfortunately not possible. You'll need to use a proxy such as Velocity or BungeeCord, or set up Geyser-Standalone separately with the [ViaVersion](https://viaversion.com/viaversion) plugin. Another alternative would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it.
### Using Geyser on Fabric/NeoForge servers not on the latest Minecraft version \ {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
Unfortunately, Geyser-Fabric and Geyser-NeoForge only support the latest version of Minecraft: Java edition. The recommended way to still use
Geyser with older versions would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it. This will also work with Floodgate auth.
### Using Geyser-Velocity or Geyser-BungeeCord on a proxy
Make sure you update your proxy software to the latest available version, and, if the backend servers are not on <Versions.java />, also install the [ViaVersion](https://viaversion.com/viaversion) plugin on the backend servers. Velocity/BungeeCord support most Minecraft versions, so you can update them regardless of the backend server versions.
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "Wiki",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "Downloads",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "REST APIs",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "Other",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "Blog",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "Donate",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "Global Linking",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "Privacy Policy",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "Copyright © 2026 GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "Wiki",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "Blog",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "Utilities",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "Download",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "REST APIs",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "Other",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "Einrichtung",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "Common Issues",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "Configuring Geyser",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "FAQ",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,83 @@
---
title: Commands and Permissions
description: Commands and their associated permission nodes for Geyser.
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# Commands and Permissions
Geyser features many built-in commands that can be used by players or server owners.
:::info
When using BungeeCord and Velocity, you will need to use a permission plugin such as [LuckPerms](https://luckperms.net/)
on the proxy server to assign permissions to players. Assigning permissions on the backend servers will not work.
:::
## Geyser commands & their permissions {#geyser-commands--their-permissions}
| Command | Permission | Description |
| :-----------------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| `geyser` <br/> Geyser root command | `geyser.command` | The permission required to see/run any Geyser commands. |
| `geyser help` <br/> `geyser ?` | `geyser.command.help` | Shows help for all registered commands. |
| `geyser advancements` | `geyser.command.advancements` | Open the Java advancements menu. |
| `geyser dump` | `geyser.command.dump` | Dumps Geyser debug information for bug reports. |
| `geyser list` | `geyser.command.list` | List all players connected through Geyser. |
| `geyser nethernet` | `geyser.command.nethernet` | Shows NetherNet signaling status and diagnostics, for use with external signaling. |
| `geyser offhand` | `geyser.command.offhand` | Puts an item in your offhand. |
| `geyser reload` | `geyser.command.reload` | Reloads the Geyser configurations. Kicks all players when used! |
| `geyser settings` | `geyser.command.settings` | Opens a settings menu allowing you to modify aspects of the world. |
| `geyser shutdown` <br/> `geyser stop` | `geyser.command.shutdown` | Shuts down Geyser.<br/>*This command only works on Standalone.* |
| `geyser statistics` | `geyser.command.statistics` | Open the Java statistics menu. |
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
## Permissions for Geyser extensions {#extension-permissions}
For the following, `<id>` refers to the extensions' id.
| Command | Permission | Description |
| :------------------------- | :---------------------------- | :------------------------------------------------------------------------ |
| `<id> help` <br/> `<id> ?` | `geyser.command.exthelp.<id>` | Shows help for all commands registered by this extension. |
## Other Permissions {#other-permissions}
Besides commands, there are other permissions that are used to guard specific Geyser features.
| Permission | Description |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | Allow players to use the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.settings.gamerules` | Defines whether a user can alter gamerules in the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.update` | Whether this player will receive Geyser update notifications upon joining. |
## Permissions when using Geyser-Standalone/Geyser-ViaProxy {#standalone-viaproxy-permissions}
Geyser-ViaProxy and Geyser-Standalone feature their own basic permission handler. To edit base permissions,
open the `permissions.yml` file and add or remove permissions that Geyser players should receive when joining.
See the file for more information.
You can further customize permission handling by creating a [Geyser extension](/wiki/geyser/extensions/) that makes use of Geysers API
to deal with permission checking.
## Permissions when using Geyser on platforms without permission handlers {#permissions-platforms-no-permission-handlers}
The following affects Geyser-BungeeCord, Geyser-Velocity, and Geyser-Fabric.
These platforms unfortunately do not have built-in permission handlers. Because of that, you will need to grant permissions on those platforms
manually using permission handlers, such as [LuckPerms](https://luckperms.net/). Geyser's permission are listed above. For extension permissions, consult their documentation.
Alternatively, you can use [LuckLink](https://github.com/onebeastchris/LuckLink), a third-party Geyser extension, to automatically register permissions using [LuckPerms](https://luckperms.net/).
- Install [LuckPerms](https://luckperms.net/) on the platform where you've installed Geyser (BungeeCord/Velocity/Fabric).
- To allow Geyser to automatically register permission defaults, install the [LuckLink](https://github.com/onebeastchris/LuckLink) Geyser extension
by downloading the `LuckLink.jar` and adding it to Geyser's `extensions` folder.
- Restart the server, and permissions should be automatically registered.
## Floodgate commands and permissions {#floodgate-commands-and-permissions}
For Floodgate commands, see [here](/wiki/floodgate/commands/).
@@ -0,0 +1,62 @@
---
title: playit.gg Setup
description: How to set up playit.gg to use Geyser without port forwarding.
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## Prerequisites {#prerequisites}
:::info
You must be able to connect to your Geyser instance locally!
:::
:::warning
The playit.gg Minecraft server plugin does not support UDP tunnels. You will need to use the program agent instead!
:::
:::caution
This guide was written for RakNet, and does not cover NetherNet. For NetherNet, see [playit.gg's progress on NetherNet support](https://status.playit.gg/3/adding-nethernet-support).
:::
## Setup {#setup}
1. Head over to [playit.gg's website](https://playit.gg/) - download the program & run it.
2. The program will provide a claiming link. Visit that link, log in.
![img](/img/wiki/playit-gg/playit_claim.png)
3. Confirm your agent.
![img](/img/wiki/playit-gg/playit_claim_confirm.png)
4. Add the agent.
![img](/img/wiki/playit-gg/playit_add_agent.png)
5. After the agent is created, create a tunnel.
![img](/img/wiki/playit-gg/playit_add_tunnel.png)
6. Name your tunnel and click Next.
![img](/img/wiki/playit-gg/playit_name_tunnel.png)
7. Select "Minecraft Bedrock" as the tunnel type and click Next.
![img](/img/wiki/playit-gg/playit_tunnel_type.png)
8. Select the Free Network and click Next.
![img](/img/wiki/playit-gg/playit_select_network.png)
**Do not change your Geyser port in `config.yml` unless you have a reason (for example, hosting another Geyser server on the same machine).** The Bedrock (Geyser) port in `config.yml` and the playit.gg ports are separate. playit.gg will forward its port to the default Geyser port and should work as-is. Changing it can cause errors. If you have changed your config port, set the Bedrock port back to the default `19132` and ensure `clone-remote-port` is `false`.
9. If the playit.gg agent and Geyser are running on the same device, leave the IP as `127.0.0.1` and set the port to whatever you configured in Geyser's config.
![img](/img/wiki/playit-gg/playit_set_ipandport.png)
10. Select `proxy-protocol-v2` for the Proxy Protocol section and click Next.
11. In the Geyser config, under `advanced:` `bedrock:`, set `use-haproxy-protocol` to `true`.
12. Click Create Tunnel and wait for the tunnel to be created.
![img](/img/wiki/playit-gg/playit_create_tunnel.png)
13. Copy your tunnel's port. For example, if your tunnel address is `visiting-phone.gl.at.ply.gg:6695`, then `6695` is the tunnel port.
14. In the Geyser config under `advanced:` `bedrock:`, set `broadcast-port` to your tunnel port (`6695` in the example).
15. Save your config. Start your Minecraft server and connect using your tunnel's IP and port.
16. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
## Troubleshooting {#troubleshooting}
### I can't connect to my server! {#i-cant-connect-to-my-server}
- *Try going to the Agents page, set your agent to IPv4 only, and change the region. You may need to switch regions a few times before you can connect.*
- *Are there errors in your minecraft server console?*
- *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
- *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 8.*
- *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
- *Make sure that you have the program agent open while trying to join.*
- *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
@@ -0,0 +1,208 @@
---
title: Port forwarding
description: Information on how to set up port forwarding required for Geyser.
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# Port forwarding {#port-forwarding}
This page contains information on how to set up port forwarding required for Geyser to work when self-hosting.
There are also guides for specific configurations, such as Docker/Pterodactyl, or on specific VPS/KVM providers, such as OVH or Oracle Cloud.
:::caution
If you are using a Minecraft server hosting provider (e.g. Aternos, or Nodecraft), you should refer to the hosting provider setup on the [setup](/wiki/geyser/setup) page instead.
:::
:::info Ports that need to be opened
With NetherNet, the Geyser port (by default 19132) has to be open for **both TCP and UDP**: players find the server over TCP (signaling), and play on it over UDP.
If you use the "NetherNet and RakNet" option, also open the `webrtc-port` for UDP.
With external signaling, such as [Warden](https://warden.cloud), only UDP for WebRTC is needed.
:::
## Port forwarding on Linux/Windows/macOS {#port-forwarding-on-linuxwindowsmacos}
To allow others to play on your server, you will need to set up port forwarding on the device hosting Geyser.
Additionally, you will need to port forward the port on your router/modem (in other words, allow and route traffic on that port to the proper machine) if you want the server to be accessible outside your own home network.
Forward it for both TCP and UDP; many routers offer a "TCP/UDP" or "Both" option for this.
See [here](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/) or [here](https://www.lifewire.com/how-to-port-forward-4163829) for helpful guides.
Do note: if you do not have a static IP address, your IP address may change over time.
:::info
Some ISPs (Internet Service Providers) block certain ports, or don't allow you to open ports (e.g. by using CGNAT, which doesn't allow you to open a port with a dynamic IP).
Other ISPs may require you to pay extra for a static IP address.
As an alternative to port forwarding, you can use [playit.gg](/wiki/geyser/playit-gg/) to create a tunnel.
:::
### Windows {#windows}
To open a port on Windows, you will need to open the port through the Windows Firewall. There are multiple ways to do this:
- `Powershell` (recommended)
To open a port on TCP and UDP (in our example, port 19132), run the following commands in an administrator Powershell:
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
Running these commands creates two rules that allow TCP and UDP traffic on port 19132.
- Windows Defender Firewall with Advanced Security (GUI)
1. Search for "Windows Defender Firewall with Advanced Security" in the start menu, and open it. ([Image](/img/wiki/port-forwarding/windows-1.png))
2. Click on "Inbound Rules" in the left sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
3. Click on "New Rule..." in the right sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
4. Select "Port" as the rule type and click "Next". ([Example](/img/wiki/port-forwarding/windows-3.png))
5. Select "UDP" and "Specific local ports", and enter the port you want to open (in our example, 19132). Click "Next". ([Example](/img/wiki/port-forwarding/windows-4.png))
6. Select "Allow the connection" and click "Next". ([Example](/img/wiki/port-forwarding/windows-5.png))
7. Select the profiles you want to apply the rule to (e.g. "Domain", "Private", "Public"), and click "Next". ([Example](/img/wiki/port-forwarding/windows-6.png))
8. Enter a name for the rule (e.g. "Geyser (UDP)"), and click "Finish". ([Image](/img/wiki/port-forwarding/windows-7.png))
9. Repeat these steps, selecting "TCP" in step 5 and naming the rule e.g. "Geyser (TCP)".
### Linux {#linux}
Different Linux distributions, even different VPS providers ship and configure different firewalls. In the following examples, we will use `19132` as the port to open, but you should replace this with the port you are using for Geyser.
- `ufw` is a simple firewall front-end for iptables that is commonly used on Ubuntu and Debian. To open a port on TCP and UDP, run the following commands:
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
Then, reload the firewall with `sudo ufw reload`, and see all open rules with `sudo ufw status`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server), [Baeldung](https://www.baeldung.com/linux/uncomplicated-firewall)
- `firewalld` Add a port on TCP and UDP by running:
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
Then, reload the firewall with `sudo firewall-cmd --reload`, and see all open rules with `sudo firewall-cmd --list-all`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)
- `iptables` is a common firewall that is used on many Linux distributions. To open a port on TCP and UDP, run the following commands:
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
Then, save the firewall with `sudo iptables-save`, and see all open rules with `sudo iptables -L`.
Further helpful guides for iptables: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04), [Ubuntu](https://help.ubuntu.com/community/IptablesHowTo)
### macOS {#macos}
You will need to disable `Block all incoming connections` in your Firewall settings, as that will block any connections and won't allow you to make exceptions.
To allow incoming connections, click `Allow` when getting [these prompts](/img/wiki/port-forwarding/macos_warning.png).
If you are still facing issues, see Apple's official guide [here](https://support.apple.com/guide/mac-help/MH11783) to open a port on macOS.
## Using Docker or Pterodactyl {#using-docker-or-pterodactyl}
In addition to port forwarding the port in your server's firewall (and, if applicable, your router/modem), you will need to assign the port in Docker/Pterodactyl.
### Pterodactyl {#pterodactyl}
Make sure to allocate the port(s) to the server in the Pterodactyl panel's `Network` tab, additionally to port forwarding the port(s).
See [here](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel) for more information.
![Pterodactyl panel, Network section](/img/wiki/port-forwarding/pterodactyl-1.png)
There are also different Geyser eggs for Pterodactyl, which can be found [here](https://github.com/GeyserMC/pterodactyl-stuff).
:::caution
If you are not able to allocate ports in the Pterodactyl panel, you will need to contact your server host to allocate one for you or try to use an existing port allocation.
:::
### Docker {#docker}
For Geyser to work under Docker (e.g. using [Itzg's Docker image](https://github.com/itzg/docker-minecraft-server)), you will need to add the Geyser port on TCP and UDP to the docker-compose file. This is done by adding the following to the `ports` section:
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
Without a suffix, Docker exposes the port on TCP. The additional `/udp` suffix exposes it on UDP.
Alternatively, add the ports with the `-p 19132:19132 -p 19132:19132/udp` flags to the docker run command.
## Issues with specific VPS/KVM providers {#issues-with-specific-vpskvm-providers}
Some providers, such as OVH, Oracle Cloud, and SoYouStart, have a firewall that blocks the ports Geyser needs by default/in most cases.
### OVH and SoYouStart {#ovh-and-soyoustart}
OVH's GAME firewall filters traffic with rules made for specific games. The Minecraft Bedrock and Minecraft Pocket Edition rules currently only support RakNet, the protocol Bedrock used before NetherNet.
With NetherNet, players find the server over HTTP (TCP) and play over WebRTC (UDP), which these rules currently do not support.
For now, use the `Other` rule for the Geyser port(s) instead.
:::caution
If you do not have access to these firewall settings, but got linked to this page, please contact your server host and provide them with this link - they are likely using OVH internally.
:::
**To resolve it:**
OVH:
1. Navigate to `Network interfaces`
2. Click on the `...` button on the table for your IP -> then `...` and `Configure the GAME firewall` -> `Add rule` -> `Other protocol`
3. Add your Geyser port into `outgoing port`. If you use the "NetherNet and RakNet" option, add a rule for the `webrtc-port` as well.
4. If you use OVH's Edge Network Firewall, make sure it allows the Geyser port over both TCP and UDP.
SoYouStart (subsidiary of OVH):
1. Click the IP tab.
2. Click the gear at the right of the public IP address; select "Game mitigation".
3. Pick "Add a rule".
4. Select "Other" in the dropdown list and enter the Geyser port. If you use the "NetherNet and RakNet" option, add the `webrtc-port` as well.
5. Save and wait a few seconds for the changes to come into effect.
### Oracle Cloud/OCI {#oracle-cloudoci}
By default, Oracle Cloud will block all incoming traffic except for SSH and RDP. This must be resolved within Oracle Cloud itself and the Compute Instance running Geyser.
The steps below assume that you are using the default ports for the Java server and Geyser, and should be adjusted accordingly.
1. Find your Compute Instance in the OCI Console
2. Click on the instances Virtual Cloud Network (this will be under "Instance details")
3. On the left-hand side, select "Security Lists"
4. Select one of the security lists. By default only one security list will exist. It doesn't matter which security list we add the rules to.
5. Select "Add Ingress Rules"
6. Configure rules for Java (optional)
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `25565-25565`
- Select "Another Ingress Rule"
7. Configure rules for Geyser, once for TCP and once for UDP
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `19132-19132`
- Set "IP Protocol" to TCP
- Select "Another Ingress Rule", and repeat with "IP Protocol" set to UDP
8. Select "Add Ingress Rules"
#### Oracle Linux {#oracle-linux}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### Ubuntu {#ubuntu}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,47 @@
---
title: Supported versions
description: Information on the versions Geyser supports.
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# Currently supported versions \ {#currently-supported-versions}
:::info
**Geyser currently supports Minecraft Bedrock <Versions.bedrock /> and Minecraft Java <Versions.java />**.
:::
## Using Geyser with older Minecraft: Bedrock edition versions \ {#using-geyser-with-older-minecraft-bedrock-edition-versions}
Older Bedrock versions are not supported. Minecraft: Bedrock Edition updates automatically on all platforms, so there are few users who would
want to use older versions. Further, older Bedrock versions do not have all features which Geyser support, which would lead to a sub-par experience.
## Using Geyser on older Minecraft: Java edition servers \ {#using-geyser-on-older-minecraft-java-edition-servers}
Geyser emulates a <Versions.java /> client, so a Java server must accept users using that version in order for Geyser to work.
This is possible thanks to [ViaVersion](https://viaversion.com/viaversion), which allows Java edition players with newer versions to join servers
that run older versions of the game.
### Using Geyser-Spigot on a Spigot/Paper server running on 1.20.5 or above
You can use Geyser-Spigot on servers that run on 1.20.5 or above. You will also need to run at least Java 21 or later to use Geyser. See [here](https://docs.papermc.io/misc/java-install) for more info on updating Java. Paper versions not supporting Java 21 can add `-DPaper.IgnoreJavaVersion=true` flag to the Java startup arguments to allow Paper to run on Java 21.
In order for Bedrock players to chat (1.19.3+) or join (1.19.1/1.19.2), you need to disable chat signing. More information about that can be read on the [chat signing page](/wiki/geyser/secure-chat).
### Using Geyser-Spigot on a Spigot/Paper server running on a version below 1.20.5
This is unfortunately not possible. You'll need to use a proxy such as Velocity or BungeeCord, or set up Geyser-Standalone separately with the [ViaVersion](https://viaversion.com/viaversion) plugin. Another alternative would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it.
### Using Geyser on Fabric/NeoForge servers not on the latest Minecraft version \ {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
Unfortunately, Geyser-Fabric and Geyser-NeoForge only support the latest version of Minecraft: Java edition. The recommended way to still use
Geyser with older versions would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it. This will also work with Floodgate auth.
### Using Geyser-Velocity or Geyser-BungeeCord on a proxy
Make sure you update your proxy software to the latest available version, and, if the backend servers are not on <Versions.java />, also install the [ViaVersion](https://viaversion.com/viaversion) plugin on the backend servers. Velocity/BungeeCord support most Minecraft versions, so you can update them regardless of the backend server versions.
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "Wiki",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "Downloads",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "REST APIs",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "Other",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "Blog",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "Donate",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "Global Linking",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "Privacy Policy",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "Copyright © 2026 GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "Wiki",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "Blog",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "Utilities",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "Download",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "REST APIs",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "Other",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+519 -269
View File
@@ -1,238 +1,4 @@
{
"components.provider.instructions": {
"message": "Provider Instructions"
},
"components.provider.select": {
"message": "Select a provider to see specific installation instructions"
},
"providers.templates.default": {
"message": "Enable `clone-remote-port` (or manually set `bedrock port` to the Java port), and connect with the Java IP and port."
},
"providers.templates.ip_and_port": {
"message": "Enable `clone-remote-port` (or manually set `bedrock port` to the Java port) and change `bedrock address` from `0.0.0.0` to your Java server's IP. Connect with the Java IP and port."
},
"providers.templates.forwarding_option": {
"message": "Offers a working port forwarding option."
},
"providers.templates.java_ip": {
"message": "Change `bedrock address` from `0.0.0.0` to your Java server's IP."
},
"providers.provider.apex_hosting.description": {
"message": "Full auto installation. Go to the Customizations tab in the panel and select 'Enabled' under the 'Geyser Auto Installer' option. Then, restart and connect to your server with your Java IP and port. See [Apex's article](https://apexminecrafthosting.com/geysermc/) for more details."
},
"providers.provider.aternos.description": {
"message": "Install Geyser in the Aternos plugin list and connect to your server with your Java IP and port. See [Aternos's article](https://support.aternos.org/hc/en-us/articles/360051047631) for more details. Do note: Aternos automatically installs the latest version of the plugin, but does not auto update it. To update Geyser on Aternos, simply reinstall the plugin (no need to uninstall the plugin/deleting the plugin files)."
},
"providers.provider.birdflop.description": {
"message": "Open an allocation in the networks tab. If you have a dedicated IP, you can open a ticket to request allocation of the default Bedrock port (19132). Update the config to use the allocated port and restart the server."
},
"providers.provider.cloud_nord.description": {
"message": "Go to their [Crossplay Server](https://cloudnord.net/minecraftcrossplay-server-hosting/) hosting section and order your server. Instructions on how to join are provided."
},
"providers.provider.creeperhost.description": {
"message": "Has a toggle within the control panel to automatically enable Geyser. May not be enabled by default, so you may need to toggle it and restart the server."
},
"providers.provider.cubes_hosting.description": {
"message": "Install Geyser using the plugin manager. Then restart the server and Geyser will run on an additional port - you can check it in the server console. Geyser-Standalone can be set up through a support ticket."
},
"providers.provider.exaroton.description": {
"message": "Install Geyser in the exaroton plugin list and connect to your server with your Java IP and port. See [exaroton's article](https://support.exaroton.com/hc/en-us/articles/360019857918-Geyser) for more details."
},
"providers.provider.ggservers.description": {
"message": "Can be installed to any server from their auto plugin setups. No further configuration needed."
},
"providers.provider.lilypad.description": {
"message": "Tick the 'Enable Bedrock crossplay?' option when changing your server software to automatically install and configure Geyser + Floodgate. For more details, navigate to [lilypad.gg/bedrock](https://lilypad.gg/bedrock)."
},
"providers.provider.mcprohosting.description": {
"message": "Click 'Enable Bedrock Support' on the server dashboard and follow the steps. For manual installation: Add 'Destination Port' `19132` with 'Protocol UDP' to the port forward mapping and connect to the given source port."
},
"providers.provider.minefort.description": {
"message": "On the server dashboard under 'Connect Support', make sure 'Allow Bedrock' is enabled. Then connect via `play.minefort.com` and join using `/server [servername]`, or connect via `[servername].minefort.com`."
},
"providers.provider.minehut.description": {
"message": "Connect via `bedrock.minehut.com` and do `/join [servername]`, or connect directly via `[servername].bedrock.minehut.gg`."
},
"providers.provider.omgserv.description": {
"message": "Select Geyser in the [Install Menu](https://i.imgur.com/Gewpsrq.png), it will be automatically installed. You can enable floodgate in the [server properties on the dashboard](https://i.imgur.com/jg5mzNj.png)."
},
"providers.provider.piglinhost.description": {
"message": "Order from the [cross-platform servers page](https://piglinhost.com/minecraft-java-hosting.html). Alternatively, contact their support by creating a [support ticket](https://billing.piglinhost.com/submitticket.php?step=2&deptid=5) or via discord for installation and configuration help."
},
"providers.provider.playhosting.description": {
"message": "Tick the 'Enable Bedrock crossplay?' option when changing your server software to automatically install and configure Geyser + Floodgate. For more details, navigate to [help.play.hosting/minecraft/crossplay](https://help.play.hosting/minecraft/crossplay)."
},
"providers.provider.pufferfish_host.description": {
"message": "Geyser is installed and configured on all servers by default."
},
"providers.provider.server.pro.description": {
"message": "Different instructions for different plans: On VPS, select Geyser in the [Service Type Menu](https://i.imgur.com/loSNmvu.png), Floodgate can be enabled on the dashboard configuration. For manual installation: Using a Premium or Free plan, use the same port as your Java server for the Bedrock port in the configuration file and connect that; for the Free plan, also enable the `clone-remote-port` option. If you are using a PRO or a VPS plan, you can use any port, which can be opened on the Firewall tab."
},
"providers.provider.serverprism.description": {
"message": "Order a [Minecraft server](https://serverprism.com/minecraft-server-hosting) on any plugin-compatible runtime (Paper, Spigot, Purpur, etc.), then install Geyser from the panel's plugin installer. Connect with the same IP and port as your Java server."
},
"providers.provider.snakecraft_hosting.description": {
"message": "Select 'Paper + Geyser with Floodgate' under the Jar Type at checkout to install the Geyser plugin. Players will Connect with the same IP and port as you would on Java."
},
"providers.provider.srkhost.description": {
"message": "You can enable Geyser on the version changer page. Geyser will run on the given port by the host."
},
"providers.provider.virtual_gladiators.description": {
"message": "Find the plugin in the control panel under the 'VG Recommended' category and restart your server. IP and port are the same as Java."
},
"providers.provider.wisehosting.description": {
"message": "Both auto and manual installation available. Find the GeyserMC presets from the `Addons` tab in the Game Panel. There, click `Install` and restart your server. See [Crossplay FAQ](https://wisehosting.com/help/how-to-install-geysermc-to-your-minecraft-server) for additional details."
},
"providers.provider.zaphosting.description": {
"message": "Find the plugin in the control panel and restart your server. IP and port are the same as Java."
},
"providers.provider.365hosts.description": {
"message": "Go to their [Minecraft: Crossplay](https://www.365hosts.com/gaming/crossplayminecraft) hosting section and order your server. Instructions on how to join are provided."
},
"providers.provider.aquatis.description": {
"message": "Need to open a support ticket to get a UDP port, then use that as the `bedrock port`."
},
"providers.provider.bisecthosting.description": {
"message": "Go to the Network tab and copy an available port not in use by other mods. In Geyser's config, under the bedrock section, on the port: line, edit the value to the port you copied. See Bisect's [article](https://www.bisecthosting.com/clients/index.php?rp=/knowledgebase/193/How-to-install-Geyser-and-Floodgate-on-a-Minecraft-Java-server.html) for full instructions. If you still cannot connect after following these instructions, contact Bisect Support, as they reportedly have UDP disabled on some nodes."
},
"providers.provider.bloomhost.description": {
"message": "See [Bloom's documentation](https://docs.bloom.host/multiplatform/geysermc) for setup instructions."
},
"providers.provider.craft-hosting.description": {
"message": "Set the Bedrock port to the Java server's port and connect with that port; note that this provider appears to only provide service in Russia."
},
"providers.provider.dedicatedmc.description": {
"message": "Check [DedicatedMC's documentation](https://docs.dedicatedmc.io/plugins-mods/how-to-install-geysermc/) for specific instructions."
},
"providers.provider.elfidc.description": {
"message": "When placing an order, choose Paper/Spigot + Geyser, which will automatically install the Geyser plugin. Connect with the Java server's IP and port. Note: This provider only provides service in China."
},
"providers.provider.fadehost.description": {
"message": "Set the Bedrock port to the Java server's port and connect with that port. Alternatively, buy a dedicated IP address to support a different port."
},
"providers.provider.fakaheda.description": {
"message": "Set the `bedrock port` in the config to the Java server's port or use one of the available ports allocated to your server, and connect with that port."
},
"providers.provider.falixnodes.description": {
"message": "Enable `clone-remote-port` (or manually set `bedrock port` to the Java port), and connect with the Java IP and port."
},
"providers.provider.ferox_hosting.description": {
"message": "Open a port yourself in their panel and check out the [knowledgebase article](https://feroxhosting.nl/kb/) for how to install and configure Geyser."
},
"providers.provider.fusion_hosting.description": {
"message": "Get Geyser as a plugin. Use the same port as your Java server for the Bedrock port in your config (either by setting it yourself, or enabling “clone-remote-port”) and connect with the same IP and port as you would on Java or create a port in the Network tab on the panel & use this for Geyser."
},
"providers.provider.gportal.description": {
"message": "You have to adjust the port according to your query port. Scheme: Query port: xxx65. The ports from xxx66 to xxx70 are available. For example, if your query port is 12365, then Geyser can only run under the port range 12366-12370. Furthermore, you have to change the 'Bedrock' 'address' in the Geyser config to your IP address. You can find it above your query port. Don't forget to delete the # in front of `address'."
},
"providers.provider.heavynode.description": {
"message": "Open a port yourself in the networking section of the control panel. Port `19132` is only available with a dedicated IP (contact support), otherwise you will need to use a randomly assigned port. To resolve further connection issues for servers located in Canada and the UK, contact their support with the info found [here](https://wiki.geysermc.org/geyser/port-forwarding/#ovh-and-soyoustart)."
},
"providers.provider.hicoria.description": {
"message": "Use one of the available ports allocated for your server for the Bedrock port in your config and connect with that port."
},
"providers.provider.hosterfy.description": {
"message": "Use the same port as your Java server for the Bedrock port in your config (either by setting it yourself, or enabling `clone-remote-port`) and connect with the same IP and port as you would on Java. You can also ask for a new port."
},
"providers.provider.hostez.description": {
"message": "Geyser plugin supported with self-install or installed on request with its own port."
},
"providers.provider.hosting-minecraft.description": {
"message": "Create a new port and use that port in the config. If you have a plan from the 'Boost' category, you will need to open a [support ticket](https://my.hosting-minecraft.pro/submitticket.php) to get a port with UDP protocol enabled."
},
"providers.provider.humbleservers.description": {
"message": "Set the Bedrock port to the Java server's port, or to one of the two extra ports, and connect with that port. If the subdomain doesn't work, use your regular numbered IP address."
},
"providers.provider.kaashosting.description": {
"message": "Automatic and manual installation supported. Go to the `Plugin Installer` tab, search for Geyser and click `Install Automatically`. Connect with the Java IP and port. See [KaasHosting's article](https://www.kaashosting.nl/help/nl/minecraft/hoe-maak-ik-mijn-minecraft-server-crossplay-met-geysermc) for more details."
},
"providers.provider.kekshost.description": {
"message": "Use the default bedrock port (19132) and the server ip to connect on Bedrock edition. No changes to the Geyser config are needed. You can also ask for a new port and use it instead."
},
"providers.provider.kinetic_hosting.description": {
"message": "Open a port in the Network and Ports page, and set that port as the `bedrock port` in the Geyser config. Alternatively, use the Java server's port by enabling the `clone-remote-port` option in the config. Connect with the same IP as on Java, and the port that you have chosen. For more info see the hosts [support article](https://www.kinetichosting.net/articles/minecraft-java/plugins/geyser)."
},
"providers.provider.mcpehost.ru.description": {
"message": "Create an additional port in the server settings and enable UDP protocol, then use that as the `bedrock port` in the config. Connect with the Java IP and that new port."
},
"providers.provider.meloncube.description": {
"message": "Contact the support for a UDP port to use for Geyser. Set that port as the `bedrock port`, and connect with it."
},
"providers.provider.netbela.description": {
"message": "Install Geyser with the dedicated Plugin installer. Use the same port as your Java server in your config. Connect with the same address and port as your Java server."
},
"providers.provider.nfoservers.description": {
"message": "Set `bedrock address` to the server IP in the Geyser config file. As an alternative, you can run Geyser standalone separately on an Unmanaged VDS."
},
"providers.provider.nitrado.description": {
"message": "Get Geyser as a plugin. Add 4 to the Port of the Java server. See [here](https://wiki.nitrado.net/en/How_to_install_GeyserMC_and_Floodgate) for specific instructions."
},
"providers.provider.nodecraft.description": {
"message": "Use the default server port and `0.0.0.0` or your server IP as the host address."
},
"providers.provider.nolimithost.description": {
"message": "Check [NolimitHost's documentation](https://nolimithost.cc/docs/minecraft/geyser) for specific instructions."
},
"providers.provider.pebblehost.description": {
"message": "Enable `clone-remote-port` (or manually set `bedrock port` to the Java port), and connect with the Java IP and port. See [this video](https://youtu.be/v9lC80UBZF4) for a PebbleHost-specific tutorial."
},
"providers.provider.pubcs.description": {
"message": "Set the Bedrock port to the Java server's port and connect with that port, or upgrade to a plan that includes dedicated IP address to support a different port."
},
"providers.provider.revivenode.description": {
"message": "Set `bedrock port` to the Java server's port (either by setting it yourself, or enabling `clone-remote-port`). You can also create a secondary port in the `network tab` and use that. To fix random `Unable to Connect` issues, see [here](https://wiki.geysermc.org/geyser/port-forwarding/#ovh-and-soyoustart)."
},
"providers.provider.shockbyte.description": {
"message": "The port will be automatically set after you download Geyser and restart the server. Connect with the same IP and port as on Java. For Geyser Standalone installation instructions, see [here](https://shockbyte.com/billing/knowledgebase/173/Introduction-to-GeyserMCorDragonProxy-How-GeyserMC-Works.html)."
},
"providers.provider.skynode.pro.description": {
"message": "Go to 'Server Details', add a new port, and set the `bedrock port` in your config to that port. Connect with it and the Java server's address."
},
"providers.provider.stipe.description": {
"message": "Set the Bedrock port to the Java server's port and connect with that port; note that this provider only provides service in Australia."
},
"providers.provider.syntexhosting.description": {
"message": "Set the Bedrock port to the Java server's port and connect with that port, or request a (free) additional port."
},
"providers.provider.the_minecraft hosting.description": {
"message": "Try using `19132` as the Bedrock port, if that does not work, use the same Java server's port for the `bedrock port` in your config and connect with that port and the Java server's IP."
},
"providers.provider.volthosting.description": {
"message": "Enable clone-remote-port (or manually set bedrock port to the Java port), and connect with the Java IP and port. Alternatively, request an additional port, or buy a dedicated IP address. If you continue to have issues, please [contact VoltHosting support](https://volthosting.co.uk/contact.html) for further assistance."
},
"providers.provider.vultam.description": {
"message": "Set the `bedrock port` to the Java server's port, or request an additional port. The additional port can be `19132` if you buy a dedicated IP."
},
"providers.provider.winternode.description": {
"message": "Set the Bedrock port to the Java server's port and connect with that port. Alternatively, request an additional port, or buy a dedicated IP address."
},
"providers.provider.witherhosting.description": {
"message": "Either use the Java server's port, or create a port in the ports manager on the panel and use that for Bedrock. Refer to the hosts [support article](https://my.witherhosting.com/kb/how-to-install-and-use-geysermc-java) for further info."
},
"providers.provider.myarena.description": {
"message": "Does seem to be working, but the Java version is too old in order for Geyser to run properly."
},
"providers.provider.nicraft.description": {
"message": "Does not provide Bedrock support, and are affected by a [firewall configuration issue](https://wiki.geysermc.org/geyser/port-forwarding/#ovh-and-soyoustart), which prohibits most players from joining."
},
"providers.provider.dawn.description": {
"message": "Their proxy network does not support UDP. Therefore, Geyser is not supported. As an alternative, set up a paper server with e.g. playit.gg instead of port forwarding."
},
"providers.provider.freemcserver_net.description": {
"message": "Install Geyser from the Plugins tab, then connect to your server using your Java IP and port."
},
"providers.provider.ultraservers.description": {
"message": "Select 'Paper + Geyser' under the Change version tab. You can connect to your server using the same IP and port as you would on Java. Existing servers can use the Plugins/Minecraft mods tab to install Geyser. See [Crossplay](https://docs.ultraservers.com/minecraft/plugins-mods/crossplay-on-java-and-bedrock) for more information."
},
"providers.provider.bedrockhost.description": {
"message": "Easiest solution is: Go to hosting panel > install new engine > Ready-made solutions and select Geyser. This will install Paper & Geyser-Spigot - no setup needed, just connect with your Java IP and port. See [BedrockHost's article](https://bedrockhost.pl/w/geyser-czyli-serwer-minecraft-java-i-bedrock-w-jednym) for more details or for custom setup instructions (available in Polish)."
},
"providers.provider.simplegamehosting.description": {
"message": "Contact live chat support to open a port and check out the [help center guide](https://help.simplegamehosting.com/how-to-enable-crossplay-with-geyser-on-your-minecraft-server/) for how to install and configure Geyser on your server."
},
"providers.provider.axenthost.description": {
"message": "For a quick installation, navigate to your server Variants tab and select GeyserMC. The server will be automatically reinstalled with Geyser-Spigot alongside a Paper server. For a manual install using any other variant such as Paper, you will need to upload the GeyserMC jar to your server and set the the clone-remote-port option to true. See AxentHost's [guide](https://axenthost.com/knowledgebase/categories/minecraft/create-a-crossplay-server-with-geyser/) to see all the steps."
},
"pages.main.title": {
"message": "Revolutionize Your Minecraft Server"
},
@@ -267,14 +33,11 @@
"message": "Hybrid mode plugin to allow for connections from Geyser to join online mode servers."
},
"pages.download.description.geyserconnect": {
"message": "A plugin to allow for Geyser players to connect to your server without needing to use a proxy."
"message": "A Geyser extension allowing players to connect to different Java or Geyser servers."
},
"pages.download.description.thirdpartycosmetics": {
"message": "An extension that adds support for loading ears and other third party cosmetics on java players"
},
"pages.download.description.emoteoffhand": {
"message": "An extension that allows Bedrock players to switch their offhand and mainhand item by emoting."
},
"pages.dumpviewer.title": {
"message": "Dump Viewer"
},
@@ -775,20 +538,6 @@
"message": "Tags",
"description": "The title of the tag list page"
},
"theme.unlistedContent.title": {
"message": "Unlisted page",
"description": "The unlisted content banner title"
},
"theme.unlistedContent.message": {
"message": "This page is unlisted. Search engines will not index it, and only users having a direct link can access it.",
"description": "The unlisted content banner message"
},
"providers.provider.not_listed.description": {
"message": "If your hosting provider is not listed, try enabling the `clone-remote-port` option in the config. Then, restart the server, and try connecting with the same IP and port as on Java Edition. <br> If this does not work, ask your server hosting provider for a UDP port, and use that. For VPS/KVM servers please follow the self-hosting steps."
},
"providers.provider.wasabihosting.description": {
"message": "Install Geyser with the plugin installer. Use the same port as your Java server in the Geyser config. Connect with the same address and port as your Java server."
},
"pages.download.description.hurricane": {
"message": "A plugin with various workarounds for Geyser players that modify the server in order to achieve their goal."
},
@@ -824,29 +573,26 @@
"message": "This page is a draft. It will only be visible in dev and be excluded from the production build.",
"description": "The draft content banner message"
},
"providers.provider.arth_hosting.description": {
"message": "Geyser is installed and configured on all servers by default. You can disable it in the 'Manage Plugins' menu."
"mdx.setup.host_provider": {
"message": "Host Provider"
},
"providers.provider.mcserverhost.description": {
"message": "Under the server configuration, select 'Crossplay' to automatically install Geyser and Floodgate. Join with the connection address. To update Geyser and Floodgate, replace the plugin jars in the server manager and restart the server."
"mdx.setup.self_host": {
"message": "Self Host"
},
"providers.provider.vemox_hosting.description": {
"message": "Full automatic installation. Go to one of the panel options and select the option to enable GeyserMC. Then, restart and connect to your server using your Java IP and port."
"mdx.setup.paper_spigot": {
"message": "Paper / Spigot"
},
"providers.provider.mcforfree.de.description": {
"message": "Create an extra port in the game panel, then change the `port` in the `bedrock` section to the newly created port. To connect on Bedrock edition, use the Java server's IP and the port you've created. It may take a few minutes for the port to become active."
"mdx.setup.modded_servers": {
"message": "Modded Servers"
},
"providers.provider.modrinth.description": {
"message": "Check [Modrinth's documentation](https://support.modrinth.com/en/articles/10986613-adding-geyser-to-your-server) for specific instructions."
"mdx.setup.proxy_servers": {
"message": "Proxy Servers"
},
"providers.provider.orionnodes.description": {
"message": "Open a port yourself from the network page in the game panel, use that port in the bedrock section of the Geyser config."
"mdx.setup.viaproxy": {
"message": "ViaProxy"
},
"providers.provider.papernodes.description": {
"message": "Enable clone-remote-port (or manually set the Bedrock port to the Java port), and connect with the Java IP and port. Alternatively, you can contact the host to request an additional port or a dedicated IP."
},
"providers.provider.wepwawet.description": {
"message": "Add a new port in the Network tab. Use this new port as the bedrock port."
"mdx.setup.standalone": {
"message": "Standalone"
},
"pages.download.description.offhandextension": {
"message": "An extension that allows Bedrock players to switch their offhand and mainhand item by emoting."
@@ -868,5 +614,509 @@
},
"pages.dumpviewer.extensions.helptext": {
"message": "Click on an extension to view more information."
},
"mdx.setup.fabric": {
"message": "Fabric"
},
"mdx.setup.neoforge": {
"message": "NeoForge"
},
"mdx.setup.installing_geyser": {
"message": "Installing Geyser"
},
"mdx.setup.download_jar": {
"message": "Download {jarName}."
},
"mdx.setup.place_jar": {
"message": "Place the {jarName} in the {jarDirectory} folder."
},
"mdx.setup.restart_server": {
"message": "Restart the server."
},
"mdx.setup.additional_steps": {
"message": "Additional Steps"
},
"mdx.setup.connecting_on_bedrock": {
"message": "Connecting on Bedrock"
},
"providers.config.templates.java_address": {
"message": "Set `address` in the `bedrock` section to the public address of the Java server."
},
"providers.config.templates.custom_port_dedicated_ip": {
"message": "This host may only give out a separate port with a dedicated IP address."
},
"providers.warnings.ovh_firewall_misconfig": {
"message": "To fix random `Unable to Connect` issues, see [here](/wiki/geyser/port-forwarding/#ovh-and-soyoustart)."
},
"providers.config.templates.install_location.plugin_list": {
"message": "Install Geyser through the plugin or mod list provided by the host."
},
"providers.config.templates.install_location.enable_bedrock_crossplay": {
"message": "Select the 'Enable Bedrock crossplay?' option when changing your server software to automatically install and configure Geyser and Floodgate."
},
"providers.config.templates.info.geyser_installed_by_default": {
"message": "Geyser is installed and configured on all servers by default."
},
"providers.provider.apex_hosting.install": {
"message": "Go to the Customizations tab in the panel and select 'Enabled' under the 'Geyser Auto Installer' option."
},
"providers.provider.aternos.info": {
"message": "Aternos automatically installs the latest version of Geyser and Floodgate, but does not auto update it. To update, reinstall the plugin (no need to uninstall Geyser/deleting the plugin files)."
},
"providers.provider.creeperhost.install": {
"message": "Enable Geyser in the control panel."
},
"providers.provider.cubes_hosting.info": {
"message": "Geyser-Standalone can be set up through a support ticket."
},
"providers.provider.minefort.additional_step": {
"message": "Go to the server dashboard under 'Connect Support', and enable the 'Allow Bedrock' option."
},
"providers.provider.minefort.connect_instructions": {
"message": "Connect via `play.minefort.com` and join using `/server [servername]`, or connect directly via `[servername].minefort.com`."
},
"providers.provider.minehut.connect_instructions": {
"message": "Connect via `bedrock.minehut.com` and do `/join [servername]`, or connect directly via `[servername].bedrock.minehut.gg`."
},
"providers.provider.omgserv.install": {
"message": "Select Geyser in the Install Menu to install it automatically. You can enable Floodgate in the server properties on the dashboard."
},
"providers.provider.config.other": {
"message": "If you did not order the server from the [cross-platform servers page](https://piglinhost.com/minecraft-java-hosting.html), contact the support for help with Geyser setup."
},
"providers.provider.srkhost.enable": {
"message": "Enable Geyser on the version changer page."
},
"providers.provider.wisehosting.install": {
"message": "Install the GeyserMC preset from the `Addons` tab in the Game Panel, then restart your server."
},
"providers.provider.elfidc.custom": {
"message": "When placing an order, choose Paper/Spigot + Geyser, which will automatically install the Geyser plugin."
},
"providers.provider.hostez.config.other": {
"message": "Different ports can be set in the Allocations tab. Premium products with a dedicated IP can use the default port (19132)."
},
"providers.provider.nfoservers.info": {
"message": "You can also run Geyser-Standalone separately on an Unmanaged VDS."
},
"mdx.setup.checking_server_version": {
"message": "Checking your server version"
},
"mdx.setup.restart_geyser": {
"message": "Restart Geyser."
},
"mdx.setup.https_note": {
"message": "Unless signaling runs over {https}, Minecraft asks players whether they trust the server the first time they join."
},
"mdx.setup.configuring_geyser": {
"message": "Configuring Geyser"
},
"mdx.setup.open_config_simple": {
"message": "Now open the file {configLocation}. Find the part that starts with {bedrock}, and change the lines shown below."
},
"mdx.setup.preconfigured": {
"message": "No changes needed. {name} automatically configures Geyser."
},
"mdx.setup.transport_nethernet_simple": {
"message": "NetherNet is supported fully by 26.50+. If you'd like to also have working MOTD and player count for older versions, you will need to set up both NetherNet and Raknet."
},
"mdx.setup.transport_both_compat": {
"message": "Also accepts RakNet, for additional compatibility: some Bedrock versions, such as 26.40, fetch the server's MOTD and player count over RakNet. This option needs a separate UDP port for NetherNet."
},
"mdx.setup.placeholder_word": {
"message": "Replace this"
},
"mdx.setup.replace_with_simple": {
"message": "With this"
},
"mdx.setup.placeholder_java_port": {
"message": "The port of the Java server."
},
"mdx.setup.placeholder_java_port_udp": {
"message": "A UDP port for NetherNet, other than {port}. This can be the Java server's port: the Java server only uses it over TCP, so Geyser can use it over UDP. Any other available UDP port works too."
},
"mdx.setup.placeholder_second_available_port": {
"message": "An available UDP port for NetherNet, other than {port}. Open it for UDP."
},
"mdx.setup.raknet_on_port": {
"message": "RakNet uses {port} over UDP, so that port has to be open for UDP as well."
},
"mdx.setup.summary.nethernet_reported_generic": {
"message": "Reported to work with NetherNet"
},
"mdx.setup.summary.supporter_configures": {
"message": "{name} configures Geyser for you automatically, including NetherNet."
},
"mdx.setup.summary.updated": {
"message": "Instructions last updated on {date}"
},
"mdx.setup.badge.gold": {
"message": "Gold supporter"
},
"mdx.setup.badge.silver": {
"message": "Silver supporter"
},
"mdx.setup.badge.bronze": {
"message": "Bronze supporter"
},
"mdx.setup.unconfirmed_title": {
"message": "Not checked for NetherNet yet"
},
"mdx.setup.warning_title": {
"message": "Warning"
},
"mdx.setup.unconfirmed_reach_out_update": {
"message": "These instructions have not been checked for NetherNet yet. If Bedrock players can't join, reach out to {name} to get instructions on how to use Geyser, and let us know on {discord} so we can update this guide."
},
"mdx.setup.try_not_listed": {
"message": "If your host cannot give you a separate port, follow the {notListed} instead. Players then join through {warden}, an external signaling service."
},
"mdx.setup.try_not_listed.link": {
"message": "\"Not listed\" guide for using only the Java server's port"
},
"mdx.setup.no_signaling": {
"message": "{name} supports neither built-in nor external signaling, so Bedrock players cannot connect over NetherNet."
},
"mdx.setup.hosting_provider_article_short": {
"message": "Host's Geyser guide"
},
"mdx.setup.hosting_provider_website_short": {
"message": "Website"
},
"mdx.setup.hosting_provider_support_short": {
"message": "Support"
},
"mdx.setup.hosting_provider_discord_short": {
"message": "Discord"
},
"providers.provider.not_listed.allocate_port": {
"message": "Allocate a port in your server panel, open for both TCP and UDP."
},
"providers.provider.not_listed.info": {
"message": "For VPS/KVM servers, please follow the self-hosting steps."
},
"mdx.setup.not_listed.tab_allocated": {
"message": "I can allocate ports"
},
"mdx.setup.not_listed.tab_java_only": {
"message": "I only have the Java server port"
},
"providers.provider.not_listed.java_only_connect": {
"message": "Players do not connect with the Java server's address. After Geyser starts, it shows the address and port to use in the console, provided by the external signaling service ({warden} by default). Share these with your players."
},
"components.provider.open_collaboration_group": {
"message": "Hosts that support Geyser's development"
},
"components.provider.other_group": {
"message": "Other providers"
},
"mdx.setup.connect.port_java": {
"message": "Your Java server's port"
},
"mdx.setup.connect.port_config_step": {
"message": "The port you set in \"Configuring Geyser\""
},
"mdx.setup.connect.intro": {
"message": "In Minecraft: Bedrock Edition, go to Play, then Servers, and select Add Server. Fill it in like this:"
},
"mdx.setup.connect.add_server": {
"message": "Add Server"
},
"mdx.setup.connect.server_name": {
"message": "Server Name"
},
"mdx.setup.connect.server_name_value": {
"message": "Anything you like"
},
"mdx.setup.connect.server_address": {
"message": "Server Address"
},
"mdx.setup.connect.server_address_value": {
"message": "Your Java server's address"
},
"mdx.setup.connect.port": {
"message": "Port"
},
"mdx.setup.transport_nethernet_tab": {
"message": "NetherNet"
},
"mdx.setup.transport_both_tab": {
"message": "NetherNet and RakNet"
},
"providers.ports.assign": {
"message": "Assign a port in your host's panel, open for both TCP and UDP."
},
"providers.ports.allocated": {
"message": "Pick an available port from the ports allocated to your server, open for both TCP and UDP."
},
"providers.ports.ask_host": {
"message": "Ask your host for a port that is open for both TCP and UDP."
},
"providers.provider.bisecthosting.warn": {
"message": "If you cannot connect after following these instructions, contact Bisect Support, as they reportedly have UDP disabled on some nodes."
},
"providers.provider.cloud_nord.description": {
"message": "Servers from the [Crossplay Server](https://cloudnord.net/minecraftcrossplay-server-hosting/) hosting section do not need further configuration."
},
"providers.provider.gportal.description": {
"message": "Pick a port based on your query port. Scheme: Query port: xxx65. The ports from xxx66 to xxx70 are available. For example, if your query port is 12365, then Geyser can only run under the port range 12366-12370."
},
"providers.provider.hostez.config.port": {
"message": "Add 1 to the port you were assigned (e.g. 25565 -> 25566)."
},
"providers.provider.nicraft.description": {
"message": "Nicraft does not provide Bedrock support, and is affected by a [firewall configuration issue](/wiki/geyser/port-forwarding/#ovh-and-soyoustart), which prohibits most players from joining."
},
"providers.provider.nitrado.config.port": {
"message": "Add 4 to the port of the Java server."
},
"providers.provider.vemox_hosting.install": {
"message": "Open the panel options and select the option to enable GeyserMC."
},
"pages.hosting.tier.gold": {
"message": "Gold supporters"
},
"pages.hosting.tier.silver": {
"message": "Silver supporters"
},
"pages.hosting.tier.bronze": {
"message": "Bronze supporters"
},
"pages.hosting.card.website": {
"message": "Website"
},
"pages.hosting.card.setup": {
"message": "Setup guide"
},
"pages.hosting.title": {
"message": "Hosting Providers"
},
"pages.hosting.subheading": {
"message": "Hosting providers that support the development of Geyser."
},
"pages.hosting.intro": {
"message": "The hosts below support Geyser and related projects through {openCollaboration}. Their support helps fund work on Geyser, such as keeping up with major changes to Bedrock Edition, like the switch to NetherNet. All hosts listed below also configure Geyser automatically when installed, making using Geyser easier than ever. We'd like to thank them all for their support."
},
"pages.hosting.empty": {
"message": "No hosting providers are listed yet."
},
"pages.hosting.other.title": {
"message": "Using another host?"
},
"pages.hosting.other.text": {
"message": "Hosts not being listed here does not mean Geyser won't run there. The {setupGuide} includes community collected notes for many other hosts, and general instructions for those not listed."
},
"pages.hosting.other.setup_guide": {
"message": "setup guide"
},
"pages.hosting.meta.title": {
"message": "Hosting Providers"
},
"pages.hosting.meta.description": {
"message": "Hosting providers that support the development of Geyser through Open Collaboration."
},
"pages.download.description.floodgatedatabases": {
"message": "Database extension jars for Floodgate local linking."
},
"providers.ports.from_host": {
"message": "The Bedrock port your host shows you."
},
"providers.config.templates.info.only_serves_region": {
"message": "This host only provides service in {region}."
},
"providers.provider.axenthost.install": {
"message": "Select GeyserMC in the Variants tab. This reinstalls the server with Paper and Geyser."
},
"providers.provider.bedrockhost.install": {
"message": "In the hosting panel, go to install new engine > Ready-made solutions and select Geyser. This installs Paper and Geyser."
},
"providers.provider.consulhosting.install": {
"message": "Install GeyserMC from the Software section of your server panel."
},
"providers.provider.cubes_hosting.port": {
"message": "The port shown in the server console."
},
"providers.provider.mcserverhost.install": {
"message": "In the Software tab of the server panel, turn on 'Bedrock crossplay' and restart the server."
},
"providers.provider.minehost.install": {
"message": "In the Software tab of the server panel, turn on 'Minecraft Bedrock support' and restart the server."
},
"providers.provider.myarena.description": {
"message": "Does seem to be working, but the Java version is too old in order for Geyser to run properly."
},
"providers.provider.ultraservers.install": {
"message": "Select 'Paper + Geyser' in the Change version tab. On existing servers, install Geyser from the Plugins/Minecraft mods tab instead."
},
"providers.provider.server.pro.config.plans": {
"message": "Only PRO and VPS plans can open additional ports, in the Firewall tab. On other plans, follow the \"Not listed\" guide for using only the Java server's port."
},
"mdx.setup.velocity": {
"message": "Velocity"
},
"mdx.setup.bungeecord": {
"message": "BungeeCord"
},
"providers.ports.new_port": {
"message": "Open a new port in your server panel, open for both TCP and UDP, or ask your host for one if the panel has no option for it."
},
"mdx.setup.supported_versions": {
"message": "Supported versions"
},
"mdx.setup.restart_velocity": {
"message": "Restart Velocity."
},
"mdx.setup.restart_bungeecord": {
"message": "Restart BungeeCord."
},
"mdx.setup.restart_viaproxy": {
"message": "Restart ViaProxy."
},
"mdx.setup.fabric_dependency": {
"message": "If it is not installed already, download {fabricApi} and place it in the same folder."
},
"mdx.setup.version_step_viaversion": {
"message": "If your server is not running {version}, you will need to install {viaVersion}. For more information, see {supportedVersions}."
},
"mdx.setup.version_step_proxy": {
"message": "All servers on the network must accept {version} Java clients, as Geyser imitates one."
},
"mdx.setup.proxy_install_only": {
"message": "Install Geyser only on the {proxy} server! You can install Floodgate on all servers for better skin support and network-wide Floodgate API availability for other plugins."
},
"mdx.setup.modded_requirements": {
"message": "{jarName} runs only on a {version} server, and only works alongside server-side mods. Mods that players also need to install on their client will not work. See {supportedVersions} for more details."
},
"mdx.setup.self_port_choice": {
"message": "Since you are self-hosting, you can choose the port freely; the default is 19132. Geyser uses it over both TCP and UDP, so it cannot be the port of the {platform} server."
},
"mdx.setup.self_port_choice_standalone": {
"message": "Since you are self-hosting, you can choose the port freely; the default is 19132. Geyser uses it over both TCP and UDP."
},
"mdx.setup.self_port_sharing": {
"message": "{important}: No other program can use the Geyser port, over either protocol. This includes programs that use UDP, such as voice chat mods or Query, and programs that use TCP, such as another server, a web map, or a website."
},
"mdx.setup.self_port_sharing.important": {
"message": "Important"
},
"mdx.setup.connect_local_title": {
"message": "Connecting from the same network"
},
"mdx.setup.connect_local": {
"message": "On the same device as the server, connect with {localhost} or {loopback} as the address. Other devices in the same local network can use your local IPv4 address, which starts with {ten} or {oneNineTwo}."
},
"mdx.setup.connect_lan": {
"message": "Alternatively, open Minecraft: Bedrock Edition and join the LAN server in the {friends} tab."
},
"mdx.setup.connect_lan.friends": {
"message": "Friends"
},
"mdx.setup.connect_remote_title": {
"message": "Connecting from a different network"
},
"mdx.setup.connect_remote": {
"message": "To let players from outside your network join, you need to make the Geyser port reachable from the internet."
},
"mdx.setup.connect_tcp_udp": {
"message": "The Geyser port has to be forwarded for both TCP and UDP. Before NetherNet, forwarding UDP was enough. Now, players use TCP to find your server and UDP to play on it, so without TCP your server will not show up. If you use the \"NetherNet and RakNet\" option, also forward the {webrtcPort} for UDP."
},
"mdx.setup.connect_options": {
"message": "You have two options:"
},
"mdx.setup.connect_port_forwarding": {
"message": "{portForwarding}: open the Geyser port (e.g. 19132) for both TCP and UDP in your router and in your firewall. Players then connect with your public IPv4 address and the port. For detailed steps, see {guide}."
},
"mdx.setup.connect_port_forwarding.title": {
"message": "Port forwarding"
},
"mdx.setup.connect_port_forwarding.guide": {
"message": "Port forwarding"
},
"mdx.setup.connect_playit": {
"message": "{playit}: if you cannot open a port, or do not want to expose your home IP address, playit.gg can create a tunnel for you. See {guide}. That guide was written for RakNet. For NetherNet, see {status}. Ngrok does not work, since it does not support UDP."
},
"mdx.setup.connect_playit.guide": {
"message": "playit.gg Setup"
},
"mdx.setup.connect_playit.status": {
"message": "NetherNet support on playit.gg"
},
"mdx.setup.https_step_title": {
"message": "Recommended: Set up HTTPS for signaling"
},
"mdx.setup.https_step": {
"message": "Geyser's built-in signaling server uses plain HTTP by default, so Minecraft shows players a \"Trust on First Use?\" prompt the first time they join. To avoid this prompt, serve signaling over HTTPS, as explained in {httpsGuide}. Some external signaling services, such as {warden}, provide HTTPS as well."
},
"mdx.setup.https_step.guide": {
"message": "HTTPS for NetherNet"
},
"mdx.setup.floodgate_info": {
"message": "To allow Bedrock Edition players to join your server without a paid Java Edition account, you can use {floodgate}."
},
"mdx.setup.viaproxy_not_plugin.title": {
"message": "ViaProxy is not a plugin or mod"
},
"mdx.setup.viaproxy_not_plugin": {
"message": "ViaProxy is a standalone program that runs separately from your Minecraft server. Do not put the ViaProxy jar into your server's {plugins} or {mods} folder. To run Geyser as a plugin or mod on your server instead, pick your server software in the tabs above."
},
"mdx.setup.viaproxy_setup": {
"message": "Set up {viaProxy}."
},
"mdx.setup.viaproxy_accounts": {
"message": "If you use the ViaProxy GUI, you can use its account management to join online mode servers with Bedrock Edition. If you use the ViaProxy CLI and want Bedrock players to join your online mode server, install and set up {floodgate}."
},
"mdx.setup.viaproxy_auth_type": {
"message": "ViaProxy manages the {authType} setting itself, so its value in the config is ignored."
},
"mdx.setup.standalone_java": {
"message": "You need Java 21 or newer to run Geyser. To run Geyser Standalone on Android, see the end of this page."
},
"mdx.setup.standalone_not_plugin": {
"message": "Geyser Standalone is not a plugin or mod. It is a separate Java program that runs alongside your Java Edition server."
},
"mdx.setup.standalone_download": {
"message": "Download {standalone}."
},
"mdx.setup.standalone_folder": {
"message": "Create a new folder for Geyser, and put the jar in it."
},
"mdx.setup.standalone_start": {
"message": "Start Geyser Standalone:"
},
"mdx.setup.standalone_gui": {
"message": "{gui} (recommended): double-click the jar file. Geyser creates all the files it needs."
},
"mdx.setup.standalone_console": {
"message": "{console}: create a startup script, like the one you would use for a Paper server. See {startupScript} for what to put into it. Run it, and Geyser creates all the files it needs."
},
"mdx.setup.standalone_console.console": {
"message": "Console"
},
"mdx.setup.standalone_console.startup_script": {
"message": "Creating a Startup Script"
},
"mdx.setup.standalone_remote_intro": {
"message": "To choose which Java Edition server Geyser Standalone sends players to, find the {java} section:"
},
"mdx.setup.standalone_remote": {
"message": "Change {address} to the Java server's address, or leave it as it is if the server runs on the same machine as Geyser. Then change {port} to the Java server's port. Set {authType} to {floodgate} if you set up Floodgate on the Java server, otherwise to {online} for an online mode server or {offline} for an offline mode server. To use Floodgate with Geyser Standalone, see {floodgateSetup}."
},
"mdx.setup.standalone_remote.floodgate_setup": {
"message": "Floodgate Setup"
},
"mdx.setup.standalone_android_title": {
"message": "Running Geyser Standalone on Android"
},
"mdx.setup.standalone_android_caution": {
"message": "Apps such as Termux can run Geyser on Android, but how well this works depends on how powerful your device is. Do so at your own risk."
},
"mdx.setup.standalone_termux_install": {
"message": "Download and install {termux}."
},
"mdx.setup.run_command": {
"message": "Run {command}."
},
"mdx.setup.standalone_termux_script": {
"message": "Alternatively, there is an automated setup script for clean Termux installs. It might not work for everyone, so try it if the steps above do not work:"
}
}
@@ -183,8 +183,12 @@
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Custom Resource Packs": {
"message": "Custom Resource Packs",
"description": "The label for category Custom Resource Packs in sidebar geyserSidebar"
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -42,5 +42,9 @@
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "Setup",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "Common Issues",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "Configuring Geyser",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "FAQ",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,83 @@
---
title: Commands and Permissions
description: Commands and their associated permission nodes for Geyser.
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# Commands and Permissions
Geyser features many built-in commands that can be used by players or server owners.
:::info
When using BungeeCord and Velocity, you will need to use a permission plugin such as [LuckPerms](https://luckperms.net/)
on the proxy server to assign permissions to players. Assigning permissions on the backend servers will not work.
:::
## Geyser commands & their permissions {#geyser-commands--their-permissions}
| Command | Permission | Description |
| :-----------------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| `geyser` <br/> Geyser root command | `geyser.command` | The permission required to see/run any Geyser commands. |
| `geyser help` <br/> `geyser ?` | `geyser.command.help` | Shows help for all registered commands. |
| `geyser advancements` | `geyser.command.advancements` | Open the Java advancements menu. |
| `geyser dump` | `geyser.command.dump` | Dumps Geyser debug information for bug reports. |
| `geyser list` | `geyser.command.list` | List all players connected through Geyser. |
| `geyser nethernet` | `geyser.command.nethernet` | Shows NetherNet signaling status and diagnostics, for use with external signaling. |
| `geyser offhand` | `geyser.command.offhand` | Puts an item in your offhand. |
| `geyser reload` | `geyser.command.reload` | Reloads the Geyser configurations. Kicks all players when used! |
| `geyser settings` | `geyser.command.settings` | Opens a settings menu allowing you to modify aspects of the world. |
| `geyser shutdown` <br/> `geyser stop` | `geyser.command.shutdown` | Shuts down Geyser.<br/>*This command only works on Standalone.* |
| `geyser statistics` | `geyser.command.statistics` | Open the Java statistics menu. |
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
## Permissions for Geyser extensions {#extension-permissions}
For the following, `<id>` refers to the extensions' id.
| Command | Permission | Description |
| :------------------------- | :---------------------------- | :------------------------------------------------------------------------ |
| `<id> help` <br/> `<id> ?` | `geyser.command.exthelp.<id>` | Shows help for all commands registered by this extension. |
## Other Permissions {#other-permissions}
Besides commands, there are other permissions that are used to guard specific Geyser features.
| Permission | Description |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | Allow players to use the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.settings.gamerules` | Defines whether a user can alter gamerules in the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.update` | Whether this player will receive Geyser update notifications upon joining. |
## Permissions when using Geyser-Standalone/Geyser-ViaProxy {#standalone-viaproxy-permissions}
Geyser-ViaProxy and Geyser-Standalone feature their own basic permission handler. To edit base permissions,
open the `permissions.yml` file and add or remove permissions that Geyser players should receive when joining.
See the file for more information.
You can further customize permission handling by creating a [Geyser extension](/wiki/geyser/extensions/) that makes use of Geysers API
to deal with permission checking.
## Permissions when using Geyser on platforms without permission handlers {#permissions-platforms-no-permission-handlers}
The following affects Geyser-BungeeCord, Geyser-Velocity, and Geyser-Fabric.
These platforms unfortunately do not have built-in permission handlers. Because of that, you will need to grant permissions on those platforms
manually using permission handlers, such as [LuckPerms](https://luckperms.net/). Geyser's permission are listed above. For extension permissions, consult their documentation.
Alternatively, you can use [LuckLink](https://github.com/onebeastchris/LuckLink), a third-party Geyser extension, to automatically register permissions using [LuckPerms](https://luckperms.net/).
- Install [LuckPerms](https://luckperms.net/) on the platform where you've installed Geyser (BungeeCord/Velocity/Fabric).
- To allow Geyser to automatically register permission defaults, install the [LuckLink](https://github.com/onebeastchris/LuckLink) Geyser extension
by downloading the `LuckLink.jar` and adding it to Geyser's `extensions` folder.
- Restart the server, and permissions should be automatically registered.
## Floodgate commands and permissions {#floodgate-commands-and-permissions}
For Floodgate commands, see [here](/wiki/floodgate/commands/).
@@ -0,0 +1,62 @@
---
title: playit.gg Setup
description: How to set up playit.gg to use Geyser without port forwarding.
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## Prerequisites {#prerequisites}
:::info
You must be able to connect to your Geyser instance locally!
:::
:::warning
The playit.gg Minecraft server plugin does not support UDP tunnels. You will need to use the program agent instead!
:::
:::caution
This guide was written for RakNet, and does not cover NetherNet. For NetherNet, see [playit.gg's progress on NetherNet support](https://status.playit.gg/3/adding-nethernet-support).
:::
## Setup {#setup}
1. Head over to [playit.gg's website](https://playit.gg/) - download the program & run it.
2. The program will provide a claiming link. Visit that link, log in.
![img](/img/wiki/playit-gg/playit_claim.png)
3. Confirm your agent.
![img](/img/wiki/playit-gg/playit_claim_confirm.png)
4. Add the agent.
![img](/img/wiki/playit-gg/playit_add_agent.png)
5. After the agent is created, create a tunnel.
![img](/img/wiki/playit-gg/playit_add_tunnel.png)
6. Name your tunnel and click Next.
![img](/img/wiki/playit-gg/playit_name_tunnel.png)
7. Select "Minecraft Bedrock" as the tunnel type and click Next.
![img](/img/wiki/playit-gg/playit_tunnel_type.png)
8. Select the Free Network and click Next.
![img](/img/wiki/playit-gg/playit_select_network.png)
**Do not change your Geyser port in `config.yml` unless you have a reason (for example, hosting another Geyser server on the same machine).** The Bedrock (Geyser) port in `config.yml` and the playit.gg ports are separate. playit.gg will forward its port to the default Geyser port and should work as-is. Changing it can cause errors. If you have changed your config port, set the Bedrock port back to the default `19132` and ensure `clone-remote-port` is `false`.
9. If the playit.gg agent and Geyser are running on the same device, leave the IP as `127.0.0.1` and set the port to whatever you configured in Geyser's config.
![img](/img/wiki/playit-gg/playit_set_ipandport.png)
10. Select `proxy-protocol-v2` for the Proxy Protocol section and click Next.
11. In the Geyser config, under `advanced:` `bedrock:`, set `use-haproxy-protocol` to `true`.
12. Click Create Tunnel and wait for the tunnel to be created.
![img](/img/wiki/playit-gg/playit_create_tunnel.png)
13. Copy your tunnel's port. For example, if your tunnel address is `visiting-phone.gl.at.ply.gg:6695`, then `6695` is the tunnel port.
14. In the Geyser config under `advanced:` `bedrock:`, set `broadcast-port` to your tunnel port (`6695` in the example).
15. Save your config. Start your Minecraft server and connect using your tunnel's IP and port.
16. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
## Troubleshooting {#troubleshooting}
### I can't connect to my server! {#i-cant-connect-to-my-server}
- *Try going to the Agents page, set your agent to IPv4 only, and change the region. You may need to switch regions a few times before you can connect.*
- *Are there errors in your minecraft server console?*
- *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
- *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 8.*
- *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
- *Make sure that you have the program agent open while trying to join.*
- *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
@@ -0,0 +1,208 @@
---
title: Port forwarding
description: Information on how to set up port forwarding required for Geyser.
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# Port forwarding {#port-forwarding}
This page contains information on how to set up port forwarding required for Geyser to work when self-hosting.
There are also guides for specific configurations, such as Docker/Pterodactyl, or on specific VPS/KVM providers, such as OVH or Oracle Cloud.
:::caution
If you are using a Minecraft server hosting provider (e.g. Aternos, or Nodecraft), you should refer to the hosting provider setup on the [setup](/wiki/geyser/setup) page instead.
:::
:::info Ports that need to be opened
With NetherNet, the Geyser port (by default 19132) has to be open for **both TCP and UDP**: players find the server over TCP (signaling), and play on it over UDP.
If you use the "NetherNet and RakNet" option, also open the `webrtc-port` for UDP.
With external signaling, such as [Warden](https://warden.cloud), only UDP for WebRTC is needed.
:::
## Port forwarding on Linux/Windows/macOS {#port-forwarding-on-linuxwindowsmacos}
To allow others to play on your server, you will need to set up port forwarding on the device hosting Geyser.
Additionally, you will need to port forward the port on your router/modem (in other words, allow and route traffic on that port to the proper machine) if you want the server to be accessible outside your own home network.
Forward it for both TCP and UDP; many routers offer a "TCP/UDP" or "Both" option for this.
See [here](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/) or [here](https://www.lifewire.com/how-to-port-forward-4163829) for helpful guides.
Do note: if you do not have a static IP address, your IP address may change over time.
:::info
Some ISPs (Internet Service Providers) block certain ports, or don't allow you to open ports (e.g. by using CGNAT, which doesn't allow you to open a port with a dynamic IP).
Other ISPs may require you to pay extra for a static IP address.
As an alternative to port forwarding, you can use [playit.gg](/wiki/geyser/playit-gg/) to create a tunnel.
:::
### Windows {#windows}
To open a port on Windows, you will need to open the port through the Windows Firewall. There are multiple ways to do this:
- `Powershell` (recommended)
To open a port on TCP and UDP (in our example, port 19132), run the following commands in an administrator Powershell:
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
Running these commands creates two rules that allow TCP and UDP traffic on port 19132.
- Windows Defender Firewall with Advanced Security (GUI)
1. Search for "Windows Defender Firewall with Advanced Security" in the start menu, and open it. ([Image](/img/wiki/port-forwarding/windows-1.png))
2. Click on "Inbound Rules" in the left sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
3. Click on "New Rule..." in the right sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
4. Select "Port" as the rule type and click "Next". ([Example](/img/wiki/port-forwarding/windows-3.png))
5. Select "UDP" and "Specific local ports", and enter the port you want to open (in our example, 19132). Click "Next". ([Example](/img/wiki/port-forwarding/windows-4.png))
6. Select "Allow the connection" and click "Next". ([Example](/img/wiki/port-forwarding/windows-5.png))
7. Select the profiles you want to apply the rule to (e.g. "Domain", "Private", "Public"), and click "Next". ([Example](/img/wiki/port-forwarding/windows-6.png))
8. Enter a name for the rule (e.g. "Geyser (UDP)"), and click "Finish". ([Image](/img/wiki/port-forwarding/windows-7.png))
9. Repeat these steps, selecting "TCP" in step 5 and naming the rule e.g. "Geyser (TCP)".
### Linux {#linux}
Different Linux distributions, even different VPS providers ship and configure different firewalls. In the following examples, we will use `19132` as the port to open, but you should replace this with the port you are using for Geyser.
- `ufw` is a simple firewall front-end for iptables that is commonly used on Ubuntu and Debian. To open a port on TCP and UDP, run the following commands:
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
Then, reload the firewall with `sudo ufw reload`, and see all open rules with `sudo ufw status`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server), [Baeldung](https://www.baeldung.com/linux/uncomplicated-firewall)
- `firewalld` Add a port on TCP and UDP by running:
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
Then, reload the firewall with `sudo firewall-cmd --reload`, and see all open rules with `sudo firewall-cmd --list-all`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)
- `iptables` is a common firewall that is used on many Linux distributions. To open a port on TCP and UDP, run the following commands:
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
Then, save the firewall with `sudo iptables-save`, and see all open rules with `sudo iptables -L`.
Further helpful guides for iptables: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04), [Ubuntu](https://help.ubuntu.com/community/IptablesHowTo)
### macOS {#macos}
You will need to disable `Block all incoming connections` in your Firewall settings, as that will block any connections and won't allow you to make exceptions.
To allow incoming connections, click `Allow` when getting [these prompts](/img/wiki/port-forwarding/macos_warning.png).
If you are still facing issues, see Apple's official guide [here](https://support.apple.com/guide/mac-help/MH11783) to open a port on macOS.
## Using Docker or Pterodactyl {#using-docker-or-pterodactyl}
In addition to port forwarding the port in your server's firewall (and, if applicable, your router/modem), you will need to assign the port in Docker/Pterodactyl.
### Pterodactyl {#pterodactyl}
Make sure to allocate the port(s) to the server in the Pterodactyl panel's `Network` tab, additionally to port forwarding the port(s).
See [here](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel) for more information.
![Pterodactyl panel, Network section](/img/wiki/port-forwarding/pterodactyl-1.png)
There are also different Geyser eggs for Pterodactyl, which can be found [here](https://github.com/GeyserMC/pterodactyl-stuff).
:::caution
If you are not able to allocate ports in the Pterodactyl panel, you will need to contact your server host to allocate one for you or try to use an existing port allocation.
:::
### Docker {#docker}
For Geyser to work under Docker (e.g. using [Itzg's Docker image](https://github.com/itzg/docker-minecraft-server)), you will need to add the Geyser port on TCP and UDP to the docker-compose file. This is done by adding the following to the `ports` section:
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
Without a suffix, Docker exposes the port on TCP. The additional `/udp` suffix exposes it on UDP.
Alternatively, add the ports with the `-p 19132:19132 -p 19132:19132/udp` flags to the docker run command.
## Issues with specific VPS/KVM providers {#issues-with-specific-vpskvm-providers}
Some providers, such as OVH, Oracle Cloud, and SoYouStart, have a firewall that blocks the ports Geyser needs by default/in most cases.
### OVH and SoYouStart {#ovh-and-soyoustart}
OVH's GAME firewall filters traffic with rules made for specific games. The Minecraft Bedrock and Minecraft Pocket Edition rules currently only support RakNet, the protocol Bedrock used before NetherNet.
With NetherNet, players find the server over HTTP (TCP) and play over WebRTC (UDP), which these rules currently do not support.
For now, use the `Other` rule for the Geyser port(s) instead.
:::caution
If you do not have access to these firewall settings, but got linked to this page, please contact your server host and provide them with this link - they are likely using OVH internally.
:::
**To resolve it:**
OVH:
1. Navigate to `Network interfaces`
2. Click on the `...` button on the table for your IP -> then `...` and `Configure the GAME firewall` -> `Add rule` -> `Other protocol`
3. Add your Geyser port into `outgoing port`. If you use the "NetherNet and RakNet" option, add a rule for the `webrtc-port` as well.
4. If you use OVH's Edge Network Firewall, make sure it allows the Geyser port over both TCP and UDP.
SoYouStart (subsidiary of OVH):
1. Click the IP tab.
2. Click the gear at the right of the public IP address; select "Game mitigation".
3. Pick "Add a rule".
4. Select "Other" in the dropdown list and enter the Geyser port. If you use the "NetherNet and RakNet" option, add the `webrtc-port` as well.
5. Save and wait a few seconds for the changes to come into effect.
### Oracle Cloud/OCI {#oracle-cloudoci}
By default, Oracle Cloud will block all incoming traffic except for SSH and RDP. This must be resolved within Oracle Cloud itself and the Compute Instance running Geyser.
The steps below assume that you are using the default ports for the Java server and Geyser, and should be adjusted accordingly.
1. Find your Compute Instance in the OCI Console
2. Click on the instances Virtual Cloud Network (this will be under "Instance details")
3. On the left-hand side, select "Security Lists"
4. Select one of the security lists. By default only one security list will exist. It doesn't matter which security list we add the rules to.
5. Select "Add Ingress Rules"
6. Configure rules for Java (optional)
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `25565-25565`
- Select "Another Ingress Rule"
7. Configure rules for Geyser, once for TCP and once for UDP
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `19132-19132`
- Set "IP Protocol" to TCP
- Select "Another Ingress Rule", and repeat with "IP Protocol" set to UDP
8. Select "Add Ingress Rules"
#### Oracle Linux {#oracle-linux}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### Ubuntu {#ubuntu}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,47 @@
---
title: Supported versions
description: Information on the versions Geyser supports.
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# Currently supported versions \ {#currently-supported-versions}
:::info
**Geyser currently supports Minecraft Bedrock <Versions.bedrock /> and Minecraft Java <Versions.java />**.
:::
## Using Geyser with older Minecraft: Bedrock edition versions \ {#using-geyser-with-older-minecraft-bedrock-edition-versions}
Older Bedrock versions are not supported. Minecraft: Bedrock Edition updates automatically on all platforms, so there are few users who would
want to use older versions. Further, older Bedrock versions do not have all features which Geyser support, which would lead to a sub-par experience.
## Using Geyser on older Minecraft: Java edition servers \ {#using-geyser-on-older-minecraft-java-edition-servers}
Geyser emulates a <Versions.java /> client, so a Java server must accept users using that version in order for Geyser to work.
This is possible thanks to [ViaVersion](https://viaversion.com/viaversion), which allows Java edition players with newer versions to join servers
that run older versions of the game.
### Using Geyser-Spigot on a Spigot/Paper server running on 1.20.5 or above
You can use Geyser-Spigot on servers that run on 1.20.5 or above. You will also need to run at least Java 21 or later to use Geyser. See [here](https://docs.papermc.io/misc/java-install) for more info on updating Java. Paper versions not supporting Java 21 can add `-DPaper.IgnoreJavaVersion=true` flag to the Java startup arguments to allow Paper to run on Java 21.
In order for Bedrock players to chat (1.19.3+) or join (1.19.1/1.19.2), you need to disable chat signing. More information about that can be read on the [chat signing page](/wiki/geyser/secure-chat).
### Using Geyser-Spigot on a Spigot/Paper server running on a version below 1.20.5
This is unfortunately not possible. You'll need to use a proxy such as Velocity or BungeeCord, or set up Geyser-Standalone separately with the [ViaVersion](https://viaversion.com/viaversion) plugin. Another alternative would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it.
### Using Geyser on Fabric/NeoForge servers not on the latest Minecraft version \ {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
Unfortunately, Geyser-Fabric and Geyser-NeoForge only support the latest version of Minecraft: Java edition. The recommended way to still use
Geyser with older versions would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it. This will also work with Floodgate auth.
### Using Geyser-Velocity or Geyser-BungeeCord on a proxy
Make sure you update your proxy software to the latest available version, and, if the backend servers are not on <Versions.java />, also install the [ViaVersion](https://viaversion.com/viaversion) plugin on the backend servers. Velocity/BungeeCord support most Minecraft versions, so you can update them regardless of the backend server versions.
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "Wiki",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "Downloads",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "REST APIs",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "Other",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "Blog",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "Donate",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "Global Linking",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "Privacy Policy",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "Copyright © 2026 GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "Wiki",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "Blog",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "Utilities",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "Download",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "REST APIs",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "Other",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "Setup",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "Common Issues",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "Configuring Geyser",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "FAQ",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,83 @@
---
title: Commands and Permissions
description: Commands and their associated permission nodes for Geyser.
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# Commands and Permissions
Geyser features many built-in commands that can be used by players or server owners.
:::info
When using BungeeCord and Velocity, you will need to use a permission plugin such as [LuckPerms](https://luckperms.net/)
on the proxy server to assign permissions to players. Assigning permissions on the backend servers will not work.
:::
## Geyser commands & their permissions {#geyser-commands--their-permissions}
| Command | Permission | Description |
| :-----------------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| `geyser` <br/> Geyser root command | `geyser.command` | The permission required to see/run any Geyser commands. |
| `geyser help` <br/> `geyser ?` | `geyser.command.help` | Shows help for all registered commands. |
| `geyser advancements` | `geyser.command.advancements` | Open the Java advancements menu. |
| `geyser dump` | `geyser.command.dump` | Dumps Geyser debug information for bug reports. |
| `geyser list` | `geyser.command.list` | List all players connected through Geyser. |
| `geyser nethernet` | `geyser.command.nethernet` | Shows NetherNet signaling status and diagnostics, for use with external signaling. |
| `geyser offhand` | `geyser.command.offhand` | Puts an item in your offhand. |
| `geyser reload` | `geyser.command.reload` | Reloads the Geyser configurations. Kicks all players when used! |
| `geyser settings` | `geyser.command.settings` | Opens a settings menu allowing you to modify aspects of the world. |
| `geyser shutdown` <br/> `geyser stop` | `geyser.command.shutdown` | Shuts down Geyser.<br/>*This command only works on Standalone.* |
| `geyser statistics` | `geyser.command.statistics` | Open the Java statistics menu. |
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
## Permissions for Geyser extensions {#extension-permissions}
For the following, `<id>` refers to the extensions' id.
| Command | Permission | Description |
| :------------------------- | :---------------------------- | :------------------------------------------------------------------------ |
| `<id> help` <br/> `<id> ?` | `geyser.command.exthelp.<id>` | Shows help for all commands registered by this extension. |
## Other Permissions {#other-permissions}
Besides commands, there are other permissions that are used to guard specific Geyser features.
| Permission | Description |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | Allow players to use the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.settings.gamerules` | Defines whether a user can alter gamerules in the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.update` | Whether this player will receive Geyser update notifications upon joining. |
## Permissions when using Geyser-Standalone/Geyser-ViaProxy {#standalone-viaproxy-permissions}
Geyser-ViaProxy and Geyser-Standalone feature their own basic permission handler. To edit base permissions,
open the `permissions.yml` file and add or remove permissions that Geyser players should receive when joining.
See the file for more information.
You can further customize permission handling by creating a [Geyser extension](/wiki/geyser/extensions/) that makes use of Geysers API
to deal with permission checking.
## Permissions when using Geyser on platforms without permission handlers {#permissions-platforms-no-permission-handlers}
The following affects Geyser-BungeeCord, Geyser-Velocity, and Geyser-Fabric.
These platforms unfortunately do not have built-in permission handlers. Because of that, you will need to grant permissions on those platforms
manually using permission handlers, such as [LuckPerms](https://luckperms.net/). Geyser's permission are listed above. For extension permissions, consult their documentation.
Alternatively, you can use [LuckLink](https://github.com/onebeastchris/LuckLink), a third-party Geyser extension, to automatically register permissions using [LuckPerms](https://luckperms.net/).
- Install [LuckPerms](https://luckperms.net/) on the platform where you've installed Geyser (BungeeCord/Velocity/Fabric).
- To allow Geyser to automatically register permission defaults, install the [LuckLink](https://github.com/onebeastchris/LuckLink) Geyser extension
by downloading the `LuckLink.jar` and adding it to Geyser's `extensions` folder.
- Restart the server, and permissions should be automatically registered.
## Floodgate commands and permissions {#floodgate-commands-and-permissions}
For Floodgate commands, see [here](/wiki/floodgate/commands/).
@@ -0,0 +1,62 @@
---
title: playit.gg Setup
description: How to set up playit.gg to use Geyser without port forwarding.
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## Prerequisites {#prerequisites}
:::info
You must be able to connect to your Geyser instance locally!
:::
:::warning
The playit.gg Minecraft server plugin does not support UDP tunnels. You will need to use the program agent instead!
:::
:::caution
This guide was written for RakNet, and does not cover NetherNet. For NetherNet, see [playit.gg's progress on NetherNet support](https://status.playit.gg/3/adding-nethernet-support).
:::
## Setup {#setup}
1. Head over to [playit.gg's website](https://playit.gg/) - download the program & run it.
2. The program will provide a claiming link. Visit that link, log in.
![img](/img/wiki/playit-gg/playit_claim.png)
3. Confirm your agent.
![img](/img/wiki/playit-gg/playit_claim_confirm.png)
4. Add the agent.
![img](/img/wiki/playit-gg/playit_add_agent.png)
5. After the agent is created, create a tunnel.
![img](/img/wiki/playit-gg/playit_add_tunnel.png)
6. Name your tunnel and click Next.
![img](/img/wiki/playit-gg/playit_name_tunnel.png)
7. Select "Minecraft Bedrock" as the tunnel type and click Next.
![img](/img/wiki/playit-gg/playit_tunnel_type.png)
8. Select the Free Network and click Next.
![img](/img/wiki/playit-gg/playit_select_network.png)
**Do not change your Geyser port in `config.yml` unless you have a reason (for example, hosting another Geyser server on the same machine).** The Bedrock (Geyser) port in `config.yml` and the playit.gg ports are separate. playit.gg will forward its port to the default Geyser port and should work as-is. Changing it can cause errors. If you have changed your config port, set the Bedrock port back to the default `19132` and ensure `clone-remote-port` is `false`.
9. If the playit.gg agent and Geyser are running on the same device, leave the IP as `127.0.0.1` and set the port to whatever you configured in Geyser's config.
![img](/img/wiki/playit-gg/playit_set_ipandport.png)
10. Select `proxy-protocol-v2` for the Proxy Protocol section and click Next.
11. In the Geyser config, under `advanced:` `bedrock:`, set `use-haproxy-protocol` to `true`.
12. Click Create Tunnel and wait for the tunnel to be created.
![img](/img/wiki/playit-gg/playit_create_tunnel.png)
13. Copy your tunnel's port. For example, if your tunnel address is `visiting-phone.gl.at.ply.gg:6695`, then `6695` is the tunnel port.
14. In the Geyser config under `advanced:` `bedrock:`, set `broadcast-port` to your tunnel port (`6695` in the example).
15. Save your config. Start your Minecraft server and connect using your tunnel's IP and port.
16. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
## Troubleshooting {#troubleshooting}
### I can't connect to my server! {#i-cant-connect-to-my-server}
- *Try going to the Agents page, set your agent to IPv4 only, and change the region. You may need to switch regions a few times before you can connect.*
- *Are there errors in your minecraft server console?*
- *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
- *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 8.*
- *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
- *Make sure that you have the program agent open while trying to join.*
- *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
@@ -0,0 +1,208 @@
---
title: Port forwarding
description: Information on how to set up port forwarding required for Geyser.
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# Port forwarding {#port-forwarding}
This page contains information on how to set up port forwarding required for Geyser to work when self-hosting.
There are also guides for specific configurations, such as Docker/Pterodactyl, or on specific VPS/KVM providers, such as OVH or Oracle Cloud.
:::caution
If you are using a Minecraft server hosting provider (e.g. Aternos, or Nodecraft), you should refer to the hosting provider setup on the [setup](/wiki/geyser/setup) page instead.
:::
:::info Ports that need to be opened
With NetherNet, the Geyser port (by default 19132) has to be open for **both TCP and UDP**: players find the server over TCP (signaling), and play on it over UDP.
If you use the "NetherNet and RakNet" option, also open the `webrtc-port` for UDP.
With external signaling, such as [Warden](https://warden.cloud), only UDP for WebRTC is needed.
:::
## Port forwarding on Linux/Windows/macOS {#port-forwarding-on-linuxwindowsmacos}
To allow others to play on your server, you will need to set up port forwarding on the device hosting Geyser.
Additionally, you will need to port forward the port on your router/modem (in other words, allow and route traffic on that port to the proper machine) if you want the server to be accessible outside your own home network.
Forward it for both TCP and UDP; many routers offer a "TCP/UDP" or "Both" option for this.
See [here](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/) or [here](https://www.lifewire.com/how-to-port-forward-4163829) for helpful guides.
Do note: if you do not have a static IP address, your IP address may change over time.
:::info
Some ISPs (Internet Service Providers) block certain ports, or don't allow you to open ports (e.g. by using CGNAT, which doesn't allow you to open a port with a dynamic IP).
Other ISPs may require you to pay extra for a static IP address.
As an alternative to port forwarding, you can use [playit.gg](/wiki/geyser/playit-gg/) to create a tunnel.
:::
### Windows {#windows}
To open a port on Windows, you will need to open the port through the Windows Firewall. There are multiple ways to do this:
- `Powershell` (recommended)
To open a port on TCP and UDP (in our example, port 19132), run the following commands in an administrator Powershell:
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
Running these commands creates two rules that allow TCP and UDP traffic on port 19132.
- Windows Defender Firewall with Advanced Security (GUI)
1. Search for "Windows Defender Firewall with Advanced Security" in the start menu, and open it. ([Image](/img/wiki/port-forwarding/windows-1.png))
2. Click on "Inbound Rules" in the left sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
3. Click on "New Rule..." in the right sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
4. Select "Port" as the rule type and click "Next". ([Example](/img/wiki/port-forwarding/windows-3.png))
5. Select "UDP" and "Specific local ports", and enter the port you want to open (in our example, 19132). Click "Next". ([Example](/img/wiki/port-forwarding/windows-4.png))
6. Select "Allow the connection" and click "Next". ([Example](/img/wiki/port-forwarding/windows-5.png))
7. Select the profiles you want to apply the rule to (e.g. "Domain", "Private", "Public"), and click "Next". ([Example](/img/wiki/port-forwarding/windows-6.png))
8. Enter a name for the rule (e.g. "Geyser (UDP)"), and click "Finish". ([Image](/img/wiki/port-forwarding/windows-7.png))
9. Repeat these steps, selecting "TCP" in step 5 and naming the rule e.g. "Geyser (TCP)".
### Linux {#linux}
Different Linux distributions, even different VPS providers ship and configure different firewalls. In the following examples, we will use `19132` as the port to open, but you should replace this with the port you are using for Geyser.
- `ufw` is a simple firewall front-end for iptables that is commonly used on Ubuntu and Debian. To open a port on TCP and UDP, run the following commands:
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
Then, reload the firewall with `sudo ufw reload`, and see all open rules with `sudo ufw status`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server), [Baeldung](https://www.baeldung.com/linux/uncomplicated-firewall)
- `firewalld` Add a port on TCP and UDP by running:
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
Then, reload the firewall with `sudo firewall-cmd --reload`, and see all open rules with `sudo firewall-cmd --list-all`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)
- `iptables` is a common firewall that is used on many Linux distributions. To open a port on TCP and UDP, run the following commands:
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
Then, save the firewall with `sudo iptables-save`, and see all open rules with `sudo iptables -L`.
Further helpful guides for iptables: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04), [Ubuntu](https://help.ubuntu.com/community/IptablesHowTo)
### macOS {#macos}
You will need to disable `Block all incoming connections` in your Firewall settings, as that will block any connections and won't allow you to make exceptions.
To allow incoming connections, click `Allow` when getting [these prompts](/img/wiki/port-forwarding/macos_warning.png).
If you are still facing issues, see Apple's official guide [here](https://support.apple.com/guide/mac-help/MH11783) to open a port on macOS.
## Using Docker or Pterodactyl {#using-docker-or-pterodactyl}
In addition to port forwarding the port in your server's firewall (and, if applicable, your router/modem), you will need to assign the port in Docker/Pterodactyl.
### Pterodactyl {#pterodactyl}
Make sure to allocate the port(s) to the server in the Pterodactyl panel's `Network` tab, additionally to port forwarding the port(s).
See [here](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel) for more information.
![Pterodactyl panel, Network section](/img/wiki/port-forwarding/pterodactyl-1.png)
There are also different Geyser eggs for Pterodactyl, which can be found [here](https://github.com/GeyserMC/pterodactyl-stuff).
:::caution
If you are not able to allocate ports in the Pterodactyl panel, you will need to contact your server host to allocate one for you or try to use an existing port allocation.
:::
### Docker {#docker}
For Geyser to work under Docker (e.g. using [Itzg's Docker image](https://github.com/itzg/docker-minecraft-server)), you will need to add the Geyser port on TCP and UDP to the docker-compose file. This is done by adding the following to the `ports` section:
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
Without a suffix, Docker exposes the port on TCP. The additional `/udp` suffix exposes it on UDP.
Alternatively, add the ports with the `-p 19132:19132 -p 19132:19132/udp` flags to the docker run command.
## Issues with specific VPS/KVM providers {#issues-with-specific-vpskvm-providers}
Some providers, such as OVH, Oracle Cloud, and SoYouStart, have a firewall that blocks the ports Geyser needs by default/in most cases.
### OVH and SoYouStart {#ovh-and-soyoustart}
OVH's GAME firewall filters traffic with rules made for specific games. The Minecraft Bedrock and Minecraft Pocket Edition rules currently only support RakNet, the protocol Bedrock used before NetherNet.
With NetherNet, players find the server over HTTP (TCP) and play over WebRTC (UDP), which these rules currently do not support.
For now, use the `Other` rule for the Geyser port(s) instead.
:::caution
If you do not have access to these firewall settings, but got linked to this page, please contact your server host and provide them with this link - they are likely using OVH internally.
:::
**To resolve it:**
OVH:
1. Navigate to `Network interfaces`
2. Click on the `...` button on the table for your IP -> then `...` and `Configure the GAME firewall` -> `Add rule` -> `Other protocol`
3. Add your Geyser port into `outgoing port`. If you use the "NetherNet and RakNet" option, add a rule for the `webrtc-port` as well.
4. If you use OVH's Edge Network Firewall, make sure it allows the Geyser port over both TCP and UDP.
SoYouStart (subsidiary of OVH):
1. Click the IP tab.
2. Click the gear at the right of the public IP address; select "Game mitigation".
3. Pick "Add a rule".
4. Select "Other" in the dropdown list and enter the Geyser port. If you use the "NetherNet and RakNet" option, add the `webrtc-port` as well.
5. Save and wait a few seconds for the changes to come into effect.
### Oracle Cloud/OCI {#oracle-cloudoci}
By default, Oracle Cloud will block all incoming traffic except for SSH and RDP. This must be resolved within Oracle Cloud itself and the Compute Instance running Geyser.
The steps below assume that you are using the default ports for the Java server and Geyser, and should be adjusted accordingly.
1. Find your Compute Instance in the OCI Console
2. Click on the instances Virtual Cloud Network (this will be under "Instance details")
3. On the left-hand side, select "Security Lists"
4. Select one of the security lists. By default only one security list will exist. It doesn't matter which security list we add the rules to.
5. Select "Add Ingress Rules"
6. Configure rules for Java (optional)
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `25565-25565`
- Select "Another Ingress Rule"
7. Configure rules for Geyser, once for TCP and once for UDP
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `19132-19132`
- Set "IP Protocol" to TCP
- Select "Another Ingress Rule", and repeat with "IP Protocol" set to UDP
8. Select "Add Ingress Rules"
#### Oracle Linux {#oracle-linux}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### Ubuntu {#ubuntu}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,47 @@
---
title: Supported versions
description: Information on the versions Geyser supports.
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# Currently supported versions \ {#currently-supported-versions}
:::info
**Geyser currently supports Minecraft Bedrock <Versions.bedrock /> and Minecraft Java <Versions.java />**.
:::
## Using Geyser with older Minecraft: Bedrock edition versions \ {#using-geyser-with-older-minecraft-bedrock-edition-versions}
Older Bedrock versions are not supported. Minecraft: Bedrock Edition updates automatically on all platforms, so there are few users who would
want to use older versions. Further, older Bedrock versions do not have all features which Geyser support, which would lead to a sub-par experience.
## Using Geyser on older Minecraft: Java edition servers \ {#using-geyser-on-older-minecraft-java-edition-servers}
Geyser emulates a <Versions.java /> client, so a Java server must accept users using that version in order for Geyser to work.
This is possible thanks to [ViaVersion](https://viaversion.com/viaversion), which allows Java edition players with newer versions to join servers
that run older versions of the game.
### Using Geyser-Spigot on a Spigot/Paper server running on 1.20.5 or above
You can use Geyser-Spigot on servers that run on 1.20.5 or above. You will also need to run at least Java 21 or later to use Geyser. See [here](https://docs.papermc.io/misc/java-install) for more info on updating Java. Paper versions not supporting Java 21 can add `-DPaper.IgnoreJavaVersion=true` flag to the Java startup arguments to allow Paper to run on Java 21.
In order for Bedrock players to chat (1.19.3+) or join (1.19.1/1.19.2), you need to disable chat signing. More information about that can be read on the [chat signing page](/wiki/geyser/secure-chat).
### Using Geyser-Spigot on a Spigot/Paper server running on a version below 1.20.5
This is unfortunately not possible. You'll need to use a proxy such as Velocity or BungeeCord, or set up Geyser-Standalone separately with the [ViaVersion](https://viaversion.com/viaversion) plugin. Another alternative would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it.
### Using Geyser on Fabric/NeoForge servers not on the latest Minecraft version \ {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
Unfortunately, Geyser-Fabric and Geyser-NeoForge only support the latest version of Minecraft: Java edition. The recommended way to still use
Geyser with older versions would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it. This will also work with Floodgate auth.
### Using Geyser-Velocity or Geyser-BungeeCord on a proxy
Make sure you update your proxy software to the latest available version, and, if the backend servers are not on <Versions.java />, also install the [ViaVersion](https://viaversion.com/viaversion) plugin on the backend servers. Velocity/BungeeCord support most Minecraft versions, so you can update them regardless of the backend server versions.
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "Wiki",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "Downloads",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "REST APIs",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "Other",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "Blog",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "Donate",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "Global Linking",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "Privacy Policy",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "Copyright © 2026 GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "Wiki",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "Blog",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "Utilities",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "Download",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "REST APIs",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "Other",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "Setup",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "Common Issues",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "Configuring Geyser",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "FAQ",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,83 @@
---
title: Commands and Permissions
description: Commands and their associated permission nodes for Geyser.
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# Commands and Permissions
Geyser features many built-in commands that can be used by players or server owners.
:::info
When using BungeeCord and Velocity, you will need to use a permission plugin such as [LuckPerms](https://luckperms.net/)
on the proxy server to assign permissions to players. Assigning permissions on the backend servers will not work.
:::
## Geyser commands & their permissions {#geyser-commands--their-permissions}
| Command | Permission | Description |
| :-----------------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| `geyser` <br/> Geyser root command | `geyser.command` | The permission required to see/run any Geyser commands. |
| `geyser help` <br/> `geyser ?` | `geyser.command.help` | Shows help for all registered commands. |
| `geyser advancements` | `geyser.command.advancements` | Open the Java advancements menu. |
| `geyser dump` | `geyser.command.dump` | Dumps Geyser debug information for bug reports. |
| `geyser list` | `geyser.command.list` | List all players connected through Geyser. |
| `geyser nethernet` | `geyser.command.nethernet` | Shows NetherNet signaling status and diagnostics, for use with external signaling. |
| `geyser offhand` | `geyser.command.offhand` | Puts an item in your offhand. |
| `geyser reload` | `geyser.command.reload` | Reloads the Geyser configurations. Kicks all players when used! |
| `geyser settings` | `geyser.command.settings` | Opens a settings menu allowing you to modify aspects of the world. |
| `geyser shutdown` <br/> `geyser stop` | `geyser.command.shutdown` | Shuts down Geyser.<br/>*This command only works on Standalone.* |
| `geyser statistics` | `geyser.command.statistics` | Open the Java statistics menu. |
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
## Permissions for Geyser extensions {#extension-permissions}
For the following, `<id>` refers to the extensions' id.
| Command | Permission | Description |
| :------------------------- | :---------------------------- | :------------------------------------------------------------------------ |
| `<id> help` <br/> `<id> ?` | `geyser.command.exthelp.<id>` | Shows help for all commands registered by this extension. |
## Other Permissions {#other-permissions}
Besides commands, there are other permissions that are used to guard specific Geyser features.
| Permission | Description |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | Allow players to use the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.settings.gamerules` | Defines whether a user can alter gamerules in the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.update` | Whether this player will receive Geyser update notifications upon joining. |
## Permissions when using Geyser-Standalone/Geyser-ViaProxy {#standalone-viaproxy-permissions}
Geyser-ViaProxy and Geyser-Standalone feature their own basic permission handler. To edit base permissions,
open the `permissions.yml` file and add or remove permissions that Geyser players should receive when joining.
See the file for more information.
You can further customize permission handling by creating a [Geyser extension](/wiki/geyser/extensions/) that makes use of Geysers API
to deal with permission checking.
## Permissions when using Geyser on platforms without permission handlers {#permissions-platforms-no-permission-handlers}
The following affects Geyser-BungeeCord, Geyser-Velocity, and Geyser-Fabric.
These platforms unfortunately do not have built-in permission handlers. Because of that, you will need to grant permissions on those platforms
manually using permission handlers, such as [LuckPerms](https://luckperms.net/). Geyser's permission are listed above. For extension permissions, consult their documentation.
Alternatively, you can use [LuckLink](https://github.com/onebeastchris/LuckLink), a third-party Geyser extension, to automatically register permissions using [LuckPerms](https://luckperms.net/).
- Install [LuckPerms](https://luckperms.net/) on the platform where you've installed Geyser (BungeeCord/Velocity/Fabric).
- To allow Geyser to automatically register permission defaults, install the [LuckLink](https://github.com/onebeastchris/LuckLink) Geyser extension
by downloading the `LuckLink.jar` and adding it to Geyser's `extensions` folder.
- Restart the server, and permissions should be automatically registered.
## Floodgate commands and permissions {#floodgate-commands-and-permissions}
For Floodgate commands, see [here](/wiki/floodgate/commands/).
@@ -0,0 +1,62 @@
---
title: playit.gg Setup
description: How to set up playit.gg to use Geyser without port forwarding.
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## Prerequisites {#prerequisites}
:::info
You must be able to connect to your Geyser instance locally!
:::
:::warning
The playit.gg Minecraft server plugin does not support UDP tunnels. You will need to use the program agent instead!
:::
:::caution
This guide was written for RakNet, and does not cover NetherNet. For NetherNet, see [playit.gg's progress on NetherNet support](https://status.playit.gg/3/adding-nethernet-support).
:::
## Setup {#setup}
1. Head over to [playit.gg's website](https://playit.gg/) - download the program & run it.
2. The program will provide a claiming link. Visit that link, log in.
![img](/img/wiki/playit-gg/playit_claim.png)
3. Confirm your agent.
![img](/img/wiki/playit-gg/playit_claim_confirm.png)
4. Add the agent.
![img](/img/wiki/playit-gg/playit_add_agent.png)
5. After the agent is created, create a tunnel.
![img](/img/wiki/playit-gg/playit_add_tunnel.png)
6. Name your tunnel and click Next.
![img](/img/wiki/playit-gg/playit_name_tunnel.png)
7. Select "Minecraft Bedrock" as the tunnel type and click Next.
![img](/img/wiki/playit-gg/playit_tunnel_type.png)
8. Select the Free Network and click Next.
![img](/img/wiki/playit-gg/playit_select_network.png)
**Do not change your Geyser port in `config.yml` unless you have a reason (for example, hosting another Geyser server on the same machine).** The Bedrock (Geyser) port in `config.yml` and the playit.gg ports are separate. playit.gg will forward its port to the default Geyser port and should work as-is. Changing it can cause errors. If you have changed your config port, set the Bedrock port back to the default `19132` and ensure `clone-remote-port` is `false`.
9. If the playit.gg agent and Geyser are running on the same device, leave the IP as `127.0.0.1` and set the port to whatever you configured in Geyser's config.
![img](/img/wiki/playit-gg/playit_set_ipandport.png)
10. Select `proxy-protocol-v2` for the Proxy Protocol section and click Next.
11. In the Geyser config, under `advanced:` `bedrock:`, set `use-haproxy-protocol` to `true`.
12. Click Create Tunnel and wait for the tunnel to be created.
![img](/img/wiki/playit-gg/playit_create_tunnel.png)
13. Copy your tunnel's port. For example, if your tunnel address is `visiting-phone.gl.at.ply.gg:6695`, then `6695` is the tunnel port.
14. In the Geyser config under `advanced:` `bedrock:`, set `broadcast-port` to your tunnel port (`6695` in the example).
15. Save your config. Start your Minecraft server and connect using your tunnel's IP and port.
16. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
## Troubleshooting {#troubleshooting}
### I can't connect to my server! {#i-cant-connect-to-my-server}
- *Try going to the Agents page, set your agent to IPv4 only, and change the region. You may need to switch regions a few times before you can connect.*
- *Are there errors in your minecraft server console?*
- *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
- *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 8.*
- *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
- *Make sure that you have the program agent open while trying to join.*
- *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
@@ -0,0 +1,208 @@
---
title: Port forwarding
description: Information on how to set up port forwarding required for Geyser.
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# Port forwarding {#port-forwarding}
This page contains information on how to set up port forwarding required for Geyser to work when self-hosting.
There are also guides for specific configurations, such as Docker/Pterodactyl, or on specific VPS/KVM providers, such as OVH or Oracle Cloud.
:::caution
If you are using a Minecraft server hosting provider (e.g. Aternos, or Nodecraft), you should refer to the hosting provider setup on the [setup](/wiki/geyser/setup) page instead.
:::
:::info Ports that need to be opened
With NetherNet, the Geyser port (by default 19132) has to be open for **both TCP and UDP**: players find the server over TCP (signaling), and play on it over UDP.
If you use the "NetherNet and RakNet" option, also open the `webrtc-port` for UDP.
With external signaling, such as [Warden](https://warden.cloud), only UDP for WebRTC is needed.
:::
## Port forwarding on Linux/Windows/macOS {#port-forwarding-on-linuxwindowsmacos}
To allow others to play on your server, you will need to set up port forwarding on the device hosting Geyser.
Additionally, you will need to port forward the port on your router/modem (in other words, allow and route traffic on that port to the proper machine) if you want the server to be accessible outside your own home network.
Forward it for both TCP and UDP; many routers offer a "TCP/UDP" or "Both" option for this.
See [here](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/) or [here](https://www.lifewire.com/how-to-port-forward-4163829) for helpful guides.
Do note: if you do not have a static IP address, your IP address may change over time.
:::info
Some ISPs (Internet Service Providers) block certain ports, or don't allow you to open ports (e.g. by using CGNAT, which doesn't allow you to open a port with a dynamic IP).
Other ISPs may require you to pay extra for a static IP address.
As an alternative to port forwarding, you can use [playit.gg](/wiki/geyser/playit-gg/) to create a tunnel.
:::
### Windows {#windows}
To open a port on Windows, you will need to open the port through the Windows Firewall. There are multiple ways to do this:
- `Powershell` (recommended)
To open a port on TCP and UDP (in our example, port 19132), run the following commands in an administrator Powershell:
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
Running these commands creates two rules that allow TCP and UDP traffic on port 19132.
- Windows Defender Firewall with Advanced Security (GUI)
1. Search for "Windows Defender Firewall with Advanced Security" in the start menu, and open it. ([Image](/img/wiki/port-forwarding/windows-1.png))
2. Click on "Inbound Rules" in the left sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
3. Click on "New Rule..." in the right sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
4. Select "Port" as the rule type and click "Next". ([Example](/img/wiki/port-forwarding/windows-3.png))
5. Select "UDP" and "Specific local ports", and enter the port you want to open (in our example, 19132). Click "Next". ([Example](/img/wiki/port-forwarding/windows-4.png))
6. Select "Allow the connection" and click "Next". ([Example](/img/wiki/port-forwarding/windows-5.png))
7. Select the profiles you want to apply the rule to (e.g. "Domain", "Private", "Public"), and click "Next". ([Example](/img/wiki/port-forwarding/windows-6.png))
8. Enter a name for the rule (e.g. "Geyser (UDP)"), and click "Finish". ([Image](/img/wiki/port-forwarding/windows-7.png))
9. Repeat these steps, selecting "TCP" in step 5 and naming the rule e.g. "Geyser (TCP)".
### Linux {#linux}
Different Linux distributions, even different VPS providers ship and configure different firewalls. In the following examples, we will use `19132` as the port to open, but you should replace this with the port you are using for Geyser.
- `ufw` is a simple firewall front-end for iptables that is commonly used on Ubuntu and Debian. To open a port on TCP and UDP, run the following commands:
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
Then, reload the firewall with `sudo ufw reload`, and see all open rules with `sudo ufw status`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server), [Baeldung](https://www.baeldung.com/linux/uncomplicated-firewall)
- `firewalld` Add a port on TCP and UDP by running:
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
Then, reload the firewall with `sudo firewall-cmd --reload`, and see all open rules with `sudo firewall-cmd --list-all`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)
- `iptables` is a common firewall that is used on many Linux distributions. To open a port on TCP and UDP, run the following commands:
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
Then, save the firewall with `sudo iptables-save`, and see all open rules with `sudo iptables -L`.
Further helpful guides for iptables: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04), [Ubuntu](https://help.ubuntu.com/community/IptablesHowTo)
### macOS {#macos}
You will need to disable `Block all incoming connections` in your Firewall settings, as that will block any connections and won't allow you to make exceptions.
To allow incoming connections, click `Allow` when getting [these prompts](/img/wiki/port-forwarding/macos_warning.png).
If you are still facing issues, see Apple's official guide [here](https://support.apple.com/guide/mac-help/MH11783) to open a port on macOS.
## Using Docker or Pterodactyl {#using-docker-or-pterodactyl}
In addition to port forwarding the port in your server's firewall (and, if applicable, your router/modem), you will need to assign the port in Docker/Pterodactyl.
### Pterodactyl {#pterodactyl}
Make sure to allocate the port(s) to the server in the Pterodactyl panel's `Network` tab, additionally to port forwarding the port(s).
See [here](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel) for more information.
![Pterodactyl panel, Network section](/img/wiki/port-forwarding/pterodactyl-1.png)
There are also different Geyser eggs for Pterodactyl, which can be found [here](https://github.com/GeyserMC/pterodactyl-stuff).
:::caution
If you are not able to allocate ports in the Pterodactyl panel, you will need to contact your server host to allocate one for you or try to use an existing port allocation.
:::
### Docker {#docker}
For Geyser to work under Docker (e.g. using [Itzg's Docker image](https://github.com/itzg/docker-minecraft-server)), you will need to add the Geyser port on TCP and UDP to the docker-compose file. This is done by adding the following to the `ports` section:
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
Without a suffix, Docker exposes the port on TCP. The additional `/udp` suffix exposes it on UDP.
Alternatively, add the ports with the `-p 19132:19132 -p 19132:19132/udp` flags to the docker run command.
## Issues with specific VPS/KVM providers {#issues-with-specific-vpskvm-providers}
Some providers, such as OVH, Oracle Cloud, and SoYouStart, have a firewall that blocks the ports Geyser needs by default/in most cases.
### OVH and SoYouStart {#ovh-and-soyoustart}
OVH's GAME firewall filters traffic with rules made for specific games. The Minecraft Bedrock and Minecraft Pocket Edition rules currently only support RakNet, the protocol Bedrock used before NetherNet.
With NetherNet, players find the server over HTTP (TCP) and play over WebRTC (UDP), which these rules currently do not support.
For now, use the `Other` rule for the Geyser port(s) instead.
:::caution
If you do not have access to these firewall settings, but got linked to this page, please contact your server host and provide them with this link - they are likely using OVH internally.
:::
**To resolve it:**
OVH:
1. Navigate to `Network interfaces`
2. Click on the `...` button on the table for your IP -> then `...` and `Configure the GAME firewall` -> `Add rule` -> `Other protocol`
3. Add your Geyser port into `outgoing port`. If you use the "NetherNet and RakNet" option, add a rule for the `webrtc-port` as well.
4. If you use OVH's Edge Network Firewall, make sure it allows the Geyser port over both TCP and UDP.
SoYouStart (subsidiary of OVH):
1. Click the IP tab.
2. Click the gear at the right of the public IP address; select "Game mitigation".
3. Pick "Add a rule".
4. Select "Other" in the dropdown list and enter the Geyser port. If you use the "NetherNet and RakNet" option, add the `webrtc-port` as well.
5. Save and wait a few seconds for the changes to come into effect.
### Oracle Cloud/OCI {#oracle-cloudoci}
By default, Oracle Cloud will block all incoming traffic except for SSH and RDP. This must be resolved within Oracle Cloud itself and the Compute Instance running Geyser.
The steps below assume that you are using the default ports for the Java server and Geyser, and should be adjusted accordingly.
1. Find your Compute Instance in the OCI Console
2. Click on the instances Virtual Cloud Network (this will be under "Instance details")
3. On the left-hand side, select "Security Lists"
4. Select one of the security lists. By default only one security list will exist. It doesn't matter which security list we add the rules to.
5. Select "Add Ingress Rules"
6. Configure rules for Java (optional)
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `25565-25565`
- Select "Another Ingress Rule"
7. Configure rules for Geyser, once for TCP and once for UDP
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `19132-19132`
- Set "IP Protocol" to TCP
- Select "Another Ingress Rule", and repeat with "IP Protocol" set to UDP
8. Select "Add Ingress Rules"
#### Oracle Linux {#oracle-linux}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### Ubuntu {#ubuntu}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,47 @@
---
title: Supported versions
description: Information on the versions Geyser supports.
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# Currently supported versions \ {#currently-supported-versions}
:::info
**Geyser currently supports Minecraft Bedrock <Versions.bedrock /> and Minecraft Java <Versions.java />**.
:::
## Using Geyser with older Minecraft: Bedrock edition versions \ {#using-geyser-with-older-minecraft-bedrock-edition-versions}
Older Bedrock versions are not supported. Minecraft: Bedrock Edition updates automatically on all platforms, so there are few users who would
want to use older versions. Further, older Bedrock versions do not have all features which Geyser support, which would lead to a sub-par experience.
## Using Geyser on older Minecraft: Java edition servers \ {#using-geyser-on-older-minecraft-java-edition-servers}
Geyser emulates a <Versions.java /> client, so a Java server must accept users using that version in order for Geyser to work.
This is possible thanks to [ViaVersion](https://viaversion.com/viaversion), which allows Java edition players with newer versions to join servers
that run older versions of the game.
### Using Geyser-Spigot on a Spigot/Paper server running on 1.20.5 or above
You can use Geyser-Spigot on servers that run on 1.20.5 or above. You will also need to run at least Java 21 or later to use Geyser. See [here](https://docs.papermc.io/misc/java-install) for more info on updating Java. Paper versions not supporting Java 21 can add `-DPaper.IgnoreJavaVersion=true` flag to the Java startup arguments to allow Paper to run on Java 21.
In order for Bedrock players to chat (1.19.3+) or join (1.19.1/1.19.2), you need to disable chat signing. More information about that can be read on the [chat signing page](/wiki/geyser/secure-chat).
### Using Geyser-Spigot on a Spigot/Paper server running on a version below 1.20.5
This is unfortunately not possible. You'll need to use a proxy such as Velocity or BungeeCord, or set up Geyser-Standalone separately with the [ViaVersion](https://viaversion.com/viaversion) plugin. Another alternative would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it.
### Using Geyser on Fabric/NeoForge servers not on the latest Minecraft version \ {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
Unfortunately, Geyser-Fabric and Geyser-NeoForge only support the latest version of Minecraft: Java edition. The recommended way to still use
Geyser with older versions would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it. This will also work with Floodgate auth.
### Using Geyser-Velocity or Geyser-BungeeCord on a proxy
Make sure you update your proxy software to the latest available version, and, if the backend servers are not on <Versions.java />, also install the [ViaVersion](https://viaversion.com/viaversion) plugin on the backend servers. Velocity/BungeeCord support most Minecraft versions, so you can update them regardless of the backend server versions.
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "Wiki",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "Downloads",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "REST APIs",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "Other",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "Blog",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "Donate",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "Global Linking",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "Privacy Policy",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "Copyright © 2026 GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "Wiki",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "Blog",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "Utilities",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "Download",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "REST APIs",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "Other",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "Setup",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "Common Issues",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "Configuring Geyser",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "FAQ",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,83 @@
---
title: Commands and Permissions
description: Commands and their associated permission nodes for Geyser.
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# Commands and Permissions
Geyser features many built-in commands that can be used by players or server owners.
:::info
When using BungeeCord and Velocity, you will need to use a permission plugin such as [LuckPerms](https://luckperms.net/)
on the proxy server to assign permissions to players. Assigning permissions on the backend servers will not work.
:::
## Geyser commands & their permissions {#geyser-commands--their-permissions}
| Command | Permission | Description |
| :-----------------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| `geyser` <br/> Geyser root command | `geyser.command` | The permission required to see/run any Geyser commands. |
| `geyser help` <br/> `geyser ?` | `geyser.command.help` | Shows help for all registered commands. |
| `geyser advancements` | `geyser.command.advancements` | Open the Java advancements menu. |
| `geyser dump` | `geyser.command.dump` | Dumps Geyser debug information for bug reports. |
| `geyser list` | `geyser.command.list` | List all players connected through Geyser. |
| `geyser nethernet` | `geyser.command.nethernet` | Shows NetherNet signaling status and diagnostics, for use with external signaling. |
| `geyser offhand` | `geyser.command.offhand` | Puts an item in your offhand. |
| `geyser reload` | `geyser.command.reload` | Reloads the Geyser configurations. Kicks all players when used! |
| `geyser settings` | `geyser.command.settings` | Opens a settings menu allowing you to modify aspects of the world. |
| `geyser shutdown` <br/> `geyser stop` | `geyser.command.shutdown` | Shuts down Geyser.<br/>*This command only works on Standalone.* |
| `geyser statistics` | `geyser.command.statistics` | Open the Java statistics menu. |
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
## Permissions for Geyser extensions {#extension-permissions}
For the following, `<id>` refers to the extensions' id.
| Command | Permission | Description |
| :------------------------- | :---------------------------- | :------------------------------------------------------------------------ |
| `<id> help` <br/> `<id> ?` | `geyser.command.exthelp.<id>` | Shows help for all commands registered by this extension. |
## Other Permissions {#other-permissions}
Besides commands, there are other permissions that are used to guard specific Geyser features.
| Permission | Description |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | Allow players to use the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.settings.gamerules` | Defines whether a user can alter gamerules in the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.update` | Whether this player will receive Geyser update notifications upon joining. |
## Permissions when using Geyser-Standalone/Geyser-ViaProxy {#standalone-viaproxy-permissions}
Geyser-ViaProxy and Geyser-Standalone feature their own basic permission handler. To edit base permissions,
open the `permissions.yml` file and add or remove permissions that Geyser players should receive when joining.
See the file for more information.
You can further customize permission handling by creating a [Geyser extension](/wiki/geyser/extensions/) that makes use of Geysers API
to deal with permission checking.
## Permissions when using Geyser on platforms without permission handlers {#permissions-platforms-no-permission-handlers}
The following affects Geyser-BungeeCord, Geyser-Velocity, and Geyser-Fabric.
These platforms unfortunately do not have built-in permission handlers. Because of that, you will need to grant permissions on those platforms
manually using permission handlers, such as [LuckPerms](https://luckperms.net/). Geyser's permission are listed above. For extension permissions, consult their documentation.
Alternatively, you can use [LuckLink](https://github.com/onebeastchris/LuckLink), a third-party Geyser extension, to automatically register permissions using [LuckPerms](https://luckperms.net/).
- Install [LuckPerms](https://luckperms.net/) on the platform where you've installed Geyser (BungeeCord/Velocity/Fabric).
- To allow Geyser to automatically register permission defaults, install the [LuckLink](https://github.com/onebeastchris/LuckLink) Geyser extension
by downloading the `LuckLink.jar` and adding it to Geyser's `extensions` folder.
- Restart the server, and permissions should be automatically registered.
## Floodgate commands and permissions {#floodgate-commands-and-permissions}
For Floodgate commands, see [here](/wiki/floodgate/commands/).
@@ -0,0 +1,62 @@
---
title: playit.gg Setup
description: How to set up playit.gg to use Geyser without port forwarding.
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## Prerequisites {#prerequisites}
:::info
You must be able to connect to your Geyser instance locally!
:::
:::warning
The playit.gg Minecraft server plugin does not support UDP tunnels. You will need to use the program agent instead!
:::
:::caution
This guide was written for RakNet, and does not cover NetherNet. For NetherNet, see [playit.gg's progress on NetherNet support](https://status.playit.gg/3/adding-nethernet-support).
:::
## Setup {#setup}
1. Head over to [playit.gg's website](https://playit.gg/) - download the program & run it.
2. The program will provide a claiming link. Visit that link, log in.
![img](/img/wiki/playit-gg/playit_claim.png)
3. Confirm your agent.
![img](/img/wiki/playit-gg/playit_claim_confirm.png)
4. Add the agent.
![img](/img/wiki/playit-gg/playit_add_agent.png)
5. After the agent is created, create a tunnel.
![img](/img/wiki/playit-gg/playit_add_tunnel.png)
6. Name your tunnel and click Next.
![img](/img/wiki/playit-gg/playit_name_tunnel.png)
7. Select "Minecraft Bedrock" as the tunnel type and click Next.
![img](/img/wiki/playit-gg/playit_tunnel_type.png)
8. Select the Free Network and click Next.
![img](/img/wiki/playit-gg/playit_select_network.png)
**Do not change your Geyser port in `config.yml` unless you have a reason (for example, hosting another Geyser server on the same machine).** The Bedrock (Geyser) port in `config.yml` and the playit.gg ports are separate. playit.gg will forward its port to the default Geyser port and should work as-is. Changing it can cause errors. If you have changed your config port, set the Bedrock port back to the default `19132` and ensure `clone-remote-port` is `false`.
9. If the playit.gg agent and Geyser are running on the same device, leave the IP as `127.0.0.1` and set the port to whatever you configured in Geyser's config.
![img](/img/wiki/playit-gg/playit_set_ipandport.png)
10. Select `proxy-protocol-v2` for the Proxy Protocol section and click Next.
11. In the Geyser config, under `advanced:` `bedrock:`, set `use-haproxy-protocol` to `true`.
12. Click Create Tunnel and wait for the tunnel to be created.
![img](/img/wiki/playit-gg/playit_create_tunnel.png)
13. Copy your tunnel's port. For example, if your tunnel address is `visiting-phone.gl.at.ply.gg:6695`, then `6695` is the tunnel port.
14. In the Geyser config under `advanced:` `bedrock:`, set `broadcast-port` to your tunnel port (`6695` in the example).
15. Save your config. Start your Minecraft server and connect using your tunnel's IP and port.
16. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
## Troubleshooting {#troubleshooting}
### I can't connect to my server! {#i-cant-connect-to-my-server}
- *Try going to the Agents page, set your agent to IPv4 only, and change the region. You may need to switch regions a few times before you can connect.*
- *Are there errors in your minecraft server console?*
- *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
- *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 8.*
- *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
- *Make sure that you have the program agent open while trying to join.*
- *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
@@ -0,0 +1,208 @@
---
title: Port forwarding
description: Information on how to set up port forwarding required for Geyser.
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# Port forwarding {#port-forwarding}
This page contains information on how to set up port forwarding required for Geyser to work when self-hosting.
There are also guides for specific configurations, such as Docker/Pterodactyl, or on specific VPS/KVM providers, such as OVH or Oracle Cloud.
:::caution
If you are using a Minecraft server hosting provider (e.g. Aternos, or Nodecraft), you should refer to the hosting provider setup on the [setup](/wiki/geyser/setup) page instead.
:::
:::info Ports that need to be opened
With NetherNet, the Geyser port (by default 19132) has to be open for **both TCP and UDP**: players find the server over TCP (signaling), and play on it over UDP.
If you use the "NetherNet and RakNet" option, also open the `webrtc-port` for UDP.
With external signaling, such as [Warden](https://warden.cloud), only UDP for WebRTC is needed.
:::
## Port forwarding on Linux/Windows/macOS {#port-forwarding-on-linuxwindowsmacos}
To allow others to play on your server, you will need to set up port forwarding on the device hosting Geyser.
Additionally, you will need to port forward the port on your router/modem (in other words, allow and route traffic on that port to the proper machine) if you want the server to be accessible outside your own home network.
Forward it for both TCP and UDP; many routers offer a "TCP/UDP" or "Both" option for this.
See [here](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/) or [here](https://www.lifewire.com/how-to-port-forward-4163829) for helpful guides.
Do note: if you do not have a static IP address, your IP address may change over time.
:::info
Some ISPs (Internet Service Providers) block certain ports, or don't allow you to open ports (e.g. by using CGNAT, which doesn't allow you to open a port with a dynamic IP).
Other ISPs may require you to pay extra for a static IP address.
As an alternative to port forwarding, you can use [playit.gg](/wiki/geyser/playit-gg/) to create a tunnel.
:::
### Windows {#windows}
To open a port on Windows, you will need to open the port through the Windows Firewall. There are multiple ways to do this:
- `Powershell` (recommended)
To open a port on TCP and UDP (in our example, port 19132), run the following commands in an administrator Powershell:
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
Running these commands creates two rules that allow TCP and UDP traffic on port 19132.
- Windows Defender Firewall with Advanced Security (GUI)
1. Search for "Windows Defender Firewall with Advanced Security" in the start menu, and open it. ([Image](/img/wiki/port-forwarding/windows-1.png))
2. Click on "Inbound Rules" in the left sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
3. Click on "New Rule..." in the right sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
4. Select "Port" as the rule type and click "Next". ([Example](/img/wiki/port-forwarding/windows-3.png))
5. Select "UDP" and "Specific local ports", and enter the port you want to open (in our example, 19132). Click "Next". ([Example](/img/wiki/port-forwarding/windows-4.png))
6. Select "Allow the connection" and click "Next". ([Example](/img/wiki/port-forwarding/windows-5.png))
7. Select the profiles you want to apply the rule to (e.g. "Domain", "Private", "Public"), and click "Next". ([Example](/img/wiki/port-forwarding/windows-6.png))
8. Enter a name for the rule (e.g. "Geyser (UDP)"), and click "Finish". ([Image](/img/wiki/port-forwarding/windows-7.png))
9. Repeat these steps, selecting "TCP" in step 5 and naming the rule e.g. "Geyser (TCP)".
### Linux {#linux}
Different Linux distributions, even different VPS providers ship and configure different firewalls. In the following examples, we will use `19132` as the port to open, but you should replace this with the port you are using for Geyser.
- `ufw` is a simple firewall front-end for iptables that is commonly used on Ubuntu and Debian. To open a port on TCP and UDP, run the following commands:
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
Then, reload the firewall with `sudo ufw reload`, and see all open rules with `sudo ufw status`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server), [Baeldung](https://www.baeldung.com/linux/uncomplicated-firewall)
- `firewalld` Add a port on TCP and UDP by running:
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
Then, reload the firewall with `sudo firewall-cmd --reload`, and see all open rules with `sudo firewall-cmd --list-all`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)
- `iptables` is a common firewall that is used on many Linux distributions. To open a port on TCP and UDP, run the following commands:
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
Then, save the firewall with `sudo iptables-save`, and see all open rules with `sudo iptables -L`.
Further helpful guides for iptables: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04), [Ubuntu](https://help.ubuntu.com/community/IptablesHowTo)
### macOS {#macos}
You will need to disable `Block all incoming connections` in your Firewall settings, as that will block any connections and won't allow you to make exceptions.
To allow incoming connections, click `Allow` when getting [these prompts](/img/wiki/port-forwarding/macos_warning.png).
If you are still facing issues, see Apple's official guide [here](https://support.apple.com/guide/mac-help/MH11783) to open a port on macOS.
## Using Docker or Pterodactyl {#using-docker-or-pterodactyl}
In addition to port forwarding the port in your server's firewall (and, if applicable, your router/modem), you will need to assign the port in Docker/Pterodactyl.
### Pterodactyl {#pterodactyl}
Make sure to allocate the port(s) to the server in the Pterodactyl panel's `Network` tab, additionally to port forwarding the port(s).
See [here](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel) for more information.
![Pterodactyl panel, Network section](/img/wiki/port-forwarding/pterodactyl-1.png)
There are also different Geyser eggs for Pterodactyl, which can be found [here](https://github.com/GeyserMC/pterodactyl-stuff).
:::caution
If you are not able to allocate ports in the Pterodactyl panel, you will need to contact your server host to allocate one for you or try to use an existing port allocation.
:::
### Docker {#docker}
For Geyser to work under Docker (e.g. using [Itzg's Docker image](https://github.com/itzg/docker-minecraft-server)), you will need to add the Geyser port on TCP and UDP to the docker-compose file. This is done by adding the following to the `ports` section:
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
Without a suffix, Docker exposes the port on TCP. The additional `/udp` suffix exposes it on UDP.
Alternatively, add the ports with the `-p 19132:19132 -p 19132:19132/udp` flags to the docker run command.
## Issues with specific VPS/KVM providers {#issues-with-specific-vpskvm-providers}
Some providers, such as OVH, Oracle Cloud, and SoYouStart, have a firewall that blocks the ports Geyser needs by default/in most cases.
### OVH and SoYouStart {#ovh-and-soyoustart}
OVH's GAME firewall filters traffic with rules made for specific games. The Minecraft Bedrock and Minecraft Pocket Edition rules currently only support RakNet, the protocol Bedrock used before NetherNet.
With NetherNet, players find the server over HTTP (TCP) and play over WebRTC (UDP), which these rules currently do not support.
For now, use the `Other` rule for the Geyser port(s) instead.
:::caution
If you do not have access to these firewall settings, but got linked to this page, please contact your server host and provide them with this link - they are likely using OVH internally.
:::
**To resolve it:**
OVH:
1. Navigate to `Network interfaces`
2. Click on the `...` button on the table for your IP -> then `...` and `Configure the GAME firewall` -> `Add rule` -> `Other protocol`
3. Add your Geyser port into `outgoing port`. If you use the "NetherNet and RakNet" option, add a rule for the `webrtc-port` as well.
4. If you use OVH's Edge Network Firewall, make sure it allows the Geyser port over both TCP and UDP.
SoYouStart (subsidiary of OVH):
1. Click the IP tab.
2. Click the gear at the right of the public IP address; select "Game mitigation".
3. Pick "Add a rule".
4. Select "Other" in the dropdown list and enter the Geyser port. If you use the "NetherNet and RakNet" option, add the `webrtc-port` as well.
5. Save and wait a few seconds for the changes to come into effect.
### Oracle Cloud/OCI {#oracle-cloudoci}
By default, Oracle Cloud will block all incoming traffic except for SSH and RDP. This must be resolved within Oracle Cloud itself and the Compute Instance running Geyser.
The steps below assume that you are using the default ports for the Java server and Geyser, and should be adjusted accordingly.
1. Find your Compute Instance in the OCI Console
2. Click on the instances Virtual Cloud Network (this will be under "Instance details")
3. On the left-hand side, select "Security Lists"
4. Select one of the security lists. By default only one security list will exist. It doesn't matter which security list we add the rules to.
5. Select "Add Ingress Rules"
6. Configure rules for Java (optional)
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `25565-25565`
- Select "Another Ingress Rule"
7. Configure rules for Geyser, once for TCP and once for UDP
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `19132-19132`
- Set "IP Protocol" to TCP
- Select "Another Ingress Rule", and repeat with "IP Protocol" set to UDP
8. Select "Add Ingress Rules"
#### Oracle Linux {#oracle-linux}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### Ubuntu {#ubuntu}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,47 @@
---
title: Supported versions
description: Information on the versions Geyser supports.
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# Currently supported versions \ {#currently-supported-versions}
:::info
**Geyser currently supports Minecraft Bedrock <Versions.bedrock /> and Minecraft Java <Versions.java />**.
:::
## Using Geyser with older Minecraft: Bedrock edition versions \ {#using-geyser-with-older-minecraft-bedrock-edition-versions}
Older Bedrock versions are not supported. Minecraft: Bedrock Edition updates automatically on all platforms, so there are few users who would
want to use older versions. Further, older Bedrock versions do not have all features which Geyser support, which would lead to a sub-par experience.
## Using Geyser on older Minecraft: Java edition servers \ {#using-geyser-on-older-minecraft-java-edition-servers}
Geyser emulates a <Versions.java /> client, so a Java server must accept users using that version in order for Geyser to work.
This is possible thanks to [ViaVersion](https://viaversion.com/viaversion), which allows Java edition players with newer versions to join servers
that run older versions of the game.
### Using Geyser-Spigot on a Spigot/Paper server running on 1.20.5 or above
You can use Geyser-Spigot on servers that run on 1.20.5 or above. You will also need to run at least Java 21 or later to use Geyser. See [here](https://docs.papermc.io/misc/java-install) for more info on updating Java. Paper versions not supporting Java 21 can add `-DPaper.IgnoreJavaVersion=true` flag to the Java startup arguments to allow Paper to run on Java 21.
In order for Bedrock players to chat (1.19.3+) or join (1.19.1/1.19.2), you need to disable chat signing. More information about that can be read on the [chat signing page](/wiki/geyser/secure-chat).
### Using Geyser-Spigot on a Spigot/Paper server running on a version below 1.20.5
This is unfortunately not possible. You'll need to use a proxy such as Velocity or BungeeCord, or set up Geyser-Standalone separately with the [ViaVersion](https://viaversion.com/viaversion) plugin. Another alternative would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it.
### Using Geyser on Fabric/NeoForge servers not on the latest Minecraft version \ {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
Unfortunately, Geyser-Fabric and Geyser-NeoForge only support the latest version of Minecraft: Java edition. The recommended way to still use
Geyser with older versions would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it. This will also work with Floodgate auth.
### Using Geyser-Velocity or Geyser-BungeeCord on a proxy
Make sure you update your proxy software to the latest available version, and, if the backend servers are not on <Versions.java />, also install the [ViaVersion](https://viaversion.com/viaversion) plugin on the backend servers. Velocity/BungeeCord support most Minecraft versions, so you can update them regardless of the backend server versions.
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "Wiki",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "Downloads",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "REST APIs",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "Other",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "Blog",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "Donate",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "Global Linking",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "Privacy Policy",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "Copyright © 2026 GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "Wiki",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "Blog",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "Utilities",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "Download",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "REST APIs",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "Other",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
{
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}
@@ -0,0 +1,34 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.geyserSidebar.category.Setup": {
"message": "Setup",
"description": "The label for category Setup in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Common Issues": {
"message": "Common Issues",
"description": "The label for category Common Issues in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Configuring Geyser": {
"message": "Configuring Geyser",
"description": "The label for category Configuring Geyser in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.FAQ": {
"message": "FAQ",
"description": "The label for category FAQ in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.category.Geyser API": {
"message": "Geyser API",
"description": "The label for category Geyser API in sidebar geyserSidebar"
},
"sidebar.geyserSidebar.link.Hosting Providers": {
"message": "Hosting Providers",
"description": "The label for link Hosting Providers in sidebar geyserSidebar, linking to /hosting"
},
"sidebar.geyserSidebar.category.Custom Content": {
"message": "Custom Content",
"description": "The label for category Custom Content in sidebar geyserSidebar"
}
}
@@ -0,0 +1,83 @@
---
title: Commands and Permissions
description: Commands and their associated permission nodes for Geyser.
crowdin_sync: true
crowdin_page_id: cd92ff4f-9105-46a2-8696-8b0e2f8b9d31
---
# Commands and Permissions
Geyser features many built-in commands that can be used by players or server owners.
:::info
When using BungeeCord and Velocity, you will need to use a permission plugin such as [LuckPerms](https://luckperms.net/)
on the proxy server to assign permissions to players. Assigning permissions on the backend servers will not work.
:::
## Geyser commands & their permissions {#geyser-commands--their-permissions}
| Command | Permission | Description |
| :-----------------------------------: | :---------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |
| `geyser` <br/> Geyser root command | `geyser.command` | The permission required to see/run any Geyser commands. |
| `geyser help` <br/> `geyser ?` | `geyser.command.help` | Shows help for all registered commands. |
| `geyser advancements` | `geyser.command.advancements` | Open the Java advancements menu. |
| `geyser dump` | `geyser.command.dump` | Dumps Geyser debug information for bug reports. |
| `geyser list` | `geyser.command.list` | List all players connected through Geyser. |
| `geyser nethernet` | `geyser.command.nethernet` | Shows NetherNet signaling status and diagnostics, for use with external signaling. |
| `geyser offhand` | `geyser.command.offhand` | Puts an item in your offhand. |
| `geyser reload` | `geyser.command.reload` | Reloads the Geyser configurations. Kicks all players when used! |
| `geyser settings` | `geyser.command.settings` | Opens a settings menu allowing you to modify aspects of the world. |
| `geyser shutdown` <br/> `geyser stop` | `geyser.command.shutdown` | Shuts down Geyser.<br/>*This command only works on Standalone.* |
| `geyser statistics` | `geyser.command.statistics` | Open the Java statistics menu. |
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
## Permissions for Geyser extensions {#extension-permissions}
For the following, `<id>` refers to the extensions' id.
| Command | Permission | Description |
| :------------------------- | :---------------------------- | :------------------------------------------------------------------------ |
| `<id> help` <br/> `<id> ?` | `geyser.command.exthelp.<id>` | Shows help for all commands registered by this extension. |
## Other Permissions {#other-permissions}
Besides commands, there are other permissions that are used to guard specific Geyser features.
| Permission | Description |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `geyser.settings.server` | Allow players to use the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.settings.gamerules` | Defines whether a user can alter gamerules in the [game settings menu](/img/wiki/game_menu.png). (Also requires player to have op.) |
| `geyser.update` | Whether this player will receive Geyser update notifications upon joining. |
## Permissions when using Geyser-Standalone/Geyser-ViaProxy {#standalone-viaproxy-permissions}
Geyser-ViaProxy and Geyser-Standalone feature their own basic permission handler. To edit base permissions,
open the `permissions.yml` file and add or remove permissions that Geyser players should receive when joining.
See the file for more information.
You can further customize permission handling by creating a [Geyser extension](/wiki/geyser/extensions/) that makes use of Geysers API
to deal with permission checking.
## Permissions when using Geyser on platforms without permission handlers {#permissions-platforms-no-permission-handlers}
The following affects Geyser-BungeeCord, Geyser-Velocity, and Geyser-Fabric.
These platforms unfortunately do not have built-in permission handlers. Because of that, you will need to grant permissions on those platforms
manually using permission handlers, such as [LuckPerms](https://luckperms.net/). Geyser's permission are listed above. For extension permissions, consult their documentation.
Alternatively, you can use [LuckLink](https://github.com/onebeastchris/LuckLink), a third-party Geyser extension, to automatically register permissions using [LuckPerms](https://luckperms.net/).
- Install [LuckPerms](https://luckperms.net/) on the platform where you've installed Geyser (BungeeCord/Velocity/Fabric).
- To allow Geyser to automatically register permission defaults, install the [LuckLink](https://github.com/onebeastchris/LuckLink) Geyser extension
by downloading the `LuckLink.jar` and adding it to Geyser's `extensions` folder.
- Restart the server, and permissions should be automatically registered.
## Floodgate commands and permissions {#floodgate-commands-and-permissions}
For Floodgate commands, see [here](/wiki/floodgate/commands/).
@@ -0,0 +1,62 @@
---
title: playit.gg Setup
description: How to set up playit.gg to use Geyser without port forwarding.
crowdin_sync: true
crowdin_page_id: 3aee52d0-b943-4e37-8797-4a83ef55e42a
---
## Prerequisites {#prerequisites}
:::info
You must be able to connect to your Geyser instance locally!
:::
:::warning
The playit.gg Minecraft server plugin does not support UDP tunnels. You will need to use the program agent instead!
:::
:::caution
This guide was written for RakNet, and does not cover NetherNet. For NetherNet, see [playit.gg's progress on NetherNet support](https://status.playit.gg/3/adding-nethernet-support).
:::
## Setup {#setup}
1. Head over to [playit.gg's website](https://playit.gg/) - download the program & run it.
2. The program will provide a claiming link. Visit that link, log in.
![img](/img/wiki/playit-gg/playit_claim.png)
3. Confirm your agent.
![img](/img/wiki/playit-gg/playit_claim_confirm.png)
4. Add the agent.
![img](/img/wiki/playit-gg/playit_add_agent.png)
5. After the agent is created, create a tunnel.
![img](/img/wiki/playit-gg/playit_add_tunnel.png)
6. Name your tunnel and click Next.
![img](/img/wiki/playit-gg/playit_name_tunnel.png)
7. Select "Minecraft Bedrock" as the tunnel type and click Next.
![img](/img/wiki/playit-gg/playit_tunnel_type.png)
8. Select the Free Network and click Next.
![img](/img/wiki/playit-gg/playit_select_network.png)
**Do not change your Geyser port in `config.yml` unless you have a reason (for example, hosting another Geyser server on the same machine).** The Bedrock (Geyser) port in `config.yml` and the playit.gg ports are separate. playit.gg will forward its port to the default Geyser port and should work as-is. Changing it can cause errors. If you have changed your config port, set the Bedrock port back to the default `19132` and ensure `clone-remote-port` is `false`.
9. If the playit.gg agent and Geyser are running on the same device, leave the IP as `127.0.0.1` and set the port to whatever you configured in Geyser's config.
![img](/img/wiki/playit-gg/playit_set_ipandport.png)
10. Select `proxy-protocol-v2` for the Proxy Protocol section and click Next.
11. In the Geyser config, under `advanced:` `bedrock:`, set `use-haproxy-protocol` to `true`.
12. Click Create Tunnel and wait for the tunnel to be created.
![img](/img/wiki/playit-gg/playit_create_tunnel.png)
13. Copy your tunnel's port. For example, if your tunnel address is `visiting-phone.gl.at.ply.gg:6695`, then `6695` is the tunnel port.
14. In the Geyser config under `advanced:` `bedrock:`, set `broadcast-port` to your tunnel port (`6695` in the example).
15. Save your config. Start your Minecraft server and connect using your tunnel's IP and port.
16. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
## Troubleshooting {#troubleshooting}
### I can't connect to my server! {#i-cant-connect-to-my-server}
- *Try going to the Agents page, set your agent to IPv4 only, and change the region. You may need to switch regions a few times before you can connect.*
- *Are there errors in your minecraft server console?*
- *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
- *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 8.*
- *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
- *Make sure that you have the program agent open while trying to join.*
- *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
@@ -0,0 +1,208 @@
---
title: Port forwarding
description: Information on how to set up port forwarding required for Geyser.
crowdin_sync: true
crowdin_page_id: be7c5a22-1e8e-4ffe-8d13-7d763dd75886
---
# Port forwarding {#port-forwarding}
This page contains information on how to set up port forwarding required for Geyser to work when self-hosting.
There are also guides for specific configurations, such as Docker/Pterodactyl, or on specific VPS/KVM providers, such as OVH or Oracle Cloud.
:::caution
If you are using a Minecraft server hosting provider (e.g. Aternos, or Nodecraft), you should refer to the hosting provider setup on the [setup](/wiki/geyser/setup) page instead.
:::
:::info Ports that need to be opened
With NetherNet, the Geyser port (by default 19132) has to be open for **both TCP and UDP**: players find the server over TCP (signaling), and play on it over UDP.
If you use the "NetherNet and RakNet" option, also open the `webrtc-port` for UDP.
With external signaling, such as [Warden](https://warden.cloud), only UDP for WebRTC is needed.
:::
## Port forwarding on Linux/Windows/macOS {#port-forwarding-on-linuxwindowsmacos}
To allow others to play on your server, you will need to set up port forwarding on the device hosting Geyser.
Additionally, you will need to port forward the port on your router/modem (in other words, allow and route traffic on that port to the proper machine) if you want the server to be accessible outside your own home network.
Forward it for both TCP and UDP; many routers offer a "TCP/UDP" or "Both" option for this.
See [here](https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/) or [here](https://www.lifewire.com/how-to-port-forward-4163829) for helpful guides.
Do note: if you do not have a static IP address, your IP address may change over time.
:::info
Some ISPs (Internet Service Providers) block certain ports, or don't allow you to open ports (e.g. by using CGNAT, which doesn't allow you to open a port with a dynamic IP).
Other ISPs may require you to pay extra for a static IP address.
As an alternative to port forwarding, you can use [playit.gg](/wiki/geyser/playit-gg/) to create a tunnel.
:::
### Windows {#windows}
To open a port on Windows, you will need to open the port through the Windows Firewall. There are multiple ways to do this:
- `Powershell` (recommended)
To open a port on TCP and UDP (in our example, port 19132), run the following commands in an administrator Powershell:
```powershell
New-NetFirewallRule -DisplayName "Geyser (TCP)" -Direction Inbound -Protocol TCP -LocalPort 19132 -Action Allow
New-NetFirewallRule -DisplayName "Geyser (UDP)" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow
```
Running these commands creates two rules that allow TCP and UDP traffic on port 19132.
- Windows Defender Firewall with Advanced Security (GUI)
1. Search for "Windows Defender Firewall with Advanced Security" in the start menu, and open it. ([Image](/img/wiki/port-forwarding/windows-1.png))
2. Click on "Inbound Rules" in the left sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
3. Click on "New Rule..." in the right sidebar. ([Image](/img/wiki/port-forwarding/windows-2.png))
4. Select "Port" as the rule type and click "Next". ([Example](/img/wiki/port-forwarding/windows-3.png))
5. Select "UDP" and "Specific local ports", and enter the port you want to open (in our example, 19132). Click "Next". ([Example](/img/wiki/port-forwarding/windows-4.png))
6. Select "Allow the connection" and click "Next". ([Example](/img/wiki/port-forwarding/windows-5.png))
7. Select the profiles you want to apply the rule to (e.g. "Domain", "Private", "Public"), and click "Next". ([Example](/img/wiki/port-forwarding/windows-6.png))
8. Enter a name for the rule (e.g. "Geyser (UDP)"), and click "Finish". ([Image](/img/wiki/port-forwarding/windows-7.png))
9. Repeat these steps, selecting "TCP" in step 5 and naming the rule e.g. "Geyser (TCP)".
### Linux {#linux}
Different Linux distributions, even different VPS providers ship and configure different firewalls. In the following examples, we will use `19132` as the port to open, but you should replace this with the port you are using for Geyser.
- `ufw` is a simple firewall front-end for iptables that is commonly used on Ubuntu and Debian. To open a port on TCP and UDP, run the following commands:
```bash
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
Then, reload the firewall with `sudo ufw reload`, and see all open rules with `sudo ufw status`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server), [Baeldung](https://www.baeldung.com/linux/uncomplicated-firewall)
- `firewalld` Add a port on TCP and UDP by running:
```bash
sudo firewall-cmd --zone=public --permanent --add-port=19132/tcp
sudo firewall-cmd --zone=public --permanent --add-port=19132/udp
```
Then, reload the firewall with `sudo firewall-cmd --reload`, and see all open rules with `sudo firewall-cmd --list-all`.
Further helpful guides: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7)
- `iptables` is a common firewall that is used on many Linux distributions. To open a port on TCP and UDP, run the following commands:
```bash
sudo iptables -A INPUT -p tcp --dport 19132 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
```
Then, save the firewall with `sudo iptables-save`, and see all open rules with `sudo iptables -L`.
Further helpful guides for iptables: [DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04), [Ubuntu](https://help.ubuntu.com/community/IptablesHowTo)
### macOS {#macos}
You will need to disable `Block all incoming connections` in your Firewall settings, as that will block any connections and won't allow you to make exceptions.
To allow incoming connections, click `Allow` when getting [these prompts](/img/wiki/port-forwarding/macos_warning.png).
If you are still facing issues, see Apple's official guide [here](https://support.apple.com/guide/mac-help/MH11783) to open a port on macOS.
## Using Docker or Pterodactyl {#using-docker-or-pterodactyl}
In addition to port forwarding the port in your server's firewall (and, if applicable, your router/modem), you will need to assign the port in Docker/Pterodactyl.
### Pterodactyl {#pterodactyl}
Make sure to allocate the port(s) to the server in the Pterodactyl panel's `Network` tab, additionally to port forwarding the port(s).
See [here](https://pterodactyl.io/community/games/minecraft.html#allocations-in-the-panel) for more information.
![Pterodactyl panel, Network section](/img/wiki/port-forwarding/pterodactyl-1.png)
There are also different Geyser eggs for Pterodactyl, which can be found [here](https://github.com/GeyserMC/pterodactyl-stuff).
:::caution
If you are not able to allocate ports in the Pterodactyl panel, you will need to contact your server host to allocate one for you or try to use an existing port allocation.
:::
### Docker {#docker}
For Geyser to work under Docker (e.g. using [Itzg's Docker image](https://github.com/itzg/docker-minecraft-server)), you will need to add the Geyser port on TCP and UDP to the docker-compose file. This is done by adding the following to the `ports` section:
```yaml
ports:
- "25565:25565"
- "19132:19132"
- "19132:19132/udp"
```
Without a suffix, Docker exposes the port on TCP. The additional `/udp` suffix exposes it on UDP.
Alternatively, add the ports with the `-p 19132:19132 -p 19132:19132/udp` flags to the docker run command.
## Issues with specific VPS/KVM providers {#issues-with-specific-vpskvm-providers}
Some providers, such as OVH, Oracle Cloud, and SoYouStart, have a firewall that blocks the ports Geyser needs by default/in most cases.
### OVH and SoYouStart {#ovh-and-soyoustart}
OVH's GAME firewall filters traffic with rules made for specific games. The Minecraft Bedrock and Minecraft Pocket Edition rules currently only support RakNet, the protocol Bedrock used before NetherNet.
With NetherNet, players find the server over HTTP (TCP) and play over WebRTC (UDP), which these rules currently do not support.
For now, use the `Other` rule for the Geyser port(s) instead.
:::caution
If you do not have access to these firewall settings, but got linked to this page, please contact your server host and provide them with this link - they are likely using OVH internally.
:::
**To resolve it:**
OVH:
1. Navigate to `Network interfaces`
2. Click on the `...` button on the table for your IP -> then `...` and `Configure the GAME firewall` -> `Add rule` -> `Other protocol`
3. Add your Geyser port into `outgoing port`. If you use the "NetherNet and RakNet" option, add a rule for the `webrtc-port` as well.
4. If you use OVH's Edge Network Firewall, make sure it allows the Geyser port over both TCP and UDP.
SoYouStart (subsidiary of OVH):
1. Click the IP tab.
2. Click the gear at the right of the public IP address; select "Game mitigation".
3. Pick "Add a rule".
4. Select "Other" in the dropdown list and enter the Geyser port. If you use the "NetherNet and RakNet" option, add the `webrtc-port` as well.
5. Save and wait a few seconds for the changes to come into effect.
### Oracle Cloud/OCI {#oracle-cloudoci}
By default, Oracle Cloud will block all incoming traffic except for SSH and RDP. This must be resolved within Oracle Cloud itself and the Compute Instance running Geyser.
The steps below assume that you are using the default ports for the Java server and Geyser, and should be adjusted accordingly.
1. Find your Compute Instance in the OCI Console
2. Click on the instances Virtual Cloud Network (this will be under "Instance details")
3. On the left-hand side, select "Security Lists"
4. Select one of the security lists. By default only one security list will exist. It doesn't matter which security list we add the rules to.
5. Select "Add Ingress Rules"
6. Configure rules for Java (optional)
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `25565-25565`
- Select "Another Ingress Rule"
7. Configure rules for Geyser, once for TCP and once for UDP
- Set "Source CIDR" to `0.0.0.0/0`
- Set "Destination Port Range" to `19132-19132`
- Set "IP Protocol" to TCP
- Select "Another Ingress Rule", and repeat with "IP Protocol" set to UDP
8. Select "Add Ingress Rules"
#### Oracle Linux {#oracle-linux}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --add-port=19132/tcp --permanent
sudo firewall-cmd --add-port=19132/udp --permanent
sudo firewall-cmd --reload
```
#### Ubuntu {#ubuntu}
Run the following commands to allow Minecraft and Geyser through the OS firewall:
```bash
sudo ufw allow 25565/tcp
sudo ufw allow 19132/tcp
sudo ufw allow 19132/udp
```
@@ -0,0 +1,47 @@
---
title: Supported versions
description: Information on the versions Geyser supports.
crowdin_sync: true
crowdin_page_id: f199ae24-f711-486d-8e42-3079be87e8cd
---
import { Versions } from '@site/src/components/Versions'
import DocCardList from '@theme/DocCardList';
# Currently supported versions \ {#currently-supported-versions}
:::info
**Geyser currently supports Minecraft Bedrock <Versions.bedrock /> and Minecraft Java <Versions.java />**.
:::
## Using Geyser with older Minecraft: Bedrock edition versions \ {#using-geyser-with-older-minecraft-bedrock-edition-versions}
Older Bedrock versions are not supported. Minecraft: Bedrock Edition updates automatically on all platforms, so there are few users who would
want to use older versions. Further, older Bedrock versions do not have all features which Geyser support, which would lead to a sub-par experience.
## Using Geyser on older Minecraft: Java edition servers \ {#using-geyser-on-older-minecraft-java-edition-servers}
Geyser emulates a <Versions.java /> client, so a Java server must accept users using that version in order for Geyser to work.
This is possible thanks to [ViaVersion](https://viaversion.com/viaversion), which allows Java edition players with newer versions to join servers
that run older versions of the game.
### Using Geyser-Spigot on a Spigot/Paper server running on 1.20.5 or above
You can use Geyser-Spigot on servers that run on 1.20.5 or above. You will also need to run at least Java 21 or later to use Geyser. See [here](https://docs.papermc.io/misc/java-install) for more info on updating Java. Paper versions not supporting Java 21 can add `-DPaper.IgnoreJavaVersion=true` flag to the Java startup arguments to allow Paper to run on Java 21.
In order for Bedrock players to chat (1.19.3+) or join (1.19.1/1.19.2), you need to disable chat signing. More information about that can be read on the [chat signing page](/wiki/geyser/secure-chat).
### Using Geyser-Spigot on a Spigot/Paper server running on a version below 1.20.5
This is unfortunately not possible. You'll need to use a proxy such as Velocity or BungeeCord, or set up Geyser-Standalone separately with the [ViaVersion](https://viaversion.com/viaversion) plugin. Another alternative would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it.
### Using Geyser on Fabric/NeoForge servers not on the latest Minecraft version \ {#using-geyser-on-fabric-neoforge-servers-not-on-the-latest-minecraft-version}
Unfortunately, Geyser-Fabric and Geyser-NeoForge only support the latest version of Minecraft: Java edition. The recommended way to still use
Geyser with older versions would be to install [ViaProxy](https://viaversion.com/viaproxy), which is a standalone ViaVersion proxy that
translates between different Minecraft: Java edition versions, and to install Geyser-ViaProxy on it. This will also work with Floodgate auth.
### Using Geyser-Velocity or Geyser-BungeeCord on a proxy
Make sure you update your proxy software to the latest available version, and, if the backend servers are not on <Versions.java />, also install the [ViaVersion](https://viaversion.com/viaversion) plugin on the backend servers. Velocity/BungeeCord support most Minecraft versions, so you can update them regardless of the backend server versions.
@@ -0,0 +1,50 @@
{
"link.title.Wiki": {
"message": "Wiki",
"description": "The title of the footer links column with title=Wiki in the footer"
},
"link.title.Downloads": {
"message": "Downloads",
"description": "The title of the footer links column with title=Downloads in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.item.label.REST APIs": {
"message": "REST APIs",
"description": "The label of footer link with label=REST APIs linking to wiki/api/api.geysermc.org/global-api"
},
"link.item.label.Other": {
"message": "Other",
"description": "The label of footer link with label=Other linking to download?project=other-projects"
},
"link.item.label.Blog": {
"message": "Blog",
"description": "The label of footer link with label=Blog linking to blog"
},
"link.item.label.Donate": {
"message": "Donate",
"description": "The label of footer link with label=Donate linking to https://opencollective.com/geysermc"
},
"link.item.label.Global Linking": {
"message": "Global Linking",
"description": "The label of footer link with label=Global Linking linking to https://link.geysermc.org/"
},
"link.item.label.Privacy Policy": {
"message": "Privacy Policy",
"description": "The label of footer link with label=Privacy Policy linking to https://ziax.com/terms/privacy-policy/"
},
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of footer logo"
},
"copyright": {
"message": "Copyright © 2026 GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.",
"description": "The footer copyright"
}
}
@@ -0,0 +1,38 @@
{
"logo.alt": {
"message": "GeyserMC logo",
"description": "The alt text of navbar logo"
},
"item.label.Wiki": {
"message": "Wiki",
"description": "Navbar item with label Wiki"
},
"item.label.Blog": {
"message": "Blog",
"description": "Navbar item with label Blog"
},
"item.label.Utilities": {
"message": "Utilities",
"description": "Navbar item with label Utilities"
},
"item.label.Download": {
"message": "Download",
"description": "Navbar item with label Download"
},
"item.label.REST APIs": {
"message": "REST APIs",
"description": "Navbar item with label REST APIs"
},
"item.label.Other": {
"message": "Other",
"description": "Navbar item with label Other"
},
"item.label.Dump Viewer": {
"message": "Dump Viewer",
"description": "Navbar item with label Dump Viewer"
},
"item.label.Hosting": {
"message": "Hosting",
"description": "Navbar item with label Hosting"
}
}
+1023
View File
File diff suppressed because it is too large. Load diff
Loaded 100 of 315 files, more files were not shown because too many files have changed in this diff. Show more