Your machines, one room.
A self-hosted control room for every project on every machine you own. Ports, terminals, live previews and your AI sessions — one URL, from any browser or your phone.
The agent dials out, so nothing has to dial in.
Free and MIT licensed. Accounts here are invite-only — or self-host it today, no waiting.
Four machines, and no single place that knows what is running.
So you go and ask each one. Every answer is somewhere else: a port is in lsof, a process is in pm2 list, a credential is in a .env you have to ssh to read. None of it is wrong. It is just spread across four terminals and your memory.
Four things that are hard to get in one place.
Several tools do one of these well. The claim here is that the combination is the product, and that the outbound-only agent is what makes the combination cheap to run.
The agent dials out
No inbound ports, no VPN, no port forwarding.
The agent connects out to your server and holds the socket open. There is no inbound port to open on the developer machine, no VPN to join, and no firewall rule to write. A laptop on hotel Wi-Fi is as reachable as a rack server. If the machine can reach the internet, you can reach the machine.
Terminals are real tmux
Close the browser and the build keeps running.
Not a web shell. Sessions survive browser reloads, network drops and app switches, and you can reattach from your phone. Open a terminal natively and you join the same session — the agent writes a guarded block into your shell rc so it just happens. A dropped socket detaches rather than kills: the PTY is held for 10 minutes so a reconnect resumes where you were.
AI sessions read as chat
It reads the transcript, it never scrapes the TUI.
Claude Code, Codex and Grok each already write a structured JSONL transcript. The agent tails that file and normalises all three into one event type. Scraping the alternate-screen terminal UI would break on every upstream release; reading the transcript does not. Three vendors, one chat surface, across every machine you own.
The tunnel rewrites the app
Real apps work through it, not half-loaded ones.
Absolute /_next/ and /api/ paths are rewritten in HTML, JS and CSS, and an injected script patches fetch, XMLHttpRequest, history.pushState, anchor clicks and the Navigation API. That is why a Next.js or PHP app served through a path prefix actually works instead of loading its shell and stalling.
Three moving parts.
The agent starts on your machine
It connects outbound to your server and holds the socket open. Nothing listens for an inbound connection, so there is nothing to expose.
Your server holds every socket
One WebSocket process — 1753 lines, one file — is the only thing that talks to agents. The web app never does.
You open one URL
Ports, terminals, files, processes, tunnels and AI sessions, from any browser or the phone app.
What it does.
Projects
Every project on every machine, with what is actually running right now.
- Live port checks
- Multi-machine projects
- Process control
- Notes and todos
Terminals
tmux-backed, shared with your native terminal, resumable by name.
- tmux-backed
- Cowork
- Resumable by name
- Recording and playback
AI sessions
Claude Code, Codex and Grok across your whole fleet, as chat.
- Three vendors, one surface
- Every machine, one list
- Launch mode
- Push when it needs you
Infrastructure
Tunnels, files, services and machine enrolment.
- HTTP tunnel
- File browser
- System services
- Machines and API keys
Account and platform
Two-factor that is actually enforced, on web and on native.
- PIN and mandatory TOTP
- Browser and native sessions
- Web push
- PWA and mobile app
What people actually do with it.
Show a client the branch, right now
Open a tunnel on the port the feature branch is running on and send the URL. No deploy, no staging environment to keep in sync, and no explaining why staging is three commits behind.
Keep a build running while you leave
The terminal is tmux. Close the laptop, open the phone app, and reattach to the same session. The build never knew you left.
Find out what is on port 3000
Scan a port range and see what answers. Scan a folder tree and register the projects you forgot you had. The dashboard then checks those ports on every load.
All of it, MIT licensed.
Server, agent, shared library and mobile app, in one repository. Nothing is held back for a paid tier. Read the authorization code before you trust it with a machine — that is the point of shipping it this way.
API routes, every one authenticated and every client-supplied id authorized
database tables, in your own Postgres
agent CLI commands, macOS and Linux
AI vendors, added without changing the chat surface
From nothing to your first machine, in about ten minutes.
You need two things: an account, and a small program on each computer you want to reach. Nothing is opened on your network — the program dials out.
Get an account
In your browserSign up on dialout.dev, or run your own copy — both give you the same thing.
New accounts on dialout.dev are invite-only while we help each person get set up, so ask for one and we will send you a link. If you would rather not wait, Dialout is MIT licensed: clone it, point it at a PostgreSQL database, and you are your own instance.
Set up sign-in
In your browserChoose a 4-digit code and scan a QR code with your phone. Takes two minutes.
Two-factor is required, not optional, and is enforced by the API rather than only hidden in the interface. This is a tool that opens terminals on your computers — an account with one factor is not one worth having.
Add your first computer
In your browserTell Dialout which computer you want to reach — your office desktop, your home machine, whatever it is — and it gives you a key to copy.
Settings → Machines → Add machine, then Generate key. The key starts with mch_ and is shown once, because only its hash is stored. Name the machine something you will recognise from a phone.
Install the agent on that computer
On that computerOne command, on the computer you just added. Not on the one you are browsing from.
A small program that runs in the background. macOS and Linux, Node 18 or newer.
$ npm install -g @indianic/dialoutRun this on the computer you want to reachPaste the key
On that computerIt asks two questions: where your Dialout is, and the key you just copied.
Server URL is the WebSocket address of your instance — wss://www.dialout.dev/ws, or your own. Then it offers to start itself automatically whenever the computer boots, which is what you want on a machine you are trying to reach from somewhere else.
$ dialout initChoose "start at boot" when it asksThat is it
On that computerThe computer turns green in your dashboard. You can now see its ports, open a terminal on it, and read your AI sessions — from any browser or your phone.
Repeat steps 3 to 5 for every other computer you want in the room. Nothing was opened on your network to make this work: the agent dials out and holds the connection open.
$ dialout statusConfirms it is connected
The software is free. These are not.
Professional installation
We install and configure Dialout on your AWS, Azure, GCP, DigitalOcean or VPS: SSL, database, email, storage, backups, Docker and domain.
Enterprise
Enterprise deployment, custom integrations and development, priority support, migration assistance, security review, architecture consulting and an SLA.
Support
Community support is free, in GitHub issues and discussions. Paid support is available if you need a response time in writing.
Before you install it.
Put every machine you own in one room.
Self-hosted, MIT licensed, and running in about fifteen minutes.