Skip to content

Instantly share code, notes, and snippets.

@matthewadams
Last active July 12, 2025 16:08
Show Gist options
  • Save matthewadams/37e9412d03bb3079c8dbd179c8f58c5e to your computer and use it in GitHub Desktop.
Save matthewadams/37e9412d03bb3079c8dbd179c8f58c5e to your computer and use it in GitHub Desktop.
Node.js npx cli to create new Supabase cloud project & update local .env file
# Creates a brand new supabase project and updates the .env to point to it.
#
# Prerequisites:
#
# * Required: npx
#
# * Required: A .env.min file with the following content:
# SUPABASE_ORG_ID=yourorgid
# SUPABASE_REGION=us-east-1 # or whatever
# SUPABASE_DB_PASSWORD=thenewdbpassword
# SUPABASE_ACCESS_TOKEN=sbp_youraccesstoken
#
# * Optional: A .env.template file with other .env content you want to include in the final .env file
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
export NOW="$(date -u +%Y%m%d%H%M%SZ)"
export DB="${DB:=db$NOW}"
export ENV_BAK=".env.pre-$DB"
export ENV_NEW=".env.$DB"
if [ -f "$SCRIPT_DIR/.env" ]; then
cp "$SCRIPT_DIR/.env" "$SCRIPT_DIR/$ENV_BAK"
echo "backed up $SCRIPT_DIR/.env to $SCRIPT_DIR/$ENV_BAK" >&2
fi
PROJECTS="$(npx dotenvx run -f .env.min -q -- sh -c 'SUPABASE_ACCESS_TOKEN=$SUPABASE_ACCESS_TOKEN npx supabase projects list --output json')"
if [ "$PROJECTS" != "null" ] && [ "$(echo "$PROJECTS" | npx fx .length)" = "2" ]; then
echo "already 2 projects!" >&2
exit 1
fi
if [ -f supabase/.temp/project-ref ]; then
npx dotenvx run -f "$SCRIPT_DIR/.env.min" -q -- sh -c \
'npx supabase unlink --yes --output json'
echo 'unlinked existing project' >&2
fi
json="$(npx dotenvx run -f "$SCRIPT_DIR/.env.min" -q -- sh -c \
'SUPABASE_ACCESS_TOKEN=$SUPABASE_ACCESS_TOKEN npx supabase projects create $DB --db-password $SUPABASE_DB_PASSWORD --org-id $SUPABASE_ORG_ID --region $SUPABASE_REGION --output json')"
cp "$SCRIPT_DIR/.env.min" "$SCRIPT_DIR/$ENV_NEW"
SUPABASE_PROJECT_REF="$(echo "$json" | npx fx .id)"
echo "SUPABASE_PROJECT_REF=$SUPABASE_PROJECT_REF" >>"$SCRIPT_DIR/$ENV_NEW"
echo "created new project; ref: $SUPABASE_PROJECT_REF" >&2
getApiKey() {
local id="$1" # anon or service_role
json="$(npx dotenvx run -f "$SCRIPT_DIR/$ENV_NEW" -q -- sh -c \
'SUPABASE_ACCESS_TOKEN=$SUPABASE_ACCESS_TOKEN npx supabase projects api-keys --project-ref $SUPABASE_PROJECT_REF --output json')"
echo "$json" | npx fx 'this.filter(it => it.id == "'"$id"'")[0].api_key'
}
SUPABASE_ANON_KEY="$(getApiKey 'anon')"
SUPABASE_SERVICE_ROLE_KEY="$(getApiKey 'service_role')"
echo "SUPABASE_ANON_KEY=$SUPABASE_ANON_KEY" >>"$SCRIPT_DIR/$ENV_NEW"
echo "SUPABASE_SERVICE_ROLE_KEY=$SUPABASE_SERVICE_ROLE_KEY" >>"$SCRIPT_DIR/$ENV_NEW"
if [ -f "$SCRIPT_DIR/.env.template" ]; then
cat "$SCRIPT_DIR/.env.template" >>"$SCRIPT_DIR/$ENV_NEW"
fi
cp "$SCRIPT_DIR/$ENV_NEW" "$SCRIPT_DIR/.env"
echo "generated new .env file: $SCRIPT_DIR/.env" >&2
npx dotenvx run -f "$SCRIPT_DIR/.env" -q -- sh -c \
'SUPABASE_ACCESS_TOKEN=$SUPABASE_ACCESS_TOKEN npx supabase link -p "$SUPABASE_DB_PASSWORD" --project-ref "$SUPABASE_PROJECT_REF"'
echo "linked new supabase project: $SUPABASE_PROJECT_REF" >&2
rm -f "$SCRIPT_DIR/$ENV_NEW"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment