Upgrading from v0.9.9 - nself-org/cli GitHub Wiki
Migration guide for operators still running ɳSelf v0.9.9, the Bash-based predecessor to the current Go CLI.
ɳSelf v0.9.9 was the last release of the Bash-era CLI. It used shell scripts, a .nself/config.sh variable file, and a hand-maintained docker-compose.yml. The v1.0.0 release (2026-03-29) replaced all of this with a single Go binary, the .env cascade, and a generated compose file.
The migration path is linear: v0.9.9 → current. There is no intermediate stop.
# Install current CLI first
brew tap nself-org/nself && brew install nself
# From your project root
nself migrate from-bashThis scans for Bash-era artifacts and prints a step-by-step checklist. Add --auto to run the safe automated steps (backup + remove nself.sh):
nself migrate from-bash --autoFor CI or non-interactive environments:
nself migrate from-bash --auto --yes| Area | v0.9.9 (Bash) | v1+ (Go CLI) |
|---|---|---|
| Config |
.nself/config.sh (shell vars) |
.env cascade (.env.dev → .env.local → .env.secrets) |
| Compose file | Hand-maintained docker-compose.yml
|
Generated by nself build
|
| Entry point |
nself.sh script |
nself binary (Homebrew or direct install) |
| Env loading |
direnv + .envrc
|
nself reads the .env cascade directly |
| Plugin install | Manual Docker snippets | nself plugin install <name> |
| Start/stop | docker compose up/down |
nself start / nself stop
|
Follow these steps in order. Each step is idempotent, safe to re-run if interrupted.
brew tap nself-org/nself
brew install nself
nself --versionIf already installed via Homebrew:
brew upgrade nselfYour v0.9.9 docker-compose.yml may not be recognized by the current CLI. Use Docker directly:
docker compose down
# or if you have an older Docker:
docker-compose downcp -r /path/to/project /path/to/project.bak.$(date +%Y%m%d)At minimum, back up the config and compose files:
cp .nself/config.sh .nself/config.sh.bak
cp docker-compose.yml docker-compose.yml.bakThe Go CLI uses the .env cascade. The equivalent of .nself/config.sh is .env.dev.
Open .nself/config.sh and copy your variables:
# Example: extract variables from config.sh
grep -E '^(PROJECT_NAME|BASE_DOMAIN|POSTGRES_|HASURA_|AUTH_)' .nself/config.sh \
| sed 's/^export //' >> .env.devReview .env.dev and make sure these required variables are present:
PROJECT_NAME=myapp
BASE_DOMAIN=myapp.local
POSTGRES_PASSWORD=<your-password>
HASURA_GRAPHQL_ADMIN_SECRET=<your-secret>See the Env Cascade page for the full list of supported variables.
nself initThis creates the required directory structure (.nself/, nginx/, ssl/, postgres/) and generates an .env.dev scaffold if one does not exist. Safe to run on a directory that already has .env.dev.
nself buildThis generates a new docker-compose.yml (with the GENERATED BY nself build header), nginx config files, and SSL certificates. Your docker-compose.yml.bak is untouched.
nself startnself status
nself doctornself doctor checks SSL trust, port availability, Hasura connectivity, plugin states, and RLS configuration.
If you used plugins in v0.9.9, reinstall them using the current plugin manager:
nself plugin install <name>
# For pro plugins (requires license key):
nself license set nself_pro_xxxx...
nself plugin install aiSee Plugin Overview for the full plugin catalog.
Once the stack is running and healthy:
# Remove Bash-era files
rm -f nself.sh
rm -f .envrc
# Keep backups for now — remove after a stable soak periodnself migrate from-bash handles a subset of steps automatically. The table below shows which steps it automates:
| Step | Manual or Auto | Notes |
|---|---|---|
| Detect artifacts | Auto | Always runs on nself migrate from-bash
|
| Back up artifacts | Auto (with --auto) |
Writes to .nself/bash-migration-backup/<timestamp>/
|
Remove nself.sh
|
Auto (with --auto) |
Backed up before removal |
Convert .nself/config.sh to .env.dev
|
Manual | Automated conversion planned for a future release |
Remove .envrc
|
Manual | Review content before removing |
Replace docker-compose.yml
|
Manual | Run nself build after creating .env.dev
|
Run nself init first to create the required project markers.
Compare the full variable list in Env Vars Reference against your old .nself/config.sh. Add any missing required variables.
Check that POSTGRES_PASSWORD is set in .env.dev and matches the password in your existing database volume (if you are reusing the volume from v0.9.9).
Run nself doctor to identify the cause. Typical resolution:
nself hasura clear-metadata
nself build
nself startIf old v0.9.9 containers are still running:
docker ps -a | grep nself
docker rm -f <container-id>- Run
nself migrate from-bashfor a printed checklist with exact commands. - File issues at github.com/nself-org/cli/issues.
- Community support: chat.nself.org.