How to automatically use Warp Terminal's Subshells with "Warpify"
Software engineer and founder with a background in finance and tech. Currently building aVenture.vc, a platform for researching private companies. Based in San Francisco.
Software engineer and founder with a background in finance and tech. Currently building aVenture.vc, a platform for researching private companies. Based in San Francisco.
Warp Terminal has a useful feature called subshells - isolated terminal environments for different contexts. This post shows how to automate subshells using a custom configuration I call "Warpify".
Warp subshells provide isolated environments where you can run commands without affecting your main terminal session. They work well for ssh'ing to a server, or looking inside a docker container (e.g., docker exec), each with their own environment variables and working directories.
Add the snippet to the appropriate RC file in the target environment. For SSH or containers, place it on the host you're connecting to; for local nested shells, keep it in your local RC file so those inner shells are warpified automatically.
To Warpify SSH or container sessions, add the snippet in the target environment — the machine you're connecting to
(for example: a Docker container, a remote SSH server, or a VM). Place it in that user's shell startup file (~/.bashrc
or ~/.bash_profile for bash, ~/.zshrc for zsh).
“Local nested shells” are interactive shells that you launch inside the current Warp session on the same machine (not SSH, not a container). If you want these inner shells to be warpified without a prompt, add the snippet to your local RC file.
bash, bash -lzsh, zsh -lsudo -s, sudo -isu - otheruser, su -l otheruserpoetry shell, pipenv shellnix-shell, nix developasdf shell <tool> <version> (depending on setup)tmux new -s work, screenWhat do not count as local nested shells (configure the environment you jump into instead):
docker exec -it <container> /bin/bash → put the snippet in the container user's RC file.ssh user@host (even ssh localhost) → put the snippet on the target machine.This protection boundary keeps the hook scoped to Warp and to interactive shells only:
# zsh (~/.zshrc)
if [[ $- == *i* && $TERM_PROGRAM == "WarpTerminal" ]]; then
printf '\eP$f{"hook":"SourcedRcFileForWarp","value":{"shell":"zsh"}}\x9c'
fi
# bash (~/.bashrc or ~/.bash_profile)
if [[ $- == *i* && $TERM_PROGRAM == "WarpTerminal" ]]; then
printf '\eP$f{"hook":"SourcedRcFileForWarp","value":{"shell":"bash"}}\x9c'
fi
Quick add (local-only, guarded) helpers:
# zsh (local ~/.zshrc)
cat <<'EOF' >> ~/.zshrc
# Auto-Warpify (Warp) — only in Warp and interactive zsh
if [[ $- == *i* && $TERM_PROGRAM == "WarpTerminal" ]]; then
printf '\eP$f{"hook":"SourcedRcFileForWarp","value":{"shell":"zsh"}}\x9c'
fi
EOF
# bash (local ~/.bashrc)
cat <<'EOF' >> ~/.bashrc
# Auto-Warpify (Warp) — only in Warp and interactive bash
if [[ $- == *i* && $TERM_PROGRAM == "WarpTerminal" ]]; then
printf '\eP$f{"hook":"SourcedRcFileForWarp","value":{"shell":"bash"}}\x9c'
fi
EOF
For Linux hosts you're connecting to (remote server or container):
# Warpify subshells in the remote environment (add to remote ~/.bashrc)
printf '\eP$f{"hook": "SourcedRcFileForWarp", "value": { "shell": "bash" }}\x9c'
See the official docs for further details: Warpify Subshells.