Skip to main content

Overview

Superset allows you to automate workspace initialization and cleanup through configuration files. The .superset/config.json file in your repository root defines scripts that run when workspaces are created or deleted.
Configuration is per-repository. Each project can have its own setup and teardown logic.

.superset/config.json Format

The configuration file uses a simple JSON structure:
{
  "setup": ["./path/to/script1.sh", "./path/to/script2.sh"],
  "teardown": ["./path/to/cleanup.sh"]
}
FieldTypeDescription
setupstring[]Scripts to run when creating a workspace
teardownstring[]Scripts to run when deleting a workspace
Scripts are executed in order. If a script fails, subsequent scripts still run.

Setup Scripts

Setup scripts run automatically when a workspace is created, before any presets execute.

When Setup Scripts Run

  1. User creates a workspace (⌘N or ⌘⇧N)
  2. Superset creates git worktree
  3. Setup scripts execute ← You are here
  4. Terminal session starts
  5. Presets execute (if configured)

Example Setup Script

Here’s a typical setup script that prepares a workspace:
#!/usr/bin/env bash
# .superset/setup.sh

set -euo pipefail

# Copy environment variables from main repo
echo "Copying .env file..."
cp "$SUPERSET_ROOT_PATH/.env" .env

# Install dependencies
echo "Installing dependencies..."
bun install

# Run database migrations
echo "Running migrations..."
bun run db:migrate

# Seed test data (optional)
if [ "$SUPERSET_WORKSPACE_NAME" = "test-workspace" ]; then
  echo "Seeding test data..."
  bun run db:seed
fi

echo "✓ Workspace setup complete!"
Make your setup scripts executable: chmod +x .superset/setup.sh

Common Setup Tasks

Copy .env Files

cp "$SUPERSET_ROOT_PATH/.env" .env
Git ignores .env, so copy it from the main repo.

Install Dependencies

bun install
# or: npm install, yarn, pnpm install
Each worktree needs its own node_modules.

Database Migrations

bun run db:migrate
Ensure database schema is up to date.

Build Assets

bun run build
Pre-build assets if needed.

Teardown Scripts

Teardown scripts run when a workspace is deleted, before the git worktree is removed.

When Teardown Scripts Run

  1. User deletes workspace
  2. Superset closes terminal sessions
  3. Teardown scripts execute ← You are here
  4. Git worktree is removed
  5. Workspace metadata cleaned up

Example Teardown Script

#!/usr/bin/env bash
# .superset/teardown.sh

set -euo pipefail

echo "Cleaning up workspace: $SUPERSET_WORKSPACE_NAME"

# Stop running services
if [ -f .pid ]; then
  echo "Stopping background services..."
  kill $(cat .pid) 2>/dev/null || true
  rm .pid
fi

# Clean temporary files
echo "Removing temporary files..."
rm -rf .tmp/ *.log

# Archive important data
if [ -d data/ ]; then
  echo "Archiving data..."
  tar -czf "$SUPERSET_ROOT_PATH/archives/$SUPERSET_WORKSPACE_NAME.tar.gz" data/
fi

echo "✓ Workspace cleanup complete!"

Common Teardown Tasks

Stop Services

pkill -f "my-dev-server" || true
Kill long-running processes.

Clean Temp Files

rm -rf .tmp/ *.log node_modules/.cache/
Remove temporary data.

Archive Data

tar -czf ~/archives/data.tar.gz data/
Save important files before deletion.

Cleanup Docker

docker-compose down
Stop and remove containers.

Environment Variables in Scripts

Scripts run with special environment variables provided by Superset:
VariableDescriptionExample
SUPERSET_WORKSPACE_NAMEName of the workspace"add-oauth-integration"
SUPERSET_ROOT_PATHAbsolute path to main repository"/Users/you/projects/my-app"

Using Environment Variables

#!/usr/bin/env bash
# .superset/setup.sh

echo "Setting up workspace: $SUPERSET_WORKSPACE_NAME"
echo "Main repository: $SUPERSET_ROOT_PATH"

# Copy files from main repo
cp "$SUPERSET_ROOT_PATH/.env" .env
cp "$SUPERSET_ROOT_PATH/.env.local" .env.local

# Workspace-specific configuration
if [[ "$SUPERSET_WORKSPACE_NAME" == *"production"* ]]; then
  echo "Using production configuration"
  cp "$SUPERSET_ROOT_PATH/.env.production" .env
fi
Don’t rely on $PWD or relative paths. Use $SUPERSET_ROOT_PATH to reference the main repository.

Real Configuration Examples

Example 1: Node.js Project

