> ## Documentation Index
> Fetch the complete documentation index at: https://www.thundercompute.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# SSH on Thunder Compute

> Use the Thunder Compute Console to manage SSH keys and copy the manual SSH command for an instance.

export const QuickstartCard = ({ title, icon, href, children, selected }) => {
  const enter = e => { if (selected) return; const el = e.currentTarget; el.style.borderColor = '#555'; el.querySelector('[data-title]').style.color = '#fff'; el.querySelector('[data-sub]').style.opacity = '0.7'; el.querySelector('[data-icon]').style.opacity = '0.7'; };
  const leave = e => { if (selected) return; const el = e.currentTarget; el.style.borderColor = '#333'; el.querySelector('[data-title]').style.color = ''; el.querySelector('[data-sub]').style.opacity = '0.5'; el.querySelector('[data-icon]').style.opacity = '0.35'; };
  return (
  <a href={href} className="group" style={{ textDecoration: 'none', borderBottom: 'none', color: 'inherit', display: 'block', marginBottom: '0.75rem' }}>
    <div className="border rounded-xl p-5 transition-all duration-150 border-zinc-200 dark:border-zinc-800" style={{
      minHeight: '8rem',
      height: '100%',
      borderWidth: '1.5px',
      borderColor: selected ? '#95c5ea' : '#333',
    }} onMouseEnter={enter} onMouseLeave={leave}>
      <div data-icon style={{ marginBottom: '0.75rem', opacity: selected ? 1 : 0.35, transition: 'opacity 0.15s ease' }}>
        <Icon icon={icon} size={24} color="#95c5ea" />
      </div>
      <div data-title style={{ fontWeight: 600, fontSize: '1.05rem', marginBottom: '0.25rem', color: selected ? '#fff' : undefined, transition: 'color 0.15s ease' }}>{title}</div>
      <div data-sub style={{ fontSize: '0.9rem', opacity: selected ? 0.7 : 0.5, transition: 'opacity 0.15s ease' }}>{children}</div>
    </div>
  </a>
  );
};

<Columns cols={3}>
  <QuickstartCard title="VS Code" icon="window" href="/vscode/operations/ssh">
    Editor extension
  </QuickstartCard>

  <QuickstartCard title="CLI" icon="terminal" href="/cli/operations/ssh">
    Command line
  </QuickstartCard>

  <QuickstartCard title="Console" icon="browser" href="/console/operations/ssh" selected={true}>
    Web interface
  </QuickstartCard>
</Columns>

<Warning>
  You do not need manual SSH for normal Thunder Compute workflows. We highly recommend using the [VS Code extension](/vscode/operations/connecting-to-instances), [CLI](/cli/operations/connecting-to-instances), or [MCP server](/mcp-server/quickstart), which handle connection setup for you. Use the manual SSH command only when existing tooling requires raw SSH.
</Warning>

## Save an SSH key

Open [Authentication → SSH Keys (Advanced)](https://console.thundercompute.com/settings/ssh) in the console to add or remove organization keys.

Saved keys live at the org level, so everyone on your team can reuse them when creating instances.

## Attach a key when creating an instance

When launching an instance from the console, choose a saved key during creation.

Instances include the selected public key in `authorized_keys` at boot. You can add keys later via the [Add SSH key to instance](/api-reference/instances/add-ssh-key-to-instance) API endpoint.

## SSH manually

1. Click the instance row in the console to open instance details, then copy the command from **Manual SSH**.

2. From your local machine, run the copied command. Replace `<path_to_key>` with the private key that matches the saved public key:

   ```bash theme={null}
   ssh ubuntu@<instance-ip> -p <port> -i ~/.ssh/id_ed25519
   ```

   The console command already includes the instance IP, port, and `ubuntu` user.

## Quick troubleshooting

* **Permission denied:** make sure you are connecting as `ubuntu`, using the `-p <port>` from instance details, and that the matching private key exists locally.
* **Password requested:** re-check the IP, port, username, and private key. SSH asking for a password usually means key-based auth did not match the instance.
* **Host verification failed:** remove the old entry from `~/.ssh/known_hosts` and retry. New IPs will change fingerprints.
* **Still stuck?** Double-check the IP, port, and key, or send a message in [Discord](https://discord.com/invite/thundercompute) with the SSH output.
