Transfer files to and from your Steam Deck over Wi-Fi directly from Game Mode no desktop required. Inspired by ftpd on PSP / PS Vita.
Key Features • How To Use • Connecting • Development • Roadmap • License
- 📡 Game Mode native — start and stop the FTP server from the Quick Access Menu
- No desktop mode, no SSH, no keyboard required.
- 🔗 Instant connect — your Deck's local IP and port are displayed right in the panel
- 📁 Full read/write access to
/- Games, saves, emulators, homebrew all transferable.
- 🔒 Authentication on by default — default credentials
deck/deck, fully editable in Settings. Anonymous mode is opt-in. - ⚡ Fully offline — no internet required on the Deck after install
- 🛡️ Local network only — never exposed to the public internet
- Press the
…button to open the Quick Access Menu - Open decky-ftpd and toggle Enable FTP Server ON
- Your Deck's address will appear in the panel, e.g.
ftp://192.168.1.x:2121 - Connect from any FTP client on the same Wi-Fi network
| Field | Value |
|---|---|
| Protocol | FTP (not SFTP or FTP-SSL) |
| Host | IP shown in the QAM panel |
| Port | 2121 |
| Username | deck (default — change in Settings) |
| Password | deck (default — change in Settings) |
Prefer no-password access on a trusted home network? Enable Anonymous access in Settings and confirm the warning prompt.
| Platform | Client |
|---|---|
| macOS | Cyberduck, Transmit, ForkLift |
| Windows | WinSCP, FileZilla |
| Android | Solid Explorer, FX File Explorer |
| iOS | FE File Explorer, Filza |
| Linux | FileZilla, Nautilus (built-in) |
Note The server stops automatically when the plugin is unloaded or the Deck shuts down. Toggle it off when not in use if you're on a shared network.
To clone and run this plugin, you'll need Git, pnpm, Python 3.11+, and a Steam Deck with Decky Loader installed. From your command line:
# Clone this repository
$ git clone https://github.com/codevski/decky-ftpd
# Go into the repository
$ cd decky-ftpd
# Install frontend dependencies
$ pnpm install
# Set up Python venv for editor support (optional but recommended)
$ python3 -m venv .venv
$ source .venv/bin/activate # or activate.fish for fish shell
$ pip install pyftpdlibCopy your Deck's IP into .env:
DECK_IP=192.168.1.x
Then:
$ make deploy # build frontend, create zip, rsync to Deck
$ make zip # build + create zip only
$ make build # build frontend only
$ make clean # remove build artifactsOn the Deck, install via Decky → Settings → Developer → Install Plugin from ZIP.
Note SSH is only required if you want to deploy directly from your dev machine during development. End users installing from the Decky store don't need it.
You can download the latest release, or install directly from the Decky Plugin Store.
- Settings page, custom port, passive port range
- Username/password authentication (default on, anonymous opt-in)
- Active connection count in the status line
- Configurable root directory (reintroduce safely once the symlink edge cases are sorted)
- Pull mode connect to a remote FTP server and mirror a path locally
- Configurable remote IP, remote path, and local destination
- Remembered last-used remote IP (persisted via settingsManager)
- Progress feedback and sync log in QAM
- Auto-detect SD card destinations for sync target
- Steam Machine compatibility (dynamic mount point detection)
This plugin uses the following open source packages:
- Decky Loader — The plugin loader that makes this possible
- ftpd — The original Nintendo Switch / 3DS inspiration
MIT
GitHub @codevski


