diff --git a/webapp/templates/dashboard.html b/webapp/templates/dashboard.html
index 98eaa19..90f711c 100644
--- a/webapp/templates/dashboard.html
+++ b/webapp/templates/dashboard.html
@@ -2468,27 +2468,43 @@
var serverHostname = {{ server_hostname | tojson }};
var webappUrl = serverHostname ? 'http://' + serverHostname : '';
+ var sshHost = 'data-analyst';
var instructions = 'Set up my AI Data Analyst local environment.\n\n'
- + 'Server: ' + serverHost + '\n'
- + 'Webapp: ' + webappUrl + '\n'
- + 'My username: ' + username + '\n'
- + 'SSH key: ~/.ssh/data_analyst_server (already generated)\n\n'
- + 'Please do the following:\n'
- + '1. Add SSH config entry: Host data-analyst, HostName ' + serverHost
- + ', User ' + username + ', IdentityFile ~/.ssh/data_analyst_server\n'
- + '2. Test SSH connection (ssh data-analyst echo ok)\n'
- + '3. Create project folders: server/ (docs, scripts, parquet, metadata, examples) '
- + 'and user/ (duckdb, notifications, artifacts, scripts, parquet, sessions)\n'
- + '4. Download everything from server via rsync:\n'
- + ' rsync -avz data-analyst:server/scripts/ ./server/scripts/\n'
- + ' rsync -avz data-analyst:server/docs/ ./server/docs/\n'
- + ' rsync -avz data-analyst:server/examples/ ./server/examples/\n'
- + ' rsync -avz data-analyst:server/metadata/ ./server/metadata/\n'
- + ' rsync -avz --progress data-analyst:server/parquet/ ./server/parquet/\n'
- + '5. Set up Python venv (.venv) with: pandas, pyarrow, duckdb, pyyaml, python-dotenv\n'
- + '6. Run bash server/scripts/setup_views.sh to initialize DuckDB\n'
- + '7. Create CLAUDE.md from server/docs/setup/claude_md_template.txt '
- + '(substitute {username} with my username)\n';
+ + 'Connection details:\n'
+ + ' Server IP: ' + serverHost + '\n'
+ + ' Webapp: ' + webappUrl + '\n'
+ + ' My username: ' + username + '\n'
+ + ' SSH key: ~/.ssh/data_analyst_server (already generated)\n\n'
+ + 'Steps:\n\n'
+ + '1. SSH config\n'
+ + ' Check ~/.ssh/config - if a Host entry named "' + sshHost + '" already exists\n'
+ + ' with a DIFFERENT server, ask me what name to use instead.\n'
+ + ' Otherwise add:\n'
+ + ' Host ' + sshHost + '\n'
+ + ' HostName ' + serverHost + '\n'
+ + ' User ' + username + '\n'
+ + ' IdentityFile ~/.ssh/data_analyst_server\n'
+ + ' StrictHostKeyChecking accept-new\n'
+ + ' Then test: ssh ' + sshHost + ' echo ok\n\n'
+ + '2. Create project folders (use explicit mkdir, not brace expansion):\n'
+ + ' mkdir -p server/docs server/scripts server/parquet server/metadata server/examples\n'
+ + ' mkdir -p user/duckdb user/notifications user/artifacts user/scripts user/parquet user/sessions\n\n'
+ + '3. Download from server via rsync (use --no-perms --no-group to avoid macOS permission errors).\n'
+ + ' Skip directories that don\'t exist on the server (rsync exit code 23 = missing source).\n'
+ + ' rsync -avz --no-perms --no-group ' + sshHost + ':server/scripts/ ./server/scripts/\n'
+ + ' rsync -avz --no-perms --no-group ' + sshHost + ':server/docs/ ./server/docs/\n'
+ + ' rsync -avz --no-perms --no-group ' + sshHost + ':server/examples/ ./server/examples/\n'
+ + ' rsync -avz --no-perms --no-group ' + sshHost + ':server/metadata/ ./server/metadata/\n'
+ + ' rsync -avz --no-perms --no-group --progress ' + sshHost + ':server/parquet/ ./server/parquet/\n'
+ + ' Note: some folders may be empty if data sync hasn\'t run on the server yet. That\'s OK.\n\n'
+ + '4. Set up Python venv:\n'
+ + ' python3 -m venv .venv\n'
+ + ' source .venv/bin/activate\n'
+ + ' pip install pandas pyarrow duckdb pyyaml python-dotenv\n\n'
+ + '5. Initialize DuckDB (only if server/scripts/setup_views.sh exists):\n'
+ + ' bash server/scripts/setup_views.sh\n\n'
+ + '6. Create CLAUDE.md (only if server/docs/setup/claude_md_template.txt exists):\n'
+ + ' Copy the template, replace {username} with ' + username + '\n';
var button = btn || document.getElementById('bootstrapCopyBtn');
var origText = button.textContent;