Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion website/blume.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { defineConfig } from "blume";
export default defineConfig({
title: "DevSpace",
description:
"The agent-agnostic orchestration layer for coding agents. Delegate to Codex, Claude Code, OpenCode, Cursor, and more as subagents, and program multi-agent loops as dynamic workflows.",
"Connect Grok Bot, ChatGPT, and Claude to your machine, and let any agent delegate to Codex, Claude Code, OpenCode, Cursor, and more.",
logo: { image: "/logos/devspace-blue.png", text: "DevSpace", href: "/" },
// Landing pages live at the site root; generated docs mount under /docs.
basePath: "/docs",
Expand All @@ -26,4 +26,7 @@ export default defineConfig({
code: { theme: { light: "github-light", dark: "github-dark" } },
},
deployment: { site: "https://devspace.run" },
seo: {
x: { handle: "@wshxnv", creator: "@wshxnv" },
},
});
3 changes: 3 additions & 0 deletions website/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ export default defineComponents({
mdx: {
Logos: "./ui/Logos.astro",
},
layout: {
TableOfContents: "./ui/DocsAside.astro",
},
});
2 changes: 1 addition & 1 deletion website/docs/connect/coding-agents.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Coding agents
description: Teach Codex, Claude Code, OpenCode, Cursor, or any skills-capable harness to delegate to the others through the devspace CLI — or drive them from a bot.
description: Teach Codex, Claude Code, OpenCode, Cursor, or any skills-capable harness to delegate to the others through the devspace CLI.
---

A coding harness does not need MCP to use DevSpace. It already has a shell.
Expand Down
10 changes: 7 additions & 3 deletions website/docs/connect/mcp-hosts.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Chat apps over MCP
description: Give ChatGPT, Claude, Grok Bot, OpenClaw, Hermes, or any MCP host a minimal coding harness on your own machine, through a tunnel you control.
title: Hosts over MCP
description: Give Grok Bot, ChatGPT, Claude, or any MCP host a coding harness on your own machine, through a tunnel you control.
---

<Logos set="hosts" />
Expand Down Expand Up @@ -84,14 +84,18 @@ sign in with the Owner password, and browse workspaces, turns, each call's
arguments and result, and each turn's diff. Turn it off with
`activity.enabled: false` — see [Configuration](/reference/configuration).

## Delegating from a chat app
## Delegating from an MCP host

There are no dedicated subagent MCP tools. The host runs
`devspace agents …` through its ordinary shell or process tool, and DevSpace
injects the opened workspace identity so agents stay scoped to that project.
`subagents.instructions` decides whether the workflow is read on demand
(default) or preloaded into `open_workspace`.

This gives a proactive agent like Grok Bot a team of coding agents: it keeps
planning and following up, and hands the actual coding to the Codex or Claude
Code subscriptions you already have instead of spending its own usage.

:::note
Using DevSpace as a custom connector is a standard MCP App setup and writing or
running code is not a restricted use case. Your account is still governed by
Expand Down
2 changes: 1 addition & 1 deletion website/docs/connect/tool-surfaces.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Tool surfaces
description: The exact MCP tools DevSpace exposes to a host — Codex-style for ChatGPT, Claude-style for Claude and other hosts — and how the surface is chosen.
description: The MCP tools DevSpace exposes to a host — Codex-style for ChatGPT, Claude-style for other hosts — and how the surface is chosen.
---

DevSpace keeps the model-facing surface small and gives each host the tools
Expand Down
6 changes: 3 additions & 3 deletions website/docs/index.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Introduction
description: DevSpace is an agent-agnostic orchestration layer. Any coding harness can delegate to any other as a subagent, and program multi-agent loops as dynamic workflows — on your own machine.
description: "An agent-agnostic orchestration layer: any coding harness can delegate to any other as a subagent, or run dynamic workflows on your machine."
sidebar:
icon: house
---
Expand Down Expand Up @@ -36,8 +36,8 @@ combine work from the rest.

## Orchestrate from anywhere

The orchestrator is whichever model you already talk to — a chat app over MCP,
or a coding agent from its own shell.
The orchestrator is whichever model you already talk to — a proactive agent or chat app
over MCP, or a coding agent from its own shell.

<Logos set="hosts" />

Expand Down
21 changes: 19 additions & 2 deletions website/islands/DelegationDiagram.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,17 @@
const TICKS_PER_STEP = 8;
const TICK_MS = 550;
const AGENT_IDS = ["7Kq2", "Q9m4", "Xb31", "Lp58", "Tn0d", "Ve66", "Rw29", "Zc74"];
// Agent rows, matching `.dm__agents li` height and gap in routing.css, so the
// fan's curves land on each row's centre.
const AGENT_ROW = 38;

Check failure on line 19 in website/islands/DelegationDiagram.tsx

View workflow job for this annotation

GitHub Actions / Smoke (macos-latest)

anti-slop(require-readable-spacing)

website/islands/DelegationDiagram.tsx:19:1: Expected blank line before this statement.
const AGENT_GAP = 9;
const FAN_HEIGHT = PROVIDERS.length * AGENT_ROW + (PROVIDERS.length - 1) * AGENT_GAP;
const fanCurve = (i: number) => {

Check failure on line 22 in website/islands/DelegationDiagram.tsx

View workflow job for this annotation

GitHub Actions / Smoke (macos-latest)

anti-slop(require-readable-spacing)

website/islands/DelegationDiagram.tsx:22:1: Expected blank line before this statement.
const y = i * (AGENT_ROW + AGENT_GAP) + AGENT_ROW / 2;
const mid = FAN_HEIGHT / 2;

return `M0 ${mid} C 55 ${mid}, 45 ${y}, 100 ${y}`;
};

type Phase = "idle" | "running" | "completed";

Expand Down Expand Up @@ -58,7 +69,7 @@

return (
<Fit width={DESIGN_WIDTH}>
<div className="ds-diagram dm" role="img" aria-label="Illustration: a host such as ChatGPT delegates through DevSpace to coding agents, which run and then complete">
<div className="ds-diagram dm" role="img" aria-label="Illustration: a host such as Grok Bot delegates through DevSpace to coding agents, which run and then complete">
<div className="ds-diagram__bar">
<span className="ds-diagram__dots"><i /><i /><i /></span>
<span>host: <b>{host.name}</b></span>
Expand Down Expand Up @@ -86,7 +97,13 @@

<div className="dm__core"><img className="dm__logo dm__logo--light" src="/logos/devspace-blue.png" alt="" width="27" height="28" /><img className="dm__logo dm__logo--dark" src="/logos/devspace-tile.png" alt="" width="28" height="28" /><b>DevSpace</b></div>

<div className={`dm__wire ${phase === "running" ? "on" : ""}`}><i /></div>
<svg className="dm__fan" style={{ height: FAN_HEIGHT }} viewBox={`0 0 100 ${FAN_HEIGHT}`} preserveAspectRatio="none" aria-hidden="true">
{PROVIDERS.map((p, i) => {
const active = routed && targets.includes(i);

return <path key={p.id} d={fanCurve(i)} className={active ? `on dm__fan--${phase}` : ""} />;
})}
</svg>

<ul className="dm__agents">
{PROVIDERS.map((p, i) => {
Expand Down
2 changes: 2 additions & 0 deletions website/landing/Icon.astro
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ const PATHS = {
copy: '<rect width="14" height="14" x="8" y="8" rx="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>',
check: '<path d="M20 6 9 17l-5-5"/>',
arrow: '<path d="M5 12h14"/><path d="m12 5 7 7-7 7"/>',
"arrow-up-right": '<path d="M7 7h10v10"/><path d="M7 17 17 7"/>',
"chevron-up": '<path d="m18 15-6-6-6 6"/>',
download: '<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="m7 10 5 5 5-5"/><path d="M12 15V3"/>',
} as const;

Expand Down
53 changes: 48 additions & 5 deletions website/landing/Shell.astro
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,34 @@
bodyClass?: string;
}

const SITE = "https://devspace.run";
const {

Check failure on line 11 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (ubuntu-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:11:1: Expected blank line before this statement.

Check failure on line 11 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (macos-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:11:1: Expected blank line before this statement.

Check failure on line 11 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (windows-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:11:1: Expected blank line before this statement.
title = "DevSpace — let your coding agents delegate to each other",
description = "The agent-agnostic orchestration layer for coding agents. Delegate to Codex, Claude Code, OpenCode, Cursor, and more as subagents, and program multi-agent loops as dynamic workflows.",
title = "DevSpace — let your agents delegate to each other",
description = "Connect Grok Bot, ChatGPT, and Claude to your machine, and let any agent delegate to Codex, Claude Code, OpenCode, Cursor, and more.",
bodyClass,
} = Astro.props;
const url = new URL(Astro.url.pathname, SITE).href;

Check failure on line 16 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (ubuntu-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:16:1: Expected blank line before this statement.

Check failure on line 16 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (macos-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:16:1: Expected blank line before this statement.

Check failure on line 16 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (windows-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:16:1: Expected blank line before this statement.
// Blume generates the home route's card; scripts/og-cards.mjs redraws it after the build.
const image = `${SITE}/og/index.png`;

Check failure on line 18 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (ubuntu-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:18:1: Expected blank line before this statement.

Check failure on line 18 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (macos-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:18:1: Expected blank line before this statement.

Check failure on line 18 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (windows-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:18:1: Expected blank line before this statement.
// Docs pages get Blume's WebSite and SoftwareApplication graph; the landing page
// uses its own shell, so it declares the same identity here.
const structuredData = {

Check failure on line 21 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (ubuntu-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:21:1: Expected blank line before this statement.

Check failure on line 21 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (macos-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:21:1: Expected blank line before this statement.

Check failure on line 21 in website/landing/Shell.astro

View workflow job for this annotation

GitHub Actions / Smoke (windows-latest)

anti-slop(require-readable-spacing)

website/landing/Shell.astro:21:1: Expected blank line before this statement.
"@context": "https://schema.org",
"@graph": [
{ "@type": "WebSite", "@id": `${SITE}/#website`, name: "DevSpace", url: `${SITE}/`, description },
{
"@type": "SoftwareApplication",
name: "DevSpace",
url: `${SITE}/`,
description,
applicationCategory: "DeveloperApplication",
operatingSystem: "macOS, Linux, Windows",
license: "https://opensource.org/licenses/MIT",
offers: { "@type": "Offer", price: 0, priceCurrency: "USD" },
sameAs: ["https://github.com/Waishnav/devspace", "https://www.npmjs.com/package/@waishnav/devspace"],
},
],
};
---

<!doctype html>
Expand All @@ -21,11 +44,31 @@
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{title}</title>
<meta name="description" content={description} />
<link rel="canonical" href={url} />
<meta name="theme-color" content="#f5f5f3" />
<link rel="icon" type="image/png" href="/logos/devspace-tile.png" />
<link rel="apple-touch-icon" href="/apple-icon.png" />
<link rel="sitemap" type="application/xml" href="/sitemap.xml" />

<meta property="og:type" content="website" />
<meta property="og:site_name" content="DevSpace" />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:url" content="https://devspace.run" />
<link rel="canonical" href="https://devspace.run/" />
<link rel="icon" type="image/png" href="/logos/devspace-tile.png" />
<meta property="og:url" content={url} />
<meta property="og:image" content={image} />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content={title} />

<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@wshxnv" />
<meta name="twitter:creator" content="@wshxnv" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={image} />

<script type="application/ld+json" set:html={JSON.stringify(structuredData)} />
</head>
<body class={bodyClass}>
<slot />
Expand Down
8 changes: 4 additions & 4 deletions website/landing/content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@ export const PILLARS = [
key: "harness",
kicker: "Harness over MCP",
title: "A coding harness inside your chat app.",
body: "ChatGPT, Claude, Grok Bot, OpenClaw, Hermes — open a workspace, read, patch, run tests, and review a diff card against your real checkout, through a tunnel you own.",
body: "ChatGPT and Claude — or proactive agents like Grok Bot, OpenClaw, and Hermes — open a workspace, read, patch, run tests, and review a diff card against your real checkout, through a tunnel you own.",
href: "/docs/connect/mcp-hosts",
},
{
key: "subagents",
kicker: "Subagents",
title: "Any harness can call any other.",
body: "Codex hands implementation to Claude Code. Claude asks Codex for review. One CLI, one daemon, compact XML the model reads directly — and worktrees so parallel writers never collide.",
body: "Grok Bot hands its coding to the Codex and Claude Code subscriptions you already pay for. Claude asks Codex for review. One CLI, one daemon, compact XML the model reads directly — and worktrees so parallel writers never collide.",
href: "/docs/orchestration/subagents",
},
{
Expand Down Expand Up @@ -82,11 +82,11 @@ export const FAQ = [
},
{
q: "Where can I orchestrate from?",
a: "Any MCP host with remote connectors — ChatGPT and Claude, or MCP-capable Grok Bot, OpenClaw, Hermes, and Muse setups — through a tunnel you own. Coding agents like Codex and Claude Code orchestrate too, straight from their shell.",
a: "Any MCP host with remote connectors — proactive agents like Grok Bot, chat apps like ChatGPT and Claude, or MCP-capable OpenClaw, Hermes, and Muse setups — through a tunnel you own. Coding agents like Codex and Claude Code orchestrate too, straight from their shell.",
},
{
q: "Do I need a tunnel?",
a: "Only if you want a chat app to drive it over MCP. Coding agents call the devspace CLI directly: install one skill and no server is needed.",
a: "Only if you want a chat app or proactive agent to drive it over MCP. Coding agents call the devspace CLI directly: install one skill and no server is needed.",
},
{
q: "Does my code leave my machine?",
Expand Down
10 changes: 7 additions & 3 deletions website/landing/home/Landing.astro
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Icon from "../Icon.astro";
import PixelField from "./PixelField.astro";
import HeroStage from "./HeroStage.astro";
import WorkflowStage from "./WorkflowStage.astro";
import SkillsPopover from "./SkillsPopover.astro";
import InstallCommand from "./InstallCommand.astro";
import { Code } from "astro:components";
import { workbenchLightTheme } from "./theme";
Expand All @@ -28,6 +29,7 @@ effort: high
<div class="nav__left">
<a class="brand" href="/"><img src="/logos/devspace-blue.png" alt="" width="26" height="27" style="margin-right: 9px" />DevSpace</a>
<a href={DOCS}>Docs</a>
<a href="/docs/orchestration/subagents">Subagents</a>
<a href="/docs/orchestration/dynamic-workflows">Workflows</a>
<a href="/docs/roadmap">Roadmap</a>
<a href={GITHUB}>GitHub</a>
Expand All @@ -41,7 +43,7 @@ effort: high
<main class="frame">
<section class="hero">
<div class="hero__left">
<a class="tag" href="/docs/orchestration/dynamic-workflows">v1.1 · dynamic workflows, experimental <span>→</span></a>
<a class="tag" href="/docs/orchestration/subagents">v1.1 · subagents and dynamic workflows <span>→</span></a>
<h1>Give ChatGPT and Claude access to your computer.</h1>
</div>
<div class="hero__right">
Expand Down Expand Up @@ -145,7 +147,7 @@ effort: high
</section>

<section class="cta">
<h2>Stop deciding what to prompt next.</h2>
<h2>Stop deciding what to prompt next.<br /><span>Let the model decide that.</span></h2>
<InstallCommand />
<div class="hero__cta">
<button class="btn btn--dark btn--lg btn--command" data-copy={INSTALL} data-install-command>
Expand All @@ -158,8 +160,9 @@ effort: high

<footer class="foot">
<span>devspace.run — MIT licensed</span>
<span><a href={DOCS}>Docs</a> · <a href={GITHUB}>GitHub</a> · <a href="https://x.com/wshxnv">@wshxnv</a></span>
<span><a href={DOCS}>Docs</a> · <a href={GITHUB}>GitHub</a> · <a href="https://x.com/wshxnv">@wshxnv</a> · <a href="https://gitcms.dev">GitCMS</a></span>
</footer>
<SkillsPopover />
</Shell>

<style is:global>
Expand Down Expand Up @@ -294,6 +297,7 @@ effort: high

.cta { padding: 110px 44px; display: flex; flex-direction: column; align-items: center; gap: 32px; text-align: center; }
.cta h2 { margin: 0; font-size: clamp(28px, 3.4vw, 44px); letter-spacing: -0.035em; font-weight: 600; }
.cta h2 span { color: var(--muted); }

.foot {
max-width: 1296px; margin: 0 auto; padding: 22px 12px 90px;
Expand Down
4 changes: 2 additions & 2 deletions website/landing/home/RoutingMap.astro
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ const curve = (x1: number, y1: number, x2: number, y2: number) =>
`M${x1} ${y1} C ${x1 + (x2 - x1) * 0.55} ${y1}, ${x2 - (x2 - x1) * 0.55} ${y2}, ${x2} ${y2}`;
---

<div class="mock" data-map role="img" aria-label="Illustration: any chat app or coding agent on the left routes through DevSpace to any of seven coding agents on the right">
<div class="mock" data-map role="img" aria-label="Illustration: any proactive agent, chat app, or coding agent on the left routes through DevSpace to any of seven coding agents on the right">
<div class="mock__bar">
<span class="mock__dots"><i></i><i></i><i></i></span>
<span class="mock__title">devspace · <b>any host → any agent</b></span>
<span class="mock__pill" data-caption>ChatGPT → Codex</span>
<span class="mock__pill" data-caption>Grok Bot → Codex + Pi</span>
</div>

<div class="mock__body map">
Expand Down
Loading
Loading