This repository contains the installer for PerforatedAI Studio: a machine-level bootstrap script that sets up a shared Server, plus a README that describes what it does.
Read it before you run it. It's about 150 lines of plain shell, and that's the point of this repo existing at all — you shouldn't have to pull a multi-gigabyte image to find out what a script is going to do to your machine.
Run this from anywhere on your machine. It's a one-time, machine-level install:
curl -fsSL https://raw.githubusercontent.com/PerforatedAI/studio-install/main/bootstrap.sh -o bootstrap.sh
sh bootstrap.shOr, if you'd rather not read it first:
curl -fsSL https://raw.githubusercontent.com/PerforatedAI/studio-install/main/bootstrap.sh | shAfter this completes, register each project by running /register-project-studio in Claude Code.
Then restart Claude Code so it picks up the new .mcp.json, and type /dashboard-studio.
Native Windows (PowerShell, no WSL/Git Bash needed):
iwr -useb https://raw.githubusercontent.com/PerforatedAI/studio-install/main/bootstrap.ps1 -OutFile bootstrap.ps1
.\bootstrap.ps1Windows support:
bootstrap.ps1now mirrors the Unix flow. This implementation is based on the Unix design but has not been tested on a real Windows machine. If you encounter issues, please report them.
docker (running) on the host.
| Flag | Default | |
|---|---|---|
--version |
latest |
Install a specific version, e.g. --version v0.1.1 |
--port |
3002 |
Port the shared Server listens on (only meaningful for the first project to run this) |
--update |
— | Stop and replace the running Server with a fresh one |
Through a pipe, flags go to sh, not to curl:
curl -fsSL https://raw.githubusercontent.com/PerforatedAI/studio-install/main/bootstrap.sh | sh -s -- --port 4000- Pulls the Studio image from
ghcr.io/perforatedai/studioand checks it actually runs on your machine — so a bad image fails now, loudly, instead of silently inside a background process later. - Starts a shared Docker container (
perforatedai-studio-server) that runs on this machine, independent of any Claude Code session. If one is already running, this is a no-op. - Stores Server state in a named Docker volume (
perforatedai-studio-data) so that data survives an image upgrade. - Records the installation in
~/.perforated_studio/for tracking and upgrades.
It does not touch any project directories. Each project registers itself separately via the /register-project-studio Skill in Claude Code, which adds entries to that project's .mcp.json and .perforated_tools/ — but leaves nothing on disk until the Skill is run.
To upgrade the shared Server to a new version, run the installer again with --update:
curl -fsSL https://raw.githubusercontent.com/PerforatedAI/studio-install/main/bootstrap.sh | sh -s -- --updateIt's idempotent. Without --update, re-running the installer ensures the machine-level Server is
running (starting it if it isn't) and records the new version — but does not stop a running Server
that's already up.
There's deliberately no update.sh — anything shipped inside the image is, by definition, the
previous version's logic, and upgrading is exactly when you want the newest installer. That's
the one at the URL above.
Individual projects refresh their skills and scripts by re-running /register-project-studio in
Claude Code.
To remove the shared Server:
~/.perforated_studio/uninstall-server.shIt removes the Server container and the Docker image. It needs no network. Projects remain on disk but will not reach the Server until it is reinstalled. Your project files and exports are never touched.
Everything else is in the image: the skills, the launcher, the uninstaller. That's what makes it impossible for your skills and the server they talk to be at different versions — they're the same artifact.
The installer is the exception, for two reasons. It's the code most likely to need a fix, because it's the code that touches every user's particular Docker setup; welding it into the image would mean a full rebuild to correct a typo, and anyone pinned to an older version would keep the broken copy forever. And it's the one piece we're asking you to pipe into a shell — so it should be a file you can open in a browser and read, not a blob you have to extract.