Control your Mac from any browser — iPhone, iPad, Android or another computer — through your own cheap PHP hosting. No app to install on the viewer side, no VPS, no port forwarding and no third-party relay: the Mac sends its screen to your server and the page shows it live. An open-source, self-hosted alternative to TeamViewer, AnyDesk, Chrome Remote Desktop and VNC for quick access to your own Mac.
A small remote desktop for macOS. A utility on your Mac sends its screen to your own web server; a web page shows that screen in real time and lets you control the mouse — from another computer or from a phone. The page is locked with a four-digit access code.
Русская версия: README.ru.md.
Mac: goblin_remote.py (window) ──starts──> live_broadcast.py (broadcaster)
│ frames, HTTP POST (with a key)
▼
Web server: web/api.php ◄── polling ── web/index.html (viewer page)
No sockets and no extra software on the server: plain PHP and files, so any cheap shared hosting works.
| Path | What it is |
|---|---|
Goblin Remote.app |
Shortcut that opens the utility window |
goblin_remote.py |
The utility window: start/stop, status, settings |
live_broadcast.py |
The broadcaster: captures the screen, sends frames, moves the mouse |
common.py, lang.py |
Shared paths and settings; window texts |
screenshot2html/ |
Converter used by the HTML mode (text recognition) |
web/ |
The site: index.html, api.php, assets/ |
deploy.sh, deploy.conf.example |
Uploads web/ to your hosting or to a local test server |
make_app.sh |
Builds Goblin Remote.app |
help.html |
User help, opened by the Help button |
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt # Pillow, numpy, pyobjc (Quartz, Vision), opencv
cp deploy.conf.example deploy.conf # then put your own server into deploy.conf
./deploy.sh # upload the site to your hosting (FTP)
./deploy.sh local # or to a local test server, e.g. XAMPPdeploy.conf holds your site address, the FTP folder and the path to a file with FTP credentials (three lines: host:, user:, password:). It stays on your machine and is not part of the repository. You need any hosting with PHP — nothing else.
The first run of deploy.sh creates two secrets next to the utility:
key.txt— the key the utility uses to talk to the server;control.txt— the access code: four digits a viewer types on the page to see the screen and control it.
Both go to the server as config.php (generated on the fly; never stored in web/). For a manual install create config.php on the server from web/config.example.php with two values: upload_key and control_code.
To set your own code, write it into control.txt and run ./deploy.sh again.
Double-click Goblin Remote.app, or:
.venv/bin/python goblin_remote.pyPress ▶ Start broadcasting, then Open the screen in browser — the page opens with the access code already applied. On a phone open the same address and type the four digits on the lock screen; the browser remembers them.
The app is built by ./make_app.sh. It gives the app its own name and identifier (red.goblin.remote), so macOS lists it as Goblin Remote in the permission lists instead of a nameless “applet”. After a rebuild macOS asks for the permissions again.
| Mode | What is sent | When to use |
|---|---|---|
| PNG2 (default) | Only the changed parts of the screen | Everyday work: fastest and lightest |
| PNG | The whole screen in every frame | Simple and reliable, heavier |
| HTML | The screen recognized into text and blocks | Very light, but slow and approximate |
The picture is grayscale by default — small frames, fast updates. The Color setting switches PNG and PNG2 to full color: frames are then sent as JPEG and are several times heavier. The mouse cursor is drawn into the frame in PNG and PNG2 modes.
Broadcast settings are shared between the utility and the site — they are stored on the server, so changing one side changes the other: Mode, Interval (0.1–60 s), PNG quality (1/2/4/8 bit, gray only), Picture size (50/75/100 %), Screen (main / all screens), Color (gray / full color).
Utility-only settings live in settings.json: start broadcasting when the window opens, stop broadcasting when the window closes, obey the “Stop” button on the site, let the site control the mouse.
Page-only settings are remembered by each browser: fit the screen into the window, highlight changes, the hidden top panel, the access code.
Without the access code the page shows nothing but a lock screen with a field for the code, and the server gives out neither frames nor settings. The code is four digits; it is shown in the utility: Settings → Access code. With the code everything is available: watching, mouse control, broadcast settings and Stop.
Guessing is limited by the server: five wrong codes from one address — that address waits five minutes (during the wait even the right code is refused); thirty wrong codes from all addresses within ten minutes — everybody waits. The page then says Too many wrong codes and tries again by itself.
With Control on, moving the mouse or dragging a finger over the screen moves the cursor on the Mac; a click or a short tap is a left click.
- Screen Recording — required for frames. Without it the frames are empty or show only the desktop.
- Accessibility — required for clicks. Without it the cursor still moves, but clicks are not performed.
Both are granted in System Settings → Privacy & Security to the app that launched the utility: Terminal if you started it from a terminal, Goblin Remote.app if you double-clicked it.
The utility window, the page and the help are in English. All texts live in two files: lang.py (utility) and web/assets/lang.js (page).
The page uses the Space Mono font (SIL Open Font License 1.1).
How do I control my Mac from an iPhone, iPad or Android phone? Start broadcasting in the utility on the Mac, open your site on the phone and type the four-digit access code. Drag a finger to move the cursor, tap to click. Any modern mobile browser works — there is nothing to install.
Do I need a VPS, a static IP or port forwarding? No. The Mac only makes outgoing HTTPS requests to your web server, and the server is plain PHP with files — any shared hosting is enough. Nothing has to be opened on your home router.
How is it different from TeamViewer, AnyDesk, Chrome Remote Desktop or VNC? There is no account, no vendor cloud and no viewer app: everything goes through a server you own, and the viewer is just a web page. The trade-off: it works over ordinary HTTP polling, so it is meant for convenient access to your own Mac rather than for gaming or video.
Is it secure? The page is locked with an access code, wrong guesses are rate-limited by the server, and only the utility holding the secret key can upload frames. Use HTTPS on your site. It is a personal tool — use it at your own risk.
Free and open source, from the makers of GOBL(in):
| App | What it does |
|---|---|
| GOBL(in) Voice | voice control and dictation for Claude Code, Codex and Orca on macOS |
| GOBL(in) Session Viewer | every Claude Code, Codex, Grok and OpenCode session in one window |
| GOBL(in) Drag & Taskbar | move windows with trackpad gestures, a real taskbar and Alt-Tab for macOS |
| GOBL(in) Convert | fast batch JPEG converter and photo resizer for macOS |
| GOBL(in) Workflow | visual flowchart workflows run by AI coding agents |
If this project is useful to you, please ⭐ star it — it helps other people find it.
MIT — see LICENSE.
