diff --git a/apps/docs/content/docs/cli/cli-reference.mdx b/apps/docs/content/docs/cli/cli-reference.mdx
index c46d5347efc..3565651f14d 100644
--- a/apps/docs/content/docs/cli/cli-reference.mdx
+++ b/apps/docs/content/docs/cli/cli-reference.mdx
@@ -3,6 +3,10 @@ title: CLI Reference
description: Complete reference for Superset command-line interface, including commands and flags.
---
+
+The CLI is currently in Beta — commands and flags are still evolving. Make sure you're on the latest version of the CLI if you run into issues.
+
+
## Synopsis
```text
@@ -139,7 +143,7 @@ Auth: Session (expires in 32 min)
### start
-Start the local host service — the daemon the CLI and desktop app both
+Start the local host server — the daemon the CLI and desktop app both
talk to when targeting this machine.
If a manifest exists and the PID is alive, returns the existing
-instance's details. Otherwise spawns the host service binary, polls
+instance's details. Otherwise spawns the host server binary, polls
`/trpc/health.check` for up to 10 seconds, and writes the manifest.
Binds to `127.0.0.1` only.
@@ -159,7 +163,7 @@ superset start --daemon
```
-The running host service.
+The running host server.
```ts
@@ -175,7 +179,7 @@ The running host service.
### stop
-Stop the local host service.
+Stop the local host server.
Sends SIGTERM, waits up to 10 seconds, sends SIGKILL if still alive. The
@@ -186,7 +190,7 @@ superset stop
```
-The stopped host service, if one was running.
+The stopped host server, if one was running.
```ts
@@ -202,7 +206,7 @@ The stopped host service, if one was running.
### status
-Inspect the local host service.
+Inspect the local host server.
`healthy` reflects a live `health.check` request (2-second timeout).
@@ -212,7 +216,7 @@ superset status
```
-The host service state. Three shapes depending on what's running.
+The host server state. Three shapes depending on what's running.
```ts
@@ -244,7 +248,7 @@ The host service state. Three shapes depending on what's running.
### update
-Update the Superset CLI and host service binary.
+Update the Superset CLI and host server binary.
+", required: true, description: "Display name for the project." },
+ { flag: "--url ", description: "Clone from a Git URL. Mutually exclusive with `--path`." },
+ { flag: "--parent-dir ", description: "Where to clone into. Required with `--url`." },
+ { flag: "--path ", description: "Import an existing local repo. Mutually exclusive with `--url`." },
+ { flag: "--host ", description: "Target host. Defaults to the local machine." },
+ ]}
+ output={`{
+ projectId: string;
+ repoPath: string;
+ mainWorkspaceId: string | null;
+}`}
+>
+Register a project on a host. Two modes:
+
+- **Clone** — pass `--url` and `--parent-dir`. The host clones the repo
+ into `//`.
+- **Import** — pass `--path` to register a repo that already exists on disk.
+
+Either way, the cloud project row is created and the host's main workspace
+is ensured.
+
+```bash
+superset projects create --name "my-app" --url https://github.com/org/my-app.git --parent-dir ~/code
+superset projects create --name "my-app" --path ~/code/my-app
+```
+
+
---
### hosts
Discover hosts registered to the active organization. To control the
-host service running on this machine, use [`start`](#start),
+host server running on this machine, use [`start`](#start),
[`stop`](#stop), and [`status`](#status).
+The CLI is currently in Beta — commands and flags are still evolving. Make sure you're on the latest version of the CLI if you run into issues.
+
+
The Superset CLI (`superset`) is a single static binary that drives the same
backend as the desktop app. Use it to manage workspaces, tasks, automations,
-and the local host service from your terminal or from CI.
+and the local host server from your terminal or from CI.
## Install
-### macOS (Apple Silicon)
-
```bash
curl -fsSL https://app.superset.sh/install.sh | sh
```
-The script downloads the latest `superset-darwin-arm64` binary and installs
-it at `/usr/local/bin/superset`.
+The script auto-detects your platform (macOS Apple Silicon or Linux x86_64) and installs the binary at `/usr/local/bin/superset`.
-### Linux (x86_64)
+### Homebrew
```bash
-curl -fsSL https://app.superset.sh/install.sh | sh
+brew install superset-sh/tap/superset
```
-### From source
-
-```bash
-git clone https://github.com/superset-sh/superset.git
-cd superset
-bun install
-bun --filter @superset/cli build
-```
-
-The built binary lands at `packages/cli/dist/superset`.
-
## Sign in
```bash
@@ -45,21 +35,22 @@ The CLI starts a loopback callback server on `127.0.0.1:51789` (or `51790`
if busy), opens your browser to the consent page, and stores a session
token at `~/.superset/config.json`.
-If you belong to multiple organizations and stdout is a TTY, you'll be
-prompted to pick one. In CI or any non-TTY environment, pass it explicitly:
+If you belong to multiple organizations, you'll be prompted to pick one. To
+skip the prompt and pick directly:
```bash
superset auth login --organization acme
```
-To use an API key instead of OAuth (recommended for CI):
+For CI or other non-interactive environments — where there's no browser to
+complete the OAuth flow — use an API key instead:
```bash
export SUPERSET_API_KEY=sk_live_…
superset auth whoami
```
-API keys are issued from the **Settings → API Keys** page in the web app.
+API keys are issued from the **Settings → API Keys** page in the desktop app.
## Verify your session
@@ -73,24 +64,6 @@ Organization: Acme
Auth: Session (expires in 32 min)
```
-## Start the local host service
-
-The host service is the daemon that the CLI and desktop app both talk to
-when targeting the local machine. It manages workspaces, ports, and agent
-runs. The desktop app starts it automatically; from the CLI:
-
-```bash
-superset start --daemon
-```
-
-```bash
-superset status
-```
-
-Stop it again with `superset stop`. State is shared with the desktop
-app under `~/.superset/host//`, so a host service started
-by either client is visible to both.
-
## Run your first commands
List workspaces on the local machine:
@@ -140,8 +113,8 @@ output unless you pass `--quiet`.
## Local vs. remote hosts
`workspaces`, `projects`, and `automations create/update` accept a
-`--host ` flag to pick which host services the request. When omitted,
-the CLI targets the local machine, talks directly to the host service over
+`--host ` flag to pick which host handles the request. When omitted,
+the CLI targets the local machine, talks directly to the host server over
loopback, and works offline.
To target a different host:
@@ -158,8 +131,8 @@ identical.
```text
~/.superset/config.json # auth, active organization
-~/.superset/host//manifest.json # host service endpoint + token
-~/.superset/host//host.db # local host service DB
+~/.superset/host//manifest.json # host server endpoint + token
+~/.superset/host//host.db # local host server DB
```
`SUPERSET_HOME_DIR` relocates the whole tree, matching the desktop app.
diff --git a/apps/docs/content/docs/cli/host-server.mdx b/apps/docs/content/docs/cli/host-server.mdx
new file mode 100644
index 00000000000..5ffdd5967ea
--- /dev/null
+++ b/apps/docs/content/docs/cli/host-server.mdx
@@ -0,0 +1,128 @@
+---
+title: Host Server
+description: Set up the daemon the CLI and desktop app talk to when targeting the local machine.
+---
+
+The `superset start` command runs a headless HTTP server that any Superset desktop app or CLI can communicate with.
+
+It manages workspaces, ports, and agent runs on the machine it's running on. The desktop app starts it automatically; on a CLI-only or headless machine you start it yourself.
+
+## Prerequisites
+
+`git` and `gh` need to be on your `PATH`. `git` handles clone, worktree, and branch ops; `gh` handles PR checkout and metadata.
+
+```bash
+gh auth login
+```
+
+The host server reuses your existing `gh` auth. For sandboxes or CI, set `GH_TOKEN` (or `GITHUB_TOKEN`) instead of running `gh auth login` — `gh` picks it up automatically.
+
+### Agent CLIs (optional)
+
+If you plan to run AI agents inside workspaces, install whichever agent CLIs you want available. The host server launches them based on which are on your `PATH`:
+
+| Agent | Install |
+|-------|---------|
+| Claude Code | `npm install -g @anthropic-ai/claude-code` |
+| Codex | `npm install -g @openai/codex` |
+| Cursor Agent | install via Cursor's website |
+| Amp | `npm install -g @sourcegraph/amp` |
+| Gemini CLI | `npm install -g @google/gemini-cli` |
+| OpenCode | see [opencode.ai/docs](https://opencode.ai/docs) |
+
+None are required to start the host server or create workspaces — install only what you plan to run.
+
+## Authenticate the Superset CLI
+
+The host server starts under your Superset session. If you haven't already:
+
+```bash
+superset auth login
+```
+
+See [Getting Started](/cli/getting-started) for the full sign-in flow,
+including API-key auth for CI.
+
+## Start the host server
+
+```bash
+superset start --daemon
+```
+
+Spawns the daemon in the background and writes a manifest at
+`~/.superset/host//manifest.json` so other clients can find
+it. Binds to `127.0.0.1` only.
+
+Verify it's healthy:
+
+```bash
+superset status
+```
+
+## Getting started
+
+### Create a project
+
+A workspace branches off a project — a checked-out repo registered with
+Superset. Clone a remote repo or import an existing local one:
+
+```bash
+# Clone from a Git URL
+superset projects create \
+ --name "My Project" \
+ --url https://github.com/org/repo.git \
+ --parent-dir ~/code
+
+# Or import a repo that's already on disk
+superset projects create \
+ --name "My Project" \
+ --path ~/code/existing-repo
+```
+
+The host server clones (or registers) the repo, creates the cloud project
+record, and ensures the main workspace. Project records are shared across
+the organization, so once it exists, any machine in the org can host
+worktrees of it:
+
+```bash
+superset projects list
+```
+
+### Create your first workspace
+
+```bash
+superset projects list
+superset workspaces create \
+ --project prj_… \
+ --name "fix-login-bug" \
+ --branch fix/login-bug
+```
+
+The host server clones the project (if it isn't already on disk), creates
+a git worktree at the chosen branch, and registers the workspace.
+
+## Stop the host server
+
+```bash
+superset stop
+```
+
+## Shared state
+
+State lives under `~/.superset/host//`:
+
+```text
+~/.superset/host//manifest.json # endpoint + auth token
+~/.superset/host//host.db # local host server DB
+```
+
+A host server started by the desktop app is visible to the CLI and
+vice-versa. `SUPERSET_HOME_DIR` relocates the whole tree.
+
+## Command details
+
+For full flags, exit codes, and output shapes:
+
+- [`superset start`](/cli/cli-reference#superset-start)
+- [`superset status`](/cli/cli-reference#superset-status)
+- [`superset stop`](/cli/cli-reference#superset-stop)
diff --git a/apps/docs/content/docs/cli/meta.json b/apps/docs/content/docs/cli/meta.json
index 5874a81a249..fd29f140d8d 100644
--- a/apps/docs/content/docs/cli/meta.json
+++ b/apps/docs/content/docs/cli/meta.json
@@ -1,13 +1,5 @@
{
"title": "CLI",
- "description": "Command line interface",
"icon": "Terminal",
- "root": true,
- "pages": [
- "---Rocket Get Started---",
- "getting-started",
- "---BookOpen Reference---",
- "cli-reference",
- "env-vars"
- ]
+ "pages": ["getting-started", "cli-reference", "host-server", "env-vars"]
}
diff --git a/apps/docs/content/docs/installation.mdx b/apps/docs/content/docs/installation.mdx
deleted file mode 100644
index b14fdab9690..00000000000
--- a/apps/docs/content/docs/installation.mdx
+++ /dev/null
@@ -1,37 +0,0 @@
----
-title: Installation
-description: Get up and running with Superset in minutes
----
-
-
-
-## Quick Start
-
-1. **Download** - Get Superset for macOS
-2. **Sign in** - Create an account or sign in
-3. **Add a repo** - From local folder or Git URL
-4. **Create workspace** - Pick a branch and start working
-
-
-
-## Requirements
-
-- macOS (Apple Silicon or Intel)
-- Git installed
-- GitHub CLI authenticated (`gh auth status`)
-
-## Build from Source
-
-```bash
-git clone https://github.com/superset-sh/superset.git
-cd superset
-bun install
-bun run build
-```
-
-Windows and Linux coming soon.
-
-## Next Steps
-
-- [Your First Workspace](/first-workspace) - Detailed setup guide
-- [Setup Scripts](/setup-teardown-scripts) - Automate workspace init
diff --git a/apps/docs/content/docs/mcp.mdx b/apps/docs/content/docs/mcp.mdx
index 93f0b1ec346..87c0b27c362 100644
--- a/apps/docs/content/docs/mcp.mdx
+++ b/apps/docs/content/docs/mcp.mdx
@@ -3,43 +3,42 @@ title: MCP Server
description: Connect AI agents directly to Superset via MCP
---
+
+This document covers **MCP v2**. The v1 server is deprecated but still available at `https://api.superset.sh/api/agent/mcp` for existing integrations.
+
+
## Overview
Superset provides an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that lets AI agents interact with your tasks, workspaces, and devices programmatically.
## Capabilities
-| Category | Tools |
-|----------|-------|
-| **Tasks** | Create, update, list, get, delete tasks |
-| **Workspaces** | Create, update, switch, delete, list, navigate workspaces |
-| **Devices** | List devices, projects, and app context |
-| **Organization** | List members and task statuses |
-| **AI Sessions** | Start autonomous AI agent sessions (Amp, Claude, Codex, Gemini, OpenCode, Pi, Copilot, Cursor Agent) and subagents |
+| Category | Operations |
+|----------|------------|
+| **Tasks** | list, get (by id or slug), create, update, delete |
+| **Workspaces** | list (filterable by host), create on a host, delete |
+| **Automations** | list, get metadata, get/set prompt body, create, update metadata, pause, resume, run on demand, list runs, delete |
+| **Projects** | list projects, create from a Git URL or local repo path |
+| **Hosts** | list hosts (registered machines) you have access to |
## Setup
### CLI Options
-
-
-```bash title="terminal"
-amp mcp add --workspace superset https://api.superset.sh/api/agent/mcp
-```
-
+
```bash title="terminal"
-claude mcp add superset --transport http https://api.superset.sh/api/agent/mcp
+claude mcp add superset --transport http https://api.superset.sh/api/v2/agent/mcp
```
```bash title="terminal"
-codex mcp add superset --url https://api.superset.sh/api/agent/mcp
+codex mcp add superset --url https://api.superset.sh/api/v2/agent/mcp
```
```bash title="terminal"
-gemini mcp add --transport http superset https://api.superset.sh/api/agent/mcp
+gemini mcp add --transport http superset https://api.superset.sh/api/v2/agent/mcp
```
@@ -60,7 +59,7 @@ opencode mcp add
[2m│[0m [36mRemote[0m
[2m│[0m
[2m◇[0m Enter MCP server URL
-[2m│[0m [36mhttps://api.superset.sh/api/agent/mcp[0m
+[2m│[0m [36mhttps://api.superset.sh/api/v2/agent/mcp[0m
[2m│[0m
[2m◇[0m Does this server require OAuth authentication?
[2m│[0m [36mYes[0m
@@ -71,26 +70,18 @@ opencode mcp add
[2m└[0m [32mMCP server added successfully[0m
```
+
+```bash title="terminal"
+amp mcp add --workspace superset https://api.superset.sh/api/v2/agent/mcp
+```
+
### Manual Configuration
Alternatively, you can manually configure the MCP server for each client:
-
-
-Add to `.amp/settings.json` in your project root:
-
-```json title=".amp/settings.json"
-{
- "amp.mcpServers": {
- "superset": {
- "url": "https://api.superset.sh/api/agent/mcp"
- }
- }
-}
-```
-
+
Add a `.mcp.json` to your project root. Claude Code auto-discovers this file and handles OAuth authentication.
@@ -99,7 +90,7 @@ Add a `.mcp.json` to your project root. Claude Code auto-discovers this file and
"mcpServers": {
"superset": {
"type": "http",
- "url": "https://api.superset.sh/api/agent/mcp"
+ "url": "https://api.superset.sh/api/v2/agent/mcp"
}
}
}
@@ -113,7 +104,7 @@ Add to your `claude_desktop_config.json`:
"mcpServers": {
"superset": {
"type": "http",
- "url": "https://api.superset.sh/api/agent/mcp"
+ "url": "https://api.superset.sh/api/v2/agent/mcp"
}
}
}
@@ -126,7 +117,7 @@ Add to `.cursor/mcp.json` in your project root:
{
"mcpServers": {
"superset": {
- "url": "https://api.superset.sh/api/agent/mcp"
+ "url": "https://api.superset.sh/api/v2/agent/mcp"
}
}
}
@@ -137,7 +128,7 @@ Add to your `~/.codex/config.toml`:
```toml title="config.toml"
[mcp_servers.superset]
-url = "https://api.superset.sh/api/agent/mcp"
+url = "https://api.superset.sh/api/v2/agent/mcp"
```
@@ -147,7 +138,7 @@ Add to your `.gemini/settings.json`:
{
"mcpServers": {
"superset": {
- "httpUrl": "https://api.superset.sh/api/agent/mcp"
+ "httpUrl": "https://api.superset.sh/api/v2/agent/mcp"
}
}
}
@@ -162,7 +153,20 @@ Add to your `opencode.json`:
"mcp": {
"superset": {
"type": "remote",
- "url": "https://api.superset.sh/api/agent/mcp"
+ "url": "https://api.superset.sh/api/v2/agent/mcp"
+ }
+ }
+}
+```
+
+
+Add to `.amp/settings.json` in your project root:
+
+```json title=".amp/settings.json"
+{
+ "amp.mcpServers": {
+ "superset": {
+ "url": "https://api.superset.sh/api/v2/agent/mcp"
}
}
}
@@ -200,7 +204,7 @@ MCP clients that support custom headers can use this directly. For Claude Code,
"mcpServers": {
"superset": {
"type": "http",
- "url": "https://api.superset.sh/api/agent/mcp",
+ "url": "https://api.superset.sh/api/v2/agent/mcp",
"headers": {
"Authorization": "Bearer sk_live_your_api_key_here"
}
@@ -222,43 +226,52 @@ API keys grant full access to your organization. Keep them secret and never comm
## Available Tools
-### Task Management
+### Tasks
| Tool | Description |
|------|-------------|
-| `create_task` | Create one or more tasks (batch up to 25) |
-| `update_task` | Update existing tasks |
-| `list_tasks` | List tasks with filters (status, assignee, priority, labels) |
-| `get_task` | Get a single task by ID or slug |
-| `delete_task` | Soft delete tasks |
-| `list_task_statuses` | List available status options |
+| `tasks_list` | List tasks with optional filters (status, priority, assignee, free-text search) |
+| `tasks_get` | Get one task by UUID or slug |
+| `tasks_create` | Create a task in the active organization |
+| `tasks_update` | Update fields on an existing task |
+| `tasks_delete` | Hard-delete a task by UUID |
-### Workspace Management
+### Workspaces
| Tool | Description |
|------|-------------|
-| `create_workspace` | Create a new git worktree workspace. Pass `sourceWorkspaceId` to branch from an existing workspace instead of `main`. |
-| `update_workspace` | Update workspaces (rename) |
-| `switch_workspace` | Switch to a different workspace |
-| `delete_workspace` | Delete a workspace |
-| `list_workspaces` | List all workspaces on a device |
-| `get_workspace_details` | Get detailed information about a workspace on a device, including its tabs and panes. Use this to discover pane IDs. |
+| `workspaces_list` | List workspaces, optionally filtered by host |
+| `workspaces_create` | Create a workspace on a host (branch-scoped git worktree) |
+| `workspaces_delete` | Delete a workspace by UUID; idempotent |
+
+### Automations
-### Device & Organization
+| Tool | Description |
+|------|-------------|
+| `automations_list` | List automations the calling user owns |
+| `automations_get` | Get one automation's metadata (prompt body omitted) |
+| `automations_get_prompt` | Fetch the full markdown prompt for one automation |
+| `automations_create` | Schedule a recurring agent run with an RFC 5545 RRULE |
+| `automations_update` | Update metadata (name, schedule, agent, host); use `automations_set_prompt` to change the prompt |
+| `automations_set_prompt` | Replace the full markdown prompt body |
+| `automations_pause` | Pause an automation (schedule stops firing) |
+| `automations_resume` | Resume a paused automation |
+| `automations_run` | Dispatch an automation immediately, outside its schedule |
+| `automations_logs` | List recent runs for an automation |
+| `automations_delete` | Delete an automation |
+
+### Projects
| Tool | Description |
|------|-------------|
-| `list_devices` | List registered devices in your organization |
-| `list_projects` | List all projects on a device |
-| `get_app_context` | Get current app state (active workspace, pathname) |
-| `list_members` | List organization members |
+| `projects_list` | List projects (checked-out repos) in the active organization |
+| `projects_create` | Register a project on a host: clone a Git URL or import an existing local repo |
-### AI Sessions
+### Hosts
| Tool | Description |
|------|-------------|
-| `start_agent_session` | Start an autonomous AI agent session for a task in an existing workspace. Requires `taskId`. Supports Amp, Claude, Codex, Gemini, OpenCode, Pi, Copilot, Cursor Agent, and Superset Chat (defaults to Claude). When `paneId` is provided, adds a new pane to the tab containing that pane instead of initializing a new tab. |
-| `start_agent_session_with_prompt` | Start an autonomous AI agent session in an existing workspace using a direct `prompt` instead of a task. Supports Amp, Claude, Codex, Gemini, OpenCode, Pi, Copilot, Cursor Agent, and Superset Chat (defaults to Claude). When `paneId` is provided, adds a new pane to the tab containing that pane instead of initializing a new tab. |
+| `hosts_list` | List the hosts (registered machines) you have access to |
## Chat Integration
@@ -270,8 +283,7 @@ Once connected, you can ask your AI agent to:
- "Create a task for fixing the login bug"
- "List all my assigned tasks"
-- "Create a new workspace for the auth feature"
-- "Show me who's online in my team"
-- "Start a Claude session on my MacBook to work on the auth task"
-- "Start a Codex session in my auth workspace with the prompt 'fix the failing tests'"
-- "Spin up a subagent to fix the failing tests"
+- "Create a workspace for the auth feature on my MacBook"
+- "Schedule a daily automation that triages new Linear issues at 9am"
+- "Pause the nightly cleanup automation"
+- "Show me the last 10 runs of my Linear triage automation"
diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json
index 0394824d20d..6c1d2d6fdb8 100644
--- a/apps/docs/content/docs/meta.json
+++ b/apps/docs/content/docs/meta.json
@@ -2,7 +2,6 @@
"title": "Documentation",
"pages": [
"---Rocket Get Started---",
- "installation",
"overview",
"first-workspace",
"---Gauge Core Features---",
@@ -14,6 +13,11 @@
"agent-integration",
"automations",
"mcp",
+ "---Terminal CLI---",
+ "cli/getting-started",
+ "cli/cli-reference",
+ "cli/host-server",
+ "cli/env-vars",
"---BookOpen Guides---",
"setup-teardown-scripts",
"use-with-ide",
diff --git a/apps/docs/content/docs/overview.mdx b/apps/docs/content/docs/overview.mdx
index f8da282c654..14d44d7aae2 100644
--- a/apps/docs/content/docs/overview.mdx
+++ b/apps/docs/content/docs/overview.mdx
@@ -1,22 +1,29 @@
---
title: Overview
-description: Learn what Superset is and how it works
+description: Get started with Superset.
---
-## What is Superset?
+Superset is an open source AI coding platform. It's available as a desktop IDE, a command-line interface, or an MCP server.
-Superset is a desktop app for managing multiple codebases with git worktrees. Work on several branches simultaneously, each in its own isolated workspace.
+
-## Key Features
+Each git branch gets its own isolated workspace via git worktrees — no stashing, no `git checkout` whiplash. Run Claude Code, Cursor, and other agents in parallel across workspaces, open any of them in your IDE, and review/commit changes from a built-in diff viewer. Local-first; works offline and syncs when connected.
-- **Workspaces** - Each branch gets its own directory via git worktrees. No more stashing.
-- **Terminal** - Built-in terminal with persistent sessions per workspace.
-- **Diff Viewer** - Review changes, stage files, commit, and push.
-- **AI Agents** - Run Claude Code or other agents in isolated workspaces.
-- **IDE Integration** - Open any workspace in Cursor or VS Code.
+## Requirements
-## How It Works
+- macOS (Apple Silicon or Intel) — Windows and Linux coming soon
+- Git installed
+- GitHub CLI authenticated (`gh auth status`)
-Superset uses [git worktrees](https://git-scm.com/docs/git-worktree) to give each branch its own directory. Switch contexts instantly without losing your place.
+## Install desktop app
-Your data stays local. Superset works offline and syncs when connected.
+
+
+## What's next
+
+- **[Your First Workspace](/first-workspace)** — Setup walkthrough including IDE integration and AI agents
+- **[Workspaces](/workspaces)** — How worktrees power parallel branch work
+- **[Terminal](/terminal-integration)** — Persistent terminal sessions per workspace
+- **[Diff Viewer](/diff-viewer)** — Review, stage, and commit changes
+- **[AI Agents](/agent-integration)** — Run Claude Code, Cursor, and other agents in isolated workspaces
+- **[CLI](/cli/getting-started)** — Drive Superset from the command line
diff --git a/apps/docs/content/docs/ports.mdx b/apps/docs/content/docs/ports.mdx
index 3ec399859ed..fc7ecb225b4 100644
--- a/apps/docs/content/docs/ports.mdx
+++ b/apps/docs/content/docs/ports.mdx
@@ -62,6 +62,6 @@ If `ports.json` is malformed:
## Discovery and Updates
-Port discovery runs in each host service, not in the desktop renderer. The host service watches terminal process trees, scans for listening ports, resolves any matching port label, and publishes `port:changed` events when ports appear or disappear.
+Port discovery runs in each host server, not in the desktop renderer. The host server watches terminal process trees, scans for listening ports, resolves any matching port label, and publishes `port:changed` events when ports appear or disappear.
The desktop sidebar keeps one ports query per online host. It patches that cached host snapshot from port events, batching bursts so updates stay responsive without refetching every time a port changes. A slower fallback refetch still runs so the UI recovers if an event is missed during reconnect.
diff --git a/apps/docs/src/app/(docs)/components/Sidebar/Sidebar.tsx b/apps/docs/src/app/(docs)/components/Sidebar/Sidebar.tsx
index 5f575b1cb52..4f6ce0085c2 100644
--- a/apps/docs/src/app/(docs)/components/Sidebar/Sidebar.tsx
+++ b/apps/docs/src/app/(docs)/components/Sidebar/Sidebar.tsx
@@ -2,37 +2,21 @@
import { AnimatePresence, MotionConfig, motion } from "framer-motion";
import { useSearchContext } from "fumadocs-ui/contexts/search";
-import { Check, ChevronDownIcon, ChevronsUpDown, Search } from "lucide-react";
-import Link from "next/link";
+import { ChevronDownIcon, Search } from "lucide-react";
import { usePathname } from "next/navigation";
-import { useEffect, useMemo, useState } from "react";
+import { useEffect, useState } from "react";
import { AsideLink } from "@/components/AsideLink";
import { cn } from "@/lib/cn";
-import { getActiveProductId, products } from "./components/SidebarContent";
+import { sections } from "./components/SidebarContent";
export default function Sidebar() {
const pathname = usePathname();
- const activeProductId = useMemo(
- () => getActiveProductId(pathname),
- [pathname],
- );
- const activeProduct = useMemo(
- () => products.find((p) => p.id === activeProductId) ?? products[0],
- [activeProductId],
- );
- const sections = activeProduct?.sections ?? [];
-
- const [productMenuOpen, setProductMenuOpen] = useState(false);
const [openSections, setOpenSections] = useState(() =>
Array.from({ length: sections.length }, (_, i) => i),
);
const { setOpenSearch } = useSearchContext();
- useEffect(() => {
- setOpenSections(Array.from({ length: sections.length }, (_, i) => i));
- }, [sections.length]);
-
useEffect(() => {
const currentSection = sections.findIndex((section) =>
section.items.some((item) => item.href === pathname),
@@ -42,16 +26,7 @@ export default function Sidebar() {
prev.includes(currentSection) ? prev : [...prev, currentSection],
);
}
- }, [pathname, sections]);
-
- useEffect(() => {
- if (!productMenuOpen) return;
- const onKey = (event: KeyboardEvent) => {
- if (event.key === "Escape") setProductMenuOpen(false);
- };
- window.addEventListener("keydown", onKey);
- return () => window.removeEventListener("keydown", onKey);
- }, [productMenuOpen]);
+ }, [pathname]);
const toggleSection = (index: number) => {
setOpenSections((prev) =>
@@ -59,10 +34,6 @@ export default function Sidebar() {
);
};
- if (!activeProduct) return null;
-
- const ActiveIcon = activeProduct.Icon;
-
return (