Manage your Minecraft server from your phone – live, encrypted and free. Deutsche Version
🤖 RemoteMC is developed with the help of the AI Claude (Anthropic) – see How RemoteMC is made.
| Folder | What it is |
|---|---|
plugin/ |
Server plugin for Paper, Purpur, Folia and Spigot (Minecraft 1.20.6 – 26.x) |
android-app/ |
Android app (Android 8+, Kotlin / Jetpack Compose) |
desktop-app/ |
Windows app (Compose Multiplatform; shares the network code with the Android app) |
- Your overview – hold a card to rearrange the overview: drag cards, make them full, half or a third wide, or hide them (phone and PC, saved per device)
- Files and plugins – browse the server folder, edit config files, upload and delete files;
add a plugin by picking its .jar or remove one (admins;
security.allow-files: falseturns it off; RemoteMC's own folder with the tokens is never reachable) - Scheduled tasks – commands every N minutes or daily, with a countdown in the chat (admins)
- Worlds – time, weather, difficulty and game rules per world at a tap (admins)
- Dashboard – TPS gauge, MSPT, memory, uptime and worlds, updated live, plus charts of TPS, players, memory and MSPT over the last hour, day or week
- Players – heads, health, ping and location; message, heal, teleport, game mode, OP, kick, ban; play time; search and sort; whitelist and ban list with unban
- Console – coloured live server log, commands with their output, suggestions while typing (from the server's own tab completion) and your recently used commands
- Server list – hold and drag to sort or to move servers between folders, pin to the top, search by name or address
- Notifications – server offline or back online, low TPS, player joins, mentions in chat (optional; a live connection in the background, no Google services needed)
- Widget & tile – home screen widget with all servers, quick settings tile for notifications
- Chat – chat, joins and leaves as they happen; send messages to all players
- Pairing in seconds –
/remotemc pairshows a QR code on an in-game map or in the console - Security – built-in HTTPS with certificate pinning, one token per device (stored hashed on the server, encrypted in the Android Keystore on the phone), roles, lockout, audit log
- Polish – light/dark theme, 9 colour themes or your own colour, Material You, tablet layout, 10 languages, haptics, accessibility
- Plugin: download
RemoteMC-x.y.z.jarfrom the releases, put it intoplugins/and restart the server. - Port: open TCP port 8765 in your firewall/router (or set
api.portto an extra port your host gives you). - App: install
RemoteMC-App-x.y.z.apkfrom the releases (allow “install unknown apps”). - Pair: run
/remotemc pairin game or in the console and scan the QR code with the app. Without a camera: tap “Enter code” and type the address, port and 6-digit code.
Upgrading from the McRemote prototype? Remove
McRemote-1.0.0.jar. RemoteMC takes over its config and token on first start.
The same server control on the PC: server list with live status, pairing with the code or a pasted
remotemc:// link (with the same certificate check), overview with TPS, memory and history chart,
players with all actions, whitelist and ban list, world settings (time, weather, difficulty, game
rules), plugin list with add/remove, file manager with editor, scheduled tasks, coloured console with suggestions (Tab) and history (↑/↓), chat.
Windows notifications (server offline, low TPS, player joins, mentions) with RemoteMC staying in the
tray when you close the window. Colour themes and all 10 languages. Access tokens are stored with
Windows DPAPI.
Download RemoteMC-Windows-x.y.z.msi (or -Setup.exe) from the releases; Java is included.
Installed this way, the app finds new releases by itself and updates with one click.
Build it yourself on Windows with cd desktop-app && gradlew packageMsi.
Permission remotemc.admin (default: OP), alias /rmc.
| Command | Description |
|---|---|
/remotemc pair [admin|moderator|viewer] |
One-time pairing code + QR code (default role: admin) |
/remotemc info |
API status, port, certificate fingerprint, paired devices |
/remotemc token create <name> [role] |
Token for scripts or manual setup (shown once) |
/remotemc token list |
Paired devices and when they were last used |
/remotemc token revoke <name> |
Revoke a device's access |
/remotemc reload |
Reload config.yml |
| Role | Can |
|---|---|
| viewer | see status, players and chat |
| moderator | + read the console, chat, message / heal / game mode / kick / ban players |
| admin | + run console commands, OP / DeOP |
language: en # en, de, es, fr, it, nl, pl, pt-BR, tr, ru
api:
host: 0.0.0.0
port: 8765
public-address: "" # domain/IP for QR codes; empty = server-ip or LAN address
tls: true # built-in HTTPS; only disable behind your own HTTPS reverse proxy
security:
max-failed-attempts: 5
lockout-seconds: 300
pairing-code-minutes: 5
allow-commands: true
blocked-commands: [stop, restart]
console:
buffer-size: 500
audit-log: true
update-check: true- Traffic is encrypted with TLS. The plugin creates its own certificate (
tls.p12); the QR code contains its SHA-256 fingerprint, so the app trusts exactly that certificate. When pairing by hand, the app shows a short code (e.g.AB12-CD34) to compare with the server console. - Each phone gets its own token. The server stores only hashes; revoke a phone with
/remotemc token revoke. - If the certificate ever changes, the app refuses to connect and asks you to pair again.
- Access tokens, open pairing codes and console QR codes are hidden from the console stream, so a moderator cannot read an admin's credentials there.
- Deleting
tls.p12creates a new certificate – all devices then have to pair again. - Behind a reverse proxy, all requests come from the proxy's IP; the lockout then applies to everyone.
Tested with the end-to-end suite in plugin/integration-test:
| Server | Result |
|---|---|
| Paper 1.20.6 | ✅ all API and player checks |
| Paper 1.21.4 | ✅ all API and player checks |
| Paper 26.3 (Java 25) | ✅ all API checks |
| Folia 1.21.4 | ✅ all checks; TPS is not reported (Folia ticks per region) |
| Spigot 1.21.4 | ✅ all checks; no TPS, command output appears in the console stream |
JSON over HTTPS, Authorization: Bearer <token>. Errors are {"error": "<code>", "message": "…"}.
| Method | Path | Role | Description |
|---|---|---|---|
| GET | /api/v1/ping |
– | Plugin version and API version |
| POST | /api/v1/pair |
– | {"code","device"} → {"token","name","role"} |
| GET | /api/v1/me |
viewer | Name and role of this token |
| GET | /api/v1/status |
viewer | TPS, MSPT, memory, players, worlds |
| GET | /api/v1/history?range=1h|24h|7d |
viewer | Up to 360 averaged points: [time, tps, mspt, memoryMb, players] |
| GET | /api/v1/players |
viewer | Online players |
| GET | /api/v1/whitelist |
moderator | {"enabled", "players"} |
| POST | /api/v1/whitelist |
admin | {"enabled"} turns it on or off |
| POST | /api/v1/whitelist/add · /remove |
moderator | {"name"} |
| GET | /api/v1/bans |
moderator | Player bans with reason, source, created, expires |
| GET | /api/v1/schedules |
admin | Scheduled commands with their next run, server time zone |
| POST | /api/v1/schedules |
admin | Create or update: {"id"?, "name", "command", "type": "interval"|"daily", "minutes", "time", "warn", "enabled"} |
| POST | /api/v1/schedules/<id>/run · /delete |
admin | Run now or delete |
| GET | /api/v1/plugins |
moderator | Installed plugins: name, version, enabled, description, authors, file (its JAR) |
| GET | /api/v1/files?path= |
admin | Folder contents (folders first): name, dir, size, modified |
| GET | /api/v1/files/content?path= |
admin | A text file up to 1 MB |
| POST | /api/v1/files/content |
admin | Save a text file: {"path", "content"} |
| POST | /api/v1/files/upload?path= |
admin | Upload a file (raw body, up to 200 MB), e.g. plugins/MyPlugin.jar |
| POST | /api/v1/files/delete · /mkdir |
admin | {"path"}; deleting a folder removes everything in it. Deleted files go to a trash for 24 h (plugins/RemoteMC/trash); the answer has its trash id |
| POST | /api/v1/files/restore |
admin | {"trash"}: puts a deleted file or folder back (fails with file_exists if something new is there) |
| GET | /api/v1/worlds/<world> |
admin | Time, weather, difficulty, game rules |
| POST | /api/v1/worlds/<world>/time · weather · difficulty · gamerule |
admin | {"time": "day"}, {"weather": "rain"}, {"difficulty": "hard"}, {"rule", "value"} |
| POST | /api/v1/bans/<name>/pardon |
moderator | Unban |
| GET | /api/v1/chat?since=<id> |
viewer | Chat, joins and leaves |
| GET | /api/v1/events |
viewer | Server-Sent Events: hello, status, chat, console (moderator+) |
| GET | /api/v1/console?since=<id> |
moderator | Console lines |
| POST | /api/v1/chat |
moderator | {"message"} broadcast |
| GET | /api/v1/players/<name>/inventory |
moderator | Inventory, armor, off hand and ender chest of an online player (read-only, logged in audit.log) |
| POST | /api/v1/players/<name>/<action> |
moderator | kick, ban (reason), heal, gamemode (mode), message (message); op/deop need admin |
| POST | /api/v1/command |
admin | {"command"} → {"success","output","formatted"} (formatted keeps § colour codes) |
| GET | /api/v1/commands |
admin | Commands the console can run (name, description, usage, aliases) |
| GET | /api/v1/complete?buffer=<text> |
admin | Tab completion, e.g. gamemode cr → ["creative"] |
cd plugin && mvn package # plugin + unit tests → target/RemoteMC-*.jar
cd android-app && ./gradlew lintGithubDebug lintPlayDebug testGithubDebugUnitTest assembleGithubRelease bundlePlayRelease
# Two versions: "github" (de.remotemc.app, APK) and "play" (de.remotemc.app.play, bundle for Google Play) – see docs/store/google-play.md
./gradlew testGithubDebugUnitTest -Proborazzi.test.record=true # update screenshots after UI changesCI (.github/workflows/build.yml) runs unit tests, an end-to-end test against a real Paper server,
Android lint and a screenshot comparison.
Push a tag like v2.0.1. The release workflow builds both parts, creates a GitHub release and – if
configured – publishes the plugin to Modrinth and Hangar.
| Secret / variable | Purpose |
|---|---|
RMC_KEYSTORE_BASE64, RMC_KEYSTORE_PASSWORD, RMC_KEY_ALIAS, RMC_KEY_PASSWORD |
Sign the APK (otherwise a debug key is used) |
MODRINTH_TOKEN + variable MODRINTH_PROJECT_ID |
Upload to Modrinth |
HANGAR_TOKEN + variable HANGAR_PROJECT |
Upload to Hangar |
SpigotMC has no upload API; upload the jar there by hand. Store texts are in docs/store,
the privacy policy in docs/PRIVACY.md.
RemoteMC is not affiliated with Mojang or Microsoft.
RemoteMC is developed with the help of Claude, an AI by Anthropic, using Claude Code. Most of the code, tests and documentation were written by Claude; this is also visible in the commit history, where Claude is the author. @michig-code decides what gets built, tests every version on real servers and devices, reports bugs and maintains the project.
Every change goes through the same checks: unit tests for plugin and apps, screenshot comparisons of every screen, and an end-to-end test against a real Paper server in CI. Found a bug or a security issue? Please open an issue.
MIT. Third-party libraries keep their own licences (listed in the app under Settings → Open-source licences).
















