Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 27 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,31 +13,24 @@
</p>

<p align="center">
Continue your coding sessions on the go. Self-hosted workspaces, accessible over Tailscale.
</p>

<p align="center">
<img src="assets/demo-terminal-mobile.gif" alt="Terminal" width="280">
&nbsp;&nbsp;&nbsp;
<img src="assets/demo-chat-mobile.gif" alt="Chat" width="280">
Self-hosted workspaces with AI coding agents, accessible from anywhere over Tailscale.
</p>

## Overview

Perry is an agent (agent P) designed to run as a daemon on your machine. It allows your clients - other machines through CLI, web, or mobile app - to connect directly to your workspaces over the Tailscale network.
Perry is an agent (agent P) designed to run as a daemon on your machine. It auto-registers containerized workspaces on your Tailscale network so your CLI, web UI, or SSH clients can connect directly.

It can be connected directly to your host, or it can create docker containers so that your work can be fully isolated.

Continue your sessions on the go!
Continue your sessions from any device on your tailnet.

**[Get Started →](https://gricha.github.io/perry/docs/getting-started)**

## Features

- **AI Coding Agents** - Claude Code, OpenCode, Codex CLI pre-installed
- **Self-Hosted** - Run on your own hardware, full control
- **Remote Access** - Use from anywhere via Tailscale, CLI, web, or SSH
- **Web UI** - Manage workspaces from your browser
- **Remote Access** - Use from anywhere via CLI, web, or SSH over Tailscale
- **Isolated Environments** - Each workspace runs in its own container

## Setup
Expand All @@ -54,32 +47,39 @@ curl -fsSL https://raw.githubusercontent.com/gricha/perry/main/install.sh | bash
perry agent run
```

Web UI: **http://localhost:7391** (or your Tailscale host)
## Access From Anywhere

### Create & Use Workspaces
Once your agent is running, connect from any device on your Tailscale network.

**Via CLI:**
### CLI

The fastest way to access workspaces from any machine:

```bash
# Create workspace
perry create myproject
# Point to your agent (one-time setup)
perry config agent <hostname>

# Or clone a repo
perry create myproject --clone git@github.com:user/repo.git
# Create workspace and clone a repo
perry start my-proj --clone git@github.com:user/repo.git

# Shell into workspace
perry shell myproject
# Shell into the workspace
perry shell my-proj

# Manage workspaces
perry start myproject
perry stop myproject
perry delete myproject
perry list
# Or attach an AI coding agent directly
opencode attach http://my-proj:4096
```

**Via Web UI:**
### Web UI

Open `http://<hostname>:7391` to manage workspaces from your browser.

<p align="center">
<img src="assets/demo.gif" alt="Web UI Demo" width="800">
</p>

### Remote Access

Open http://localhost:7391 (or your Tailscale host) and click "+" to create a workspace.
Each workspace is registered on your tailnet, so you can connect directly using CLI, web UI, or SSH.

<p align="center">
<img src="assets/demo.gif" alt="Web UI Demo" width="800">
Expand Down
6 changes: 3 additions & 3 deletions docs/docs/configuration/tailscale.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,9 @@ perry shell myproject
- `https://your-machine.tail-scale.ts.net` (with HTTPS)
- `http://your-machine.tail-scale.ts.net:7391` (without HTTPS)

**From mobile:**
**From another device:**

Access the Web UI from your phone's browser while connected to your tailnet.
Access the Web UI from any browser on your tailnet.

## Part 2: Workspace Networking

Expand All @@ -133,7 +133,7 @@ http://myproject:3000 # Works from any device on your tailnet

**Use cases:**

- Test your mobile app against a dev server running in a workspace
- Test a dev server running in a workspace from another device
- Share a preview URL with a teammate: "Check out `http://myproject:3000`"
- Access databases, Redis, or any service running in a workspace
- Connect your IDE on one machine to a workspace running on another
Expand Down
24 changes: 22 additions & 2 deletions docs/docs/introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,36 @@ Perry is a self-hosted daemon that:

- **Spawns sandboxed containers** for isolated development workspaces
- **Runs AI coding agents** (Claude Code, OpenCode, Codex) against your workspaces—or directly on the host
- **Provides remote access** via Tailscale through a responsive web app or native mobile app
- **Provides remote access** via CLI, web UI, or SSH over Tailscale

Think of it as your personal development environment manager that you can access from anywhere.

## Access From Anywhere

Perry is designed for remote access. Once your agent is running, you can connect from any device on your Tailscale network.

**CLI** — The fastest way to access workspaces:
```bash
# Create and clone a repo
perry start my-proj --clone git@github.com:user/repo.git

# Shell into the workspace
perry shell my-proj

# Or attach an AI coding agent directly
opencode attach http://my-proj:4096
```

**Web UI** — Full workspace management at `http://<hostname>:7391`

**SSH** — Connect directly to registered workspaces on your tailnet

## How It Works

```
┌─────────────────────────────────────────────────────────────┐
│ Your Devices │
│ Browser (Web UI) • Mobile App CLI • SSH
│ Browser (Web UI) • CLI SSH
└─────────────────────────┬───────────────────────────────────┘
│ Tailscale / Local
Expand Down
69 changes: 35 additions & 34 deletions docs/docs/web-ui.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,38 @@
sidebar_position: 6
---

# Web & Mobile
# Remote Access

Perry includes a responsive web UI and a native mobile app, giving you access to your workspaces from anywhere.
Perry gives you access to your workspaces from anywhere via CLI, web UI, or SSH.

## CLI

The CLI is the fastest way to work with Perry workspaces from any machine.

### Setup

Install Perry on your client machine and point it to your agent:

```bash
perry config agent <hostname>
```

Replace `<hostname>` with your Tailscale hostname or IP (e.g., `myserver` or `myserver.tail1234.ts.net`).

### Usage

```bash
# Create workspace and clone a repo
perry start my-proj --clone git@github.com:user/repo.git

# Shell into the workspace
perry shell my-proj

# Or attach an AI coding agent directly
opencode attach http://my-proj:4096
```

See [CLI Reference](./cli.md) for all available commands.

## Web UI

Expand Down Expand Up @@ -38,40 +67,12 @@ By default, Perry also provides direct access to your host machine (not just con

Disable with `perry agent run --no-host-access` if you only want container access.

## Mobile App

The Perry mobile app provides the same capabilities as the web UI in a native experience optimized for iOS and Android.

![Mobile App](/img/demo-terminal-mobile.gif)

### Building for Your Device

The app is built with Expo. To run it on your own device:

**Prerequisites:**
- Node.js or Bun
- Xcode (iOS) or Android Studio (Android)
- [Expo CLI](https://docs.expo.dev/get-started/installation/)
## SSH Access

**Development build:**
Every workspace is reachable directly on your tailnet using its Tailscale hostname.

```bash
cd mobile
bun install

# iOS (requires Mac with Xcode)
bun run ios

# Android
bun run android
ssh ubuntu@<workspace-name>
```

This builds and installs a development version directly to your connected device or simulator.

**Connecting to your agent:**

The app needs your agent's address. In the app settings, enter your Tailscale hostname (e.g., `myserver:7391` or `myserver.tail1234.ts.net`).

### App Store

An iOS App Store version is coming soon. Follow the [GitHub repository](https://github.com/gricha/perry) for updates.
If you prefer local tooling, you can also use `perry shell` to hop into a workspace from any client machine on your tailnet.
10 changes: 1 addition & 9 deletions docs/docs/workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,6 @@ perry clone myproject myproject-experiment
4. Enter a name for the new workspace
5. Click "Clone Workspace"

### Via Mobile App

1. Open the workspace details
2. Go to Settings
3. Tap "Clone Workspace" in the Clone section
4. Enter a name for the new workspace
5. Tap "Clone"

### What Gets Cloned

- All files in `/home/workspace` (your code, configurations, etc.)
Expand Down Expand Up @@ -128,7 +120,7 @@ perry shell my-app
claude
```

Or use the Web UI's chat interface directly.
Or launch the agent directly in the Web UI terminal.

### OpenCode

Expand Down
32 changes: 10 additions & 22 deletions docs/src/pages/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ function HomepageHeader() {
<Heading as="h1" className={styles.heroTitle}>
Perry
</Heading>
<p className={styles.heroSubtitle}>
Self-hosted dev containers, accessible anywhere
</p>
<p className={styles.heroTagline}>
<span>Docker</span> workspaces with <span>SSH</span>, <span>Web UI</span>, and <span>AI coding tools</span> built in
</p>
<p className={styles.heroSubtitle}>
Self-hosted dev containers, auto-registered on your tailnet
</p>
<p className={styles.heroTagline}>
<span>Docker</span> workspaces with <span>Tailscale</span>, <span>SSH</span>, <span>Web UI</span>, and <span>AI coding tools</span> built in
</p>
<div className={styles.buttons}>
<Link
className="button button--primary button--lg"
Expand Down Expand Up @@ -70,8 +70,8 @@ const features = [
},
{
icon: '03',
title: 'Remote Access',
description: 'Work from anywhere via Tailscale. Web UI, CLI, or SSH - your choice.',
title: 'Tailnet Ready',
description: 'Workspaces register themselves on your tailnet for direct CLI, web UI, or SSH access.',
},
{
icon: '04',
Expand Down Expand Up @@ -115,8 +115,6 @@ function HomepageFeatures(): ReactNode {
}

function RemoteAccess(): ReactNode {
const terminalMobileImg = useBaseUrl('/img/demo-terminal-mobile.gif');
const chatMobileImg = useBaseUrl('/img/demo-chat-mobile.gif');
const demoImg = useBaseUrl('/img/demo.gif');

return (
Expand All @@ -126,21 +124,11 @@ function RemoteAccess(): ReactNode {
Access From Anywhere
</Heading>
<p className={styles.sectionSubtitle}>
Work from your phone, tablet, or any browser via Tailscale.
Workspaces auto-register on your tailnet for direct access from any device.
</p>
<div className={styles.demoGrid}>
<div className={styles.demoItem}>
<img src={terminalMobileImg} alt="Terminal on mobile" />
<p>Mobile terminal</p>
</div>
<div className={styles.demoItem}>
<img src={chatMobileImg} alt="AI chat on mobile" />
<p>AI sessions on the go</p>
</div>
</div>
<div className={styles.demoWeb}>
<img src={demoImg} alt="Web UI demo" />
<p>Full Web UI for desktop</p>
<p>Web UI, CLI, and SSH stay in sync</p>
</div>
</div>
</section>
Expand Down
8 changes: 4 additions & 4 deletions docs/src/pages/privacy.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@

## Overview

Perry is an open-source tool for creating isolated Docker-in-Docker development environments. This privacy policy covers the Perry mobile application.
Perry is an open-source tool for creating isolated Docker-in-Docker development environments. This privacy policy covers the Perry web UI.

## Data Collection

**Perry does not collect, store, or transmit any personal data to external servers.**

The Perry mobile app:
The Perry web UI:
- Connects only to your self-hosted Perry agent on your local network or via Tailscale
- Does not include any analytics, tracking, or telemetry
- Does not require user accounts or authentication with external services
- Stores configuration locally on your device only
- Stores configuration locally in your browser only

## Local Network Access

Expand All @@ -26,7 +26,7 @@ Perry requires local network access to communicate with your Perry agent. This c
## Data Storage

All data is stored locally:
- **On your device:** App preferences and agent connection settings
- **In your browser:** UI preferences and agent connection settings
- **On your Perry agent:** Workspace configurations and state (self-hosted by you)

## Third-Party Services
Expand Down
Loading
Loading