Servers and edge devices should have an “outer” graphical shell, almost like a remote-first operating system.
Outer Shell approaches building this outer shell as a mix of web and native apps in a browser. This requires modifying the browser itself to support SSH, Unix domain sockets, sudo, and a native app model. Outer Loop is a companion browser that supports all of this.

Outer Shell is a service that runs on any Linux or macOS machine. It provides an API for registering and looking up apps, and it provides a local HTTP server which hosts the Outer Shell UI.
It comes with a set of first-party apps that it can install via this UI:
- Files
- Plaintext
- Top
- Profile
- Firehose
These apps are just services that host an HTTP server on a socket or port. You can create and share your own similar apps.
To use Outer Shell, download Outer Loop for macOS and connect to a machine.
How the API works
Outer Shell’s core API runs via socket messages, with a convenience outerctl command line tool wrapper. Initially, this socket and this outerctl executable go in the appropriate places in your user-owned directories. If you ever do something as root, for example install a bundled app with root support, a second socket and a second outerctl will go into a root-owned directory.
The socket and outerctl API is documented at API.
File associations
A central part of Outer Shell is enabling previewing and opening files, letting apps work together. In the current version of Outer Shell, previewing is hardcoded to a few types, while opening/editing is fully extensible.
On install, apps register the file types that they own and the file types that they can open. They do this via API calls, and Outer Shell clears them when apps are removed. Built-in file types have names like “public.text” or “public.pdf”, and apps register their own types like “com.yourwebsite.yourtype” alongside file extension and MIME info. When you register a file type, you indicate other types that it conforms to, so that existing viewers can be used for them – for example, you might want your custom text format to be openable in text editors.