Steam Deck has two built-in modes: Gaming and Desktop. Mobile Mode adds a third.
One tap in the Power Menu switches your Deck into a portrait-oriented, touch-first KDE session — no extra packages, no Plasma Mobile, no hacks. Everything needed is already in SteamOS 3.8.
| Gaming Mode | Desktop Mode | Mobile Mode |
|---|---|---|
| Gamescope, controller | KDE landscape | KDE portrait · touch · Maliit keyboard |
| Games | Linux apps (mouse) | Linux apps (finger) |
| Steam UI | Full desktop | Vertical · thumb-friendly |
- Portrait screen orientation (90° rotation via
kscreen-doctor) - Maliit virtual keyboard — auto-invokes on every text input
- Full Linux app access: browser, Telegram, media player, files
- "Switch to Mobile" button natively in the Steam Power Menu
- "Return to Gaming" one-tap button inside the KDE session
- Persistent across SteamOS updates (files reinstalled on every plugin load)
Requires Decky Loader
Search for "Mobile Mode" in the Decky plugin store.
- Download the latest release
.zipfrom Releases - In Decky → Settings → Install plugin from zip
Power Menu → "Switch to Mobile"
└─ Decky backend (root) installs session files
└─ steamosctl switches to mobile.desktop
└─ KDE starts via plasma-dbus-run-session-if-needed
└─ autostart: kscreen-doctor rotates screen · maliit-server starts
└─ KDE in portrait mode ✓
KDE → "Return to Gaming"
└─ kscreen-doctor restores landscape
└─ steamosctl switch-to-game-mode
No extra packages required — KWin, maliit-keyboard, kscreen-doctor and steamosctl are all pre-installed in SteamOS 3.8.
decky-mobile-mode/
├── src/index.tsx # Frontend: Power Menu patch · QAM panel
├── main.py # Backend (root): steamosctl · file management
└── assets/
├── mobile.desktop # Wayland session descriptor
├── startplasma-mobile.sh # KDE session launcher (Maliit env)
├── mobile-mode-init.sh # Autostart: rotation + maliit-server
├── return-to-gaming.sh # Switch back to Gaming Mode
└── return-to-gaming.desktop
The "Switch to Mobile" button is injected into Steam's Power Menu at runtime. The approach is update-resistant — no hardcoded webpack module IDs, components are identified by stable content strings:
| Target | Identified by |
|---|---|
showContextMenu |
CreateContextMenuInstance + GetContextMenuManagerFromWindow |
| Power Menu component | render source contains ShutdownPC + IN_GAMESCOPE |
Research conducted via CEF DevTools on SteamOS 3.8.2 (Steam build Apr 11 2026). Full technical notes in .claude/CLAUDE.md.
- Node.js ≥ 16.14
- pnpm v9+ (
npm i -g pnpm@9) - Steam Deck or SteamOS VM for testing
pnpm i
pnpm run build # → dist/index.js
pnpm run watch # watch mode# Configure your device IP
echo 'DECK_IP=192.168.1.x' >> .vscode/config.sh
# Deploy via VSCode task or:
ssh deck@<IP> "..."# Session log on device
cat ~/.config/mobile-mode/session.log
# Decky plugin logs
ssh deck@<IP> "journalctl -u plugin_loader -f"
# CEF DevTools (Power Menu research)
ssh -L 8080:localhost:8080 deck@<IP> -N
# → http://localhost:8080 → SharedJSContext- Phase 0 — Research (steamosctl, Maliit, kscreen-doctor verified)
- Phase 1 — MVP shell scripts (tested on device)
- Phase 2 — Decky plugin (current)
- Power Menu patch — "Switch to Mobile"
- Python backend
- Return to Gaming
- QAM mode indicator
- On-device testing
- Phase 3 — UX polish (KWin rules, smooth transitions, gestures)
- Phase 4 — Decky Store submission
If Mobile Mode saves you from squinting at landscape apps — consider buying me a coffee ☕
GPL-3.0-or-later © 2026 nord-winter
Plugin template originally by Steam Deck Homebrew — BSD-3-Clause.
