Make Portable
Turn anything into a clean, self-contained package that someone else can download and run — no guesswork, no missing pieces, no "works on my machine."
What "Portable" Means
Portable = your friend receives a zip, reads one file, follows the steps, and it works. Specifically:
- Zero personal config — No hardcoded paths (
/Users/andrethomas/...), no embedded API keys, no machine-specific references
- All dependencies declared — Every library, package, CLI tool listed with exact install commands
- One setup file — A single
SETUP.md (or SETUP.txt) that walks them through everything step by step
- Tested instructions — The setup steps are verified to actually work, not just guessed
Process
Step 1: Ask What We're Packaging
Ask the user:
- "What are we making portable?" — Get the path to the project, skill, script, or folder
- "Who's receiving this?" — Determines the tech level of the instructions:
- "A friend who codes" → concise setup, assume they know terminal basics
- "A friend who doesn't code" → ELI5 instructions, explain every step including opening terminal
- "Someone with Claude Code" → Include SKILL.md or agent file, they can drop it right in
Step 2: Scan & Audit
Automatically scan the target for:
Personal Config Detection (things that MUST be stripped/replaced):
- Hardcoded absolute paths (e.g.,
/Users/andrethomas/, ~/Library/...)
- API keys, tokens, secrets (in
.env, config files, or inline in code)
- Machine-specific references (local database URLs, localhost with custom ports)
- Personal usernames, emails, or account IDs embedded in code
- Browser profile paths, cookie paths, session files
- MCP server configs that reference local installs
Dependency Detection (things that MUST be documented):
package.json → Node.js dependencies
requirements.txt / pyproject.toml / Pipfile → Python dependencies
Gemfile → Ruby dependencies
Cargo.toml → Rust dependencies
- Import statements in code that reference external packages
- CLI tools used in scripts (
ffmpeg, yt-dlp, playwright, brew install X)
- System-level requirements (Python version, Node version, OS)
- MCP servers or external services the tool talks to
File Audit (what to include/exclude):
- INCLUDE: Source code, config templates, README, assets
- EXCLUDE:
node_modules/, __pycache__/, .env (real one), .git/, build artifacts, cache files, personal data files
- CREATE:
.env.example from any .env file (keys blanked out with placeholder names)
Step 3: Generate the Package
Create a folder at /tmp/portable-{project-name}/ containing:
1. SETUP.md — The One File They Need
Structure (adapt detail level based on recipient):
# {Project Name} — Setup Guide
## What This Is
{One sentence: what it does and why it's cool}
## Prerequisites
{What they need BEFORE starting — OS, runtime versions, etc.}
- [ ] macOS / Linux / Windows (specify which)
- [ ] Node.js v{X}+ (`node --version` to check)
- [ ] Python {X}+ (`python3 --version` to check)
- [ ] {Any other system tools}
## Quick Start (< 5 minutes)
### 1. Install Dependencies
{Exact terminal commands — copy-paste ready}
### 2. Configure
{How to set up .env, API keys, etc. — what to get and where to get it}
### 3. Run
{The one command to make it go}
## Troubleshooting
{Top 3 things that might go wrong and how to fix them}
Rules for SETUP.md:
- Every command is copy-paste ready (no
<placeholder> without explanation of what to replace)
- Version numbers are specific, not "latest"
- If an API key is needed, link to the exact page where they sign up
- Include
brew install OR apt-get install OR both (based on recipient's OS if known)
- The "Run" section is ONE command. Not three. One.
2. .env.example — Config Template
If the project uses environment variables:
# Get your API key at https://platform.openai.com/api-keys
OPENAI_API_KEY=your-openai-key-here
# Get your key at https://supabase.com/dashboard → Settings → API
SUPABASE_URL=your-supabase-url-here
SUPABASE_ANON_KEY=your-supabase-anon-key-here
Every variable gets a comment explaining WHERE to get it.
3. install.sh — One-Click Setup Script (optional, for code-savvy recipients)
#!/bin/bash
# Auto-setup script — run: chmod +x install.sh && ./install.sh
echo "Setting up {Project Name}..."
# Check prerequisites
command -v node >/dev/null 2>&1 || { echo "Node.js required. Install: https://nodejs.org"; exit 1; }
command -v python3 >/dev/null 2>&1 || { echo "Python 3 required. Install: https://python.org"; exit 1; }
# Install dependencies
{npm install / pip install -r requirements.txt / etc.}
# Create .env from template
if [ ! -f .env ]; then
cp .env.example .env
echo "Created .env — fill in your API keys before running!"
fi
echo "Setup complete! Edit .env, then run: {start command}"
4. The actual project files (cleaned)
All source code with:
- Personal paths replaced with relative paths or
$HOME-based paths
- API keys stripped (referenced via
.env instead)
- Comments noting anything the recipient might need to customize
Step 4: Package It
Create a zip:
/tmp/portable-{project-name}.zip
Report to user:
- What's in the package
- What was stripped/changed for portability
- Anything the recipient will need to set up themselves (API keys, accounts, etc.)
- The exact path to the zip file
Step 5: Verify (The Louise Check)
Before declaring it done, mentally walk through: "If Louise handed this to someone who's never seen it, could they get it running?"
Verify:
Special Cases
Packaging a Claude Code Skill
If the target is a skill from ~/.claude/skills/:
- Include the SKILL.md file
- Include any files in the
references/ folder
- In SETUP.md, explain: "Copy this folder to
~/.claude/skills/ — you need Claude Code installed"
- List any MCP servers the skill depends on with install commands
- List any CLI tools the skill uses
Packaging a Python Script
- Always include a
requirements.txt (generate one if missing via pip freeze filtered to used packages)
- Specify Python version
- Recommend
python3 -m venv venv && source venv/bin/activate in setup
Packaging a Node.js Project
- Include
package.json and package-lock.json (if exists)
- Specify Node version in
engines field
.nvmrc file if specific version matters
Packaging a Full Web App
- Include database schema/migration files
- Include seed data if needed
- Document every external service (auth provider, database, storage, etc.)
- Include a
docker-compose.yml if the setup is complex
Output Location
All portable packages go to: /tmp/portable-{name}.zip
Tell the user: "Your portable package is at /tmp/portable-{name}.zip — send that to your friend along with this message: 'Unzip it, open SETUP.md, follow the steps.'"
1---2name: make-portable3description: Make any project, skill, script, or tool portable and sendable to friends. Strips personal configs, bundles dependencies, generates setup instructions, and creates a ready-to-share zip. Triggers: 'make this portable', 'send this to', 'package this for', 'share this with', 'portable', 'send to my friend', 'make sendable', 'bundle this', 'package for someone else'.4---56# Make Portable78Turn anything into a clean, self-contained package that someone else can download and run — no guesswork, no missing pieces, no "works on my machine."910## What "Portable" Means1112Portable = your friend receives a zip, reads one file, follows the steps, and it works. Specifically:13141. **Zero personal config** — No hardcoded paths (`/Users/andrethomas/...`), no embedded API keys, no machine-specific references152. **All dependencies declared** — Every library, package, CLI tool listed with exact install commands163. **One setup file** — A single `SETUP.md` (or `SETUP.txt`) that walks them through everything step by step174. **Tested instructions** — The setup steps are verified to actually work, not just guessed1819## Process2021### Step 1: Ask What We're Packaging2223Ask the user:24- **"What are we making portable?"** — Get the path to the project, skill, script, or folder25- **"Who's receiving this?"** — Determines the tech level of the instructions:26 - "A friend who codes" → concise setup, assume they know terminal basics27 - "A friend who doesn't code" → ELI5 instructions, explain every step including opening terminal28 - "Someone with Claude Code" → Include SKILL.md or agent file, they can drop it right in2930### Step 2: Scan & Audit3132Automatically scan the target for:3334**Personal Config Detection** (things that MUST be stripped/replaced):35- Hardcoded absolute paths (e.g., `/Users/andrethomas/`, `~/Library/...`)36- API keys, tokens, secrets (in `.env`, config files, or inline in code)37- Machine-specific references (local database URLs, localhost with custom ports)38- Personal usernames, emails, or account IDs embedded in code39- Browser profile paths, cookie paths, session files40- MCP server configs that reference local installs4142**Dependency Detection** (things that MUST be documented):43- `package.json` → Node.js dependencies44- `requirements.txt` / `pyproject.toml` / `Pipfile` → Python dependencies45- `Gemfile` → Ruby dependencies46- `Cargo.toml` → Rust dependencies47- Import statements in code that reference external packages48- CLI tools used in scripts (`ffmpeg`, `yt-dlp`, `playwright`, `brew install X`)49- System-level requirements (Python version, Node version, OS)50- MCP servers or external services the tool talks to5152**File Audit** (what to include/exclude):53- INCLUDE: Source code, config templates, README, assets54- EXCLUDE: `node_modules/`, `__pycache__/`, `.env` (real one), `.git/`, build artifacts, cache files, personal data files55- CREATE: `.env.example` from any `.env` file (keys blanked out with placeholder names)5657### Step 3: Generate the Package5859Create a folder at `/tmp/portable-{project-name}/` containing:6061#### 1. `SETUP.md` — The One File They Need6263Structure (adapt detail level based on recipient):6465```markdown66# {Project Name} — Setup Guide6768## What This Is69{One sentence: what it does and why it's cool}7071## Prerequisites72{What they need BEFORE starting — OS, runtime versions, etc.}7374- [ ] macOS / Linux / Windows (specify which)75- [ ] Node.js v{X}+ (`node --version` to check)76- [ ] Python {X}+ (`python3 --version` to check)77- [ ] {Any other system tools}7879## Quick Start (< 5 minutes)8081### 1. Install Dependencies82{Exact terminal commands — copy-paste ready}8384### 2. Configure85{How to set up .env, API keys, etc. — what to get and where to get it}8687### 3. Run88{The one command to make it go}8990## Troubleshooting91{Top 3 things that might go wrong and how to fix them}92```9394**Rules for SETUP.md:**95- Every command is copy-paste ready (no `<placeholder>` without explanation of what to replace)96- Version numbers are specific, not "latest"97- If an API key is needed, link to the exact page where they sign up98- Include `brew install` OR `apt-get install` OR both (based on recipient's OS if known)99- The "Run" section is ONE command. Not three. One.100101#### 2. `.env.example` — Config Template102103If the project uses environment variables:104```105# Get your API key at https://platform.openai.com/api-keys106OPENAI_API_KEY=your-openai-key-here107108# Get your key at https://supabase.com/dashboard → Settings → API109SUPABASE_URL=your-supabase-url-here110SUPABASE_ANON_KEY=your-supabase-anon-key-here111```112113Every variable gets a comment explaining WHERE to get it.114115#### 3. `install.sh` — One-Click Setup Script (optional, for code-savvy recipients)116117```bash118#!/bin/bash119# Auto-setup script — run: chmod +x install.sh && ./install.sh120121echo "Setting up {Project Name}..."122123# Check prerequisites124command -v node >/dev/null 2>&1 || { echo "Node.js required. Install: https://nodejs.org"; exit 1; }125command -v python3 >/dev/null 2>&1 || { echo "Python 3 required. Install: https://python.org"; exit 1; }126127# Install dependencies128{npm install / pip install -r requirements.txt / etc.}129130# Create .env from template131if [ ! -f .env ]; then132 cp .env.example .env133 echo "Created .env — fill in your API keys before running!"134fi135136echo "Setup complete! Edit .env, then run: {start command}"137```138139#### 4. The actual project files (cleaned)140141All source code with:142- Personal paths replaced with relative paths or `$HOME`-based paths143- API keys stripped (referenced via `.env` instead)144- Comments noting anything the recipient might need to customize145146### Step 4: Package It147148Create a zip:149```150/tmp/portable-{project-name}.zip151```152153Report to user:154- What's in the package155- What was stripped/changed for portability156- Anything the recipient will need to set up themselves (API keys, accounts, etc.)157- The exact path to the zip file158159### Step 5: Verify (The Louise Check)160161Before declaring it done, mentally walk through: "If Louise handed this to someone who's never seen it, could they get it running?"162163Verify:164- [ ] No absolute paths to Drey's machine165- [ ] No embedded secrets166- [ ] SETUP.md has every step167- [ ] All dependencies are listed with install commands168- [ ] The "Run" command actually works169- [ ] .env.example has every needed variable with instructions170- [ ] Nothing references Claude Code internals that the recipient won't have171172## Special Cases173174### Packaging a Claude Code Skill175If the target is a skill from `~/.claude/skills/`:176- Include the SKILL.md file177- Include any files in the `references/` folder178- In SETUP.md, explain: "Copy this folder to `~/.claude/skills/` — you need Claude Code installed"179- List any MCP servers the skill depends on with install commands180- List any CLI tools the skill uses181182### Packaging a Python Script183- Always include a `requirements.txt` (generate one if missing via `pip freeze` filtered to used packages)184- Specify Python version185- Recommend `python3 -m venv venv && source venv/bin/activate` in setup186187### Packaging a Node.js Project188- Include `package.json` and `package-lock.json` (if exists)189- Specify Node version in `engines` field190- `.nvmrc` file if specific version matters191192### Packaging a Full Web App193- Include database schema/migration files194- Include seed data if needed195- Document every external service (auth provider, database, storage, etc.)196- Include a `docker-compose.yml` if the setup is complex197198## Output Location199200All portable packages go to: `/tmp/portable-{name}.zip`201202Tell the user: "Your portable package is at `/tmp/portable-{name}.zip` — send that to your friend along with this message: 'Unzip it, open SETUP.md, follow the steps.'"