{
  "setup": ["./.superset/setup.sh"],
  "teardown": ["./.superset/teardown.sh"]
}
Setup script:
#!/usr/bin/env bash
set -euo pipefail

# Copy environment
cp "$SUPERSET_ROOT_PATH/.env" .env

# Install dependencies
bun install

# Build packages
bun run build

echo "✓ Ready to code!"
Teardown script:
#!/usr/bin/env bash
set -euo pipefail

echo "Cleaning up $SUPERSET_WORKSPACE_NAME"

# Remove node_modules to save space
rm -rf node_modules

echo "✓ Cleanup complete"

Example 2: Python Project with Database

{
  "setup": [
    "./.superset/scripts/setup-venv.sh",
    "./.superset/scripts/setup-db.sh"
  ],
  "teardown": ["./.superset/scripts/cleanup.sh"]
}
setup-venv.sh:
#!/usr/bin/env bash
set -euo pipefail

# Create virtual environment
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt

echo "✓ Virtual environment ready"
setup-db.sh:
#!/usr/bin/env bash
set -euo pipefail

source venv/bin/activate

# Run migrations
flask db upgrade

# Seed test data
flask seed

echo "✓ Database ready"
cleanup.sh:
#!/usr/bin/env bash
set -euo pipefail

# Drop test database
flask db-drop || true

# Remove virtual environment
rm -rf venv

echo "✓ Cleanup complete"

Example 3: Docker Compose Project

{
  "setup": ["./.superset/docker-setup.sh"],
  "teardown": ["./.superset/docker-teardown.sh"]
}
docker-setup.sh:
#!/usr/bin/env bash
set -euo pipefail

# Copy environment
cp "$SUPERSET_ROOT_PATH/.env" .env

# Allocate unique port for this workspace
PORT_BASE=$((8000 + $(echo "$SUPERSET_WORKSPACE_NAME" | md5sum | grep -oE '[0-9]+' | head -1 | cut -c1-3)))
echo "PORT=$PORT_BASE" >> .env

# Start services
docker-compose up -d

echo "✓ Services running on port $PORT_BASE"
docker-teardown.sh:
#!/usr/bin/env bash
set -euo pipefail

# Stop and remove containers
docker-compose down -v

echo "✓ Services stopped"

Example 4: Monorepo with Selective Install

{
  "setup": ["./.superset/monorepo-setup.sh"],
  "teardown": ["./.superset/monorepo-cleanup.sh"]
}
monorepo-setup.sh:
#!/usr/bin/env bash
set -euo pipefail

# Determine which packages to install based on workspace name
if [[ "$SUPERSET_WORKSPACE_NAME" == *"frontend"* ]]; then
  echo "Installing frontend dependencies only"
  cd apps/web && bun install
elif [[ "$SUPERSET_WORKSPACE_NAME" == *"api"* ]]; then
  echo "Installing API dependencies only"
  cd apps/api && bun install
else
  echo "Installing all dependencies"
  bun install
fi

echo "✓ Dependencies installed"

Example 5: Multi-Stage Setup

{
  "setup": [
    "./.superset/stages/01-dependencies.sh",
    "./.superset/stages/02-database.sh",
    "./.superset/stages/03-build.sh",
    "./.superset/stages/04-verify.sh"
  ],
  "teardown": ["./.superset/cleanup.sh"]
}
This approach breaks setup into logical stages, making it easier to debug issues.

Script Best Practices

Use set -euo pipefail

Start scripts with:
#!/usr/bin/env bash
set -euo pipefail
Exits on error, unset variables, and pipe failures.

Provide Feedback

echo "Installing dependencies..."
bun install
echo "✓ Dependencies installed"
Let users know what’s happening.

Handle Failures Gracefully

command || echo "Warning: command failed"
optional-cleanup || true
Don’t break setup for non-critical failures.

Make Scripts Idempotent

[ -d venv ] || python3 -m venv venv
Safe to run multiple times without side effects.

Error Handling

Handle errors gracefully to prevent setup failures:
#!/usr/bin/env bash
set -euo pipefail

# Critical: exit if this fails
cp "$SUPERSET_ROOT_PATH/.env" .env

# Optional: continue if this fails
optional-command || echo "Warning: optional-command failed (continuing)"

# Always runs even if previous command fails
trap "echo 'Setup incomplete but workspace is usable'" EXIT

Performance Optimization

#!/usr/bin/env bash
set -euo pipefail

# Only install if package.json changed
if [ ! -d node_modules ] || [ package.json -nt node_modules ]; then
  echo "Installing dependencies..."
  bun install
else
  echo "Dependencies up to date, skipping install"
fi

Debugging Scripts

If setup or teardown scripts fail:

1. Check Script Output

Superset shows script output in the workspace creation dialog. Look for error messages.

2. Run Scripts Manually

Test scripts in a terminal:
cd ~/.superset/worktrees/my-project/test-workspace
export SUPERSET_WORKSPACE_NAME="test-workspace"
export SUPERSET_ROOT_PATH="$HOME/projects/my-project"
bash .superset/setup.sh

3. Add Debug Output

#!/usr/bin/env bash
set -euo pipefail
set -x  # Enable debug output

echo "DEBUG: SUPERSET_WORKSPACE_NAME=$SUPERSET_WORKSPACE_NAME"
echo "DEBUG: SUPERSET_ROOT_PATH=$SUPERSET_ROOT_PATH"
echo "DEBUG: PWD=$PWD"

# Your script logic...

4. Check Permissions

# Make scripts executable
chmod +x .superset/*.sh
chmod +x .superset/scripts/*.sh

Configuration Validation

Superset validates .superset/config.json when loading a project:
  • ✅ Valid JSON syntax
  • setup and teardown are arrays of strings
  • ✅ Script paths are relative (not absolute)
  • ⚠️ Warning if script files don’t exist
  • ⚠️ Warning if scripts aren’t executable
Common mistake: Using absolute paths in config.json. Always use relative paths:✅ Good: "./.superset/setup.sh"❌ Bad: "/Users/you/project/.superset/setup.sh"

Relationship with Presets

Setup scripts run before presets:
Workspace Creation Flow:
1. Create git worktree
2. Run setup scripts     ← Prepare environment
3. Start terminal
4. Run preset commands   ← Launch tools/agents
When to use setup scripts vs presets:
Use Setup Scripts ForUse Presets For
Copying .env filesLaunching agents
Installing dependenciesStarting dev servers
Running migrationsOpening terminals
Building assetsRunning tests
One-time initializationRepeated tasks
Setup scripts configure the workspace. Presets launch tools in the workspace.

Security Considerations

Setup and teardown scripts run with your user permissions. Be careful with:
  • Scripts from untrusted sources
  • Commands that modify files outside the workspace
  • Scripts that access sensitive data

Safe Practices

  1. Review scripts before running: Check .superset/ contents in new projects
  2. Limit scope: Only modify files within the workspace
  3. Avoid sudo: Setup scripts shouldn’t require elevated permissions
  4. Validate inputs: Don’t trust environment variables blindly
#!/usr/bin/env bash
set -euo pipefail

# Validate environment variables
if [ -z "${SUPERSET_WORKSPACE_NAME:-}" ]; then
  echo "Error: SUPERSET_WORKSPACE_NAME not set"
  exit 1
fi

if [ -z "${SUPERSET_ROOT_PATH:-}" ]; then
  echo "Error: SUPERSET_ROOT_PATH not set"
  exit 1
fi

# Your script logic...

Advanced Use Cases

Conditional Logic Based on Branch

#!/usr/bin/env bash
set -euo pipefail

# Get current branch name
BRANCH=$(git branch --show-current)

if [[ "$BRANCH" == feature/* ]]; then
  echo "Feature branch: using dev environment"
  cp "$SUPERSET_ROOT_PATH/.env.dev" .env
elif [[ "$BRANCH" == hotfix/* ]]; then
  echo "Hotfix branch: using production environment"
  cp "$SUPERSET_ROOT_PATH/.env.prod" .env
fi

Port Allocation

#!/usr/bin/env bash
set -euo pipefail

# Allocate unique port based on workspace name hash
PORT_BASE=$((8000 + $(echo "$SUPERSET_WORKSPACE_NAME" | md5sum | cut -c1-4 | sed 's/^0*//' || echo 0)))

echo "Allocated ports: $PORT_BASE - $((PORT_BASE + 10))"
echo "API_PORT=$PORT_BASE" >> .env
echo "WEB_PORT=$((PORT_BASE + 1))" >> .env

Caching Dependencies

#!/usr/bin/env bash
set -euo pipefail

CACHE_DIR="$SUPERSET_ROOT_PATH/.superset-cache/node_modules"

if [ -d "$CACHE_DIR" ]; then
  echo "Copying cached node_modules..."
  cp -R "$CACHE_DIR" node_modules
  bun install  # Update to latest
else
  echo "Installing dependencies from scratch..."
  bun install
  echo "Caching node_modules for future workspaces..."
  mkdir -p "$(dirname "$CACHE_DIR")"
  cp -R node_modules "$CACHE_DIR"
fi

Next Steps

Presets

Configure workspace presets that run after setup

Workspaces

Learn more about workspace creation

Quickstart

Create your first workspace with setup scripts

Worktrees

Understand git worktree mechanics