Guide for running on Steam Deck #350
johnoestmannmusic
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
I spent a good few hours doing heavily-AI-assisted troubleshooting to get this running on my Steam Deck, and finally reached playable success!
In case helpful to anyone else, here is the summary of what ended up working. Feel free to comment if something doesn't make sense, and I'll try to refine into a more streamlined guide:
Running MapleStory v83 Cosmic Private Server on a Steam Deck
A working setup for playing MapleStory locally on SteamOS, with a controller, in Gaming Mode.
As of August 2026, Official MapleStory can't run on Linux — its anti-cheat (BlackCipher/nProtect) hooks Windows at a level Proton doesn't emulate, and the client dies before a window appears. A local private server allows the game to run on Linux, without infringing on official servers.
Tested on: Steam Deck, SteamOS 3.x, August 2026.
Overview
Three components:
1. Prerequisites
SteamOS has an immutable root filesystem — anything installed with
pacmanon the host is wiped by the next system update. Don't fight this; use containers.Since SteamOS 3.5,
podmananddistroboxare preinstalled. Verify from Desktop Mode:Everything below assumes Desktop Mode with a keyboard attached (unless you happen to love typing in long bash with the on-screen keyboard).
2. Database
Run MySQL as its own podman container on the host (not inside distrobox — distrobox containers don't run systemd, which makes a database inside one tedious to start).
Watch it initialise and wait for
ready for connections:Notes:
MYSQL_DATABASE=cosmiccreates the schema automatically, skipping the HeidiSQL step in Cosmic's README.--restart=always, this won't automatically start at boot (which I would recommend to avoid conflicts with other apps when you're not playing MS-Cosmic). Start the database manually withpodman start cosmic-db.3. Server
Create a build container and install the toolchain:
distrobox create --image archlinux:latest --name maple distrobox enter maple sudo pacman -Syu jdk21-openjdk git git-lfs java -version # must report 21Distrobox mounts your real home directory, so clone somewhere shared:
Edit
config.yaml:DB_PASSto your MySQL root password.127.0.0.1Build:
(
mvnw.cmdin the README is the Windows form.-DskipTestsavoids a Surefire failure that doesn't affect a single-player server.)Run:
Both flags are mandatory.
-Dwz-pathbecause the WZ XML data isn't bundled into the jar;-Djava.awt.headless=truebecause the server touchesjava.awtgeometry classes and will otherwise crash the moment you try to enter the game world.Wait for
Cosmic is now online, then verify from the host:You want 8484 (login) plus one port per channel from 7575 up.
4. Client
Client files live in a separate repo - you can find the link to the Cosmic-Client on P0nk's GitHub.
The client repo uses Git LFS. Without
git-lfsinstalled,git clonesilently gives you 135-byte pointer files instead of binaries. Always verify:If you get pointers:
If
git lfs pullreports the repository has exceeded its LFS budget, the quota is exhausted on the repo owner's side. In this case, I was able to manually download each Cosmic-Client file from the GitHub repo via the browser.5. Bottles prefix
Install Bottles from Discover (Flathub).
Create the bottle:
Install the game:
C:\Nexon\MapleStorypathThen copy the patched client and its custom
.wzfiles into:Add the patched
.exeto the bottle's library as a Shortcut so it appears as a launchable program. You will have removed the original launcher as part of Cosmic's instructions too.6. Launcher script
Save as
~/Games/maple.shandchmod +xit:Find your exact bottle and program names with:
The polling loops matter — launching the client before 8484 is listening reproduces connection failures that look like config problems.
7. Adding to Steam
~/Games/maple.shFor the controller: Create your own Steam layout to taste! I have personally had success mapping CTRL to A (jump), the attack button to Right bumper, my arrow keys to Left Control Stick, my most essential menus to D-Pad, and a few of the action hotkeys to X, Y, B, buttons.
Gotchas
Collected failures from this build, roughly in the order they cost the most time.
Proton does not work. Experimental, GE-Proton 9, and Proton 8.0 all failed — silent exits, or a window flashing and closing. A plain Wine runner in a win32 prefix seems to be required. It seems Steam cannot create 32-bit prefixes, which is why Bottles is required rather than optional.
java.awtcrash on entering the world. Login and character creation work, then entering the game world fails withNoClassDefFoundError: Could not initialize java.awt.Rectangle. Fix:-Djava.awt.headless=true. The server uses AWT geometry classes for map bounds, and they can't initialise without a display. This never affects Windows users, so it isn't in any FAQ.Git LFS pointer files. A 135-byte "executable" that
filereports as ASCII text. Causes wildly varied downstream errors — Wine prefix init failures, silent Proton exits, "Exec format error." Runfileon every binary you download. This one check would have saved hours.WARN ... account nullis not an error. It's Cosmic's logging preamble printing client context, and a fresh channel connection legitimately has no account yet. The real cause is in the stack trace underneath it. Always read the next line.BindException: Address already in useat startup. Usually a leftover java process (pgrep -af javaon the host — a container can't see host processes), or too many channels configured.Stuck at character select after a failed attempt. An account can be left flagged as logged in. Clear it using SQL:
pacman "read-only file system". You're on the host, not in the container.
distrobox enter maplefirst.Steam shows "Running" after the game exits. A known non-Steam shortcut quirk.
pkill -f reaperclears it. Don't mistake it for the game still running.Bottles "Unable to create bottle" / "Wine prefix initialization failed". Check disk space, then that the runner downloaded completely (
du -sh ~/.var/app/com.usebottles.bottles/data/bottles/runners/*— a real runner is ~1.8 GB), then delete any half-created bottle directories before retrying.Credits
All reactions