This guide walks you through running KubeStellar Console from source on your local machine for development or evaluation. For production deployments, see the Installation page.
| Requirement | Version | Check |
|---|---|---|
| Go | 1.25+ | go version |
| Node.js | 20+ | node --version |
| npm | 10+ | npm --version |
| kubectl | Latest | kubectl version --client |
| kubeconfig | At least cluster | kubectl config get-contexts |
| kubestellar-mcp plugins | Latest | which kubestellar-ops kubestellar-deploy |
The console requires kubestellar-ops and kubestellar-deploy MCP plugins. Install them via the Claude Code Marketplace or Homebrew:
Step 1: Install the plugins via the Claude Code Marketplace or Homebrew:
=== “Claude Code Marketplace (recommended)”
# In Claude Code, run:
/plugin marketplace add kubestellar/claude-plugins
Then install kubestellar-ops and kubestellar-deploy from the Discover tab.
=== “Homebrew”
brew tap kubestellar/tap
brew install kubestellar-ops kubestellar-deploy
Step 2: Verify both plugins are installed:
which kubestellar-ops && which kubestellar-deploy
See the kubestellar-mcp documentation for details.
For Windows users, we recommend using Windows Subsystem for Linux (WSL2) for the best experience.
For source-build-specific fixes, see Windows 11 Local Source Build Troubleshooting.
Install WSL2 (if not already installed):
wsl --install
Install Ubuntu (or your preferred distribution):
wsl --install -d Ubuntu
Update packages inside WSL:
sudo apt update && sudo apt upgrade -y
Install prerequisites inside WSL:
# Install Node.js
curl -H "Cache-Control: no-cache" -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Install Go
wget https://go.dev/dl/go1.25.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
# Install kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
Follow the standard setup instructions from within your WSL environment.
Note: Access your kubeconfig from Windows by mounting the Windows file system at /mnt/c/ in WSL.
git clone https://github.com/kubestellar/console.git
cd console
The simplest way to run the console locally. No GitHub credentials needed — a local dev-user session is created automatically.
./start-dev.sh
This script:
cd web && npm install)dev-user session (no GitHub login)The Vite dev server proxies API requests to the Go backend on port 8080.
For multi-user deployments or to test the complete authentication flow.
./startup-oauth.sh # Production build (recommended)
./startup-oauth.sh --dev # Vite dev server with hot reload
The --dev flag uses the Vite dev server (port 5174) with live module replacement instead of the production build. This is useful for frontend development but requires a GitHub OAuth app and .env file.
💡 Missing
.env?
startup-oauth.shrequires a.envfile withGITHUB_CLIENT_IDandGITHUB_CLIENT_SECRET. If the file is missing or incomplete, the script will exit with an error and print instructions for creating the.envfile.If you don’t need OAuth, use
./start-dev.shinstead — it runs without any credentials using a localdev-usersession.The manual steps below explain how to create the GitHub OAuth App and
.envfile.
KubeStellar Consolehttp://localhost:8080http://localhost:8080/auth/github/callback.env FileCreate a .env file in the repository root (same directory as startup-oauth.sh):
GITHUB_CLIENT_ID=your_client_id_here
GITHUB_CLIENT_SECRET=your_client_secret_here
Important: The
.envfile must be in the same directory asstartup-oauth.sh. The script reads it from its own directory. The file is.gitignored so your credentials are never committed.
./startup-oauth.sh # Production build (recommended)
./startup-oauth.sh --dev # Dev mode with Vite server
This script:
.envcd web && npm run build)The watchdog architecture improves reliability by keeping a stable frontend connection through backend restarts during development. The actual backend API runs on port 8081 but is transparent to the user.
Note: With
startup-oauth.sh, the watchdog on port 8080 proxies requests to the backend on port 8081, which serves both the API and the pre-built frontend. This architecture allows the console to survive backend restarts without disconnecting users. There is no separate Vite dev server (port 5174 is not used).
--dev flag)./startup-oauth.sh --dev
Uses the Vite dev server instead of the production build:
.envUse this for frontend development with live reload.
Note: This is useful when iterating on frontend features with OAuth enabled. For pure frontend development without authentication, use
./start-dev.shinstead.
| Variable | Description |
|---|---|
GITHUB_CLIENT_ID | GitHub OAuth App Client ID |
GITHUB_CLIENT_SECRET | GitHub OAuth App Client Secret |
| Variable | Description | Default |
|---|---|---|
GOOGLE_DRIVE_API_KEY | Enables benchmark cards (Latest Benchmark, Performance Explorer, Hardware Leaderboard, etc.) | Demo data fallback |
CLAUDE_API_KEY | Enables server-side AI features | Client-side API keys |
ENABLED_DASHBOARDS | Comma-separated list of dashboards to enable (reduces bundle size) | All dashboards |
| Port | Component | Script |
|---|---|---|
| 8080 | Watchdog/Frontend entrance (OAuth mode) or Go backend (dev mode) | startup-oauth.sh |
| 8081 | Go backend (OAuth mode with watchdog) | startup-oauth.sh (production build) |
| 5174 | Vite dev server (dev mode) | start-dev.sh or startup-oauth.sh --dev |
| 8585 | kc-agent (MCP + WebSocket) | Both scripts |
The startup-oauth.sh script includes a watchdog process that improves the development experience:
Without the watchdog, restarting the backend causes “connection refused” errors in the browser, forcing manual page refreshes.
The backend resolves its actual port through this priority:
BACKEND_PORT environment variable (set by the watchdog)| Feature | start-dev.sh | startup-oauth.sh | startup-oauth.sh --dev |
|---|---|---|---|
| GitHub login | No (local dev-user) | Yes (OAuth) | Yes (OAuth) |
| Frontend served by | Vite dev server (:5174) | Watchdog → Backend (:8080→8081) | Vite dev server (:5174) |
| Hot reload | Yes (Vite HMR) | No (must rebuild) | Yes (Vite HMR) |
.env required | No | Yes | Yes |
| kc-agent started | Yes (port 8585) | Yes (port 8585) | Yes (port 8585) |
| Watchdog proxy | No | Yes (survives restarts) | No |
| Best for | Development/coding | Testing OAuth, production-like setup | Frontend development with OAuth |
If you are working on multiple feature branches simultaneously, use git worktrees to avoid conflicts:
cd /path/to/console
git worktree add /tmp/console-my-feature -b my-feature-branch
cd /tmp/console-my-feature/web
npm install # worktrees share git but NOT node_modules
cd /tmp/console-my-feature
./startup-oauth.sh # or ./start-dev.sh
If you see “address already in use” errors:
# Find and kill processes on the ports
lsof -i :8080 | grep LISTEN
lsof -i :5174 | grep LISTEN
kill -9 <PID>
Both startup scripts attempt to clean up stale port processes automatically.
The kubestellar-mcp plugins are not installed. Install them with Homebrew or the Claude Code Marketplace:
brew tap kubestellar/tap
brew install kubestellar-ops kubestellar-deploy
You are running startup-oauth.sh without a .env file. Either:
.env file with your OAuth credentials (see Step 2 above)./start-dev.sh instead — it does not require OAuth credentialskubectl config get-contextskubectl --context=your-cluster get nodeswhich kubestellar-opsIf using start-dev.sh, the Vite dev server provides hot module replacement. If using startup-oauth.sh, you must restart the script after changing frontend code (it rebuilds on startup).