docs: the Guides destination is one word, and every language names its own package

The nav said Guides while the URL, the page title and the sidebar heading all
said Start, and the two guide folders a reader would look for under it sat
beside it instead. Now /docs/guides is the address, the title and the heading,
with migrate (40 pages) and integrations (17) nested inside it. 64 exact
redirect rules carry every old address.

The generator owns the flows and no longer wipes the directory it shares with
those folders, and its meta.json reads them off disk, so adding a guide folder
is a directory rather than an edit here.

On the landing page each code tab carries the install line for the package it
imports, so a reader copying the Python example installs hanzoai and not the
orchestration library that shares the name. Rust joins the row — the crate
exists and the tab did not. The Go install line named github.com/hanzoai/go,
which resolves to nothing; the module is go-sdk.
This commit is contained in:
2026-08-23 16:01:49 -07:00
parent 1771326bd0
commit a3bd53d0f0
77 changed files with 252 additions and 161 deletions
+2 -1
View File
@@ -27,7 +27,8 @@ public/openapi/
internal/
# Generated flow pages (six journeys x four surfaces) — see scripts/gen-flow-pages.ts
content/docs/start/
content/docs/guides/*.mdx
content/docs/guides/meta.json
# Generated MCP reference (one page per tool) — see scripts/gen-mcp-pages.ts.
# The tool list it renders from IS tracked (openapi-specs/mcp-tools.json).
+10 -4
View File
@@ -347,7 +347,7 @@ export default function Page() {
your own code.
</p>
<Tabs items={['CLI', 'TypeScript', 'Python', 'Go', 'HTTP']}>
<Tabs items={['CLI', 'TypeScript', 'Python', 'Go', 'Rust', 'HTTP']}>
<Tab value="CLI">
<CodeBlock
code={`hanzo auth login\n\nhanzo "explain quantum computing"\nhanzo models list\nhanzo projects deploy my-app`}
@@ -356,22 +356,28 @@ export default function Page() {
</Tab>
<Tab value="TypeScript">
<CodeBlock
code={`import Hanzo from '@hanzo/ai'\n\nconst hanzo = new Hanzo() // reads HANZO_API_KEY\n\nconst r = await hanzo.chat.completions.create({\n model: 'zen4',\n messages: [{ role: 'user', content: 'Hello!' }],\n})\nconsole.log(r.choices[0].message.content)`}
code={`// npm i @hanzo/ai\nimport Hanzo from '@hanzo/ai'\n\nconst hanzo = new Hanzo() // reads HANZO_API_KEY\n\nconst r = await hanzo.chat.completions.create({\n model: 'zen4',\n messages: [{ role: 'user', content: 'Hello!' }],\n})\nconsole.log(r.choices[0].message.content)`}
lang="typescript"
/>
</Tab>
<Tab value="Python">
<CodeBlock
code={`from hanzoai import Hanzo\n\nclient = Hanzo() # reads HANZO_API_KEY\n\nr = client.chat.completions.create(\n model="zen4",\n messages=[{"role": "user", "content": "Hello!"}],\n)\nprint(r.choices[0].message.content)`}
code={`# pip install hanzoai\nfrom hanzoai import Hanzo\n\nclient = Hanzo() # reads HANZO_API_KEY\n\nr = client.chat.completions.create(\n model="zen4",\n messages=[{"role": "user", "content": "Hello!"}],\n)\nprint(r.choices[0].message.content)`}
lang="python"
/>
</Tab>
<Tab value="Go">
<CodeBlock
code={`import "github.com/hanzoai/go-sdk"\n\nclient := hanzo.NewClient() // reads HANZO_API_KEY`}
code={`// go get github.com/hanzoai/go-sdk\nimport "github.com/hanzoai/go-sdk"\n\nclient := hanzo.NewClient() // reads HANZO_API_KEY`}
lang="go"
/>
</Tab>
<Tab value="Rust">
<CodeBlock
code={`// cargo add hanzo\nuse hanzo::Client;\n\nlet hanzo = Client::from_env()?; // reads HANZO_API_KEY`}
lang="rust"
/>
</Tab>
<Tab value="HTTP">
<CodeBlock
code={`curl https://api.hanzo.ai/v1/chat/completions \\\n -H "Authorization: Bearer $HANZO_API_KEY" \\\n -H "Content-Type: application/json" \\\n -d '{"model":"zen4","messages":[{"role":"user","content":"Hello!"}]}'`}
+1 -1
View File
@@ -199,7 +199,7 @@ export interface FeedbackTextProps {
/**
* A feedback component for each content block in page, should be used with `remark-feedback-block`.
*
* See https://hanzoai.github.io/docs/docs/integrations/feedback.
* See https://hanzoai.github.io/docs/docs/guides/integrations/feedback.
*/
export function FeedbackText({ onSendAction, children }: FeedbackTextProps) {
const [popup, _setPopup] = useState<{
+1 -1
View File
@@ -51,7 +51,7 @@ const TARGETS: Target[] = [
// Server
{ id: 'node', label: 'Node.js', kind: 'server', install: 'npm i @hanzo/event', docs: '/docs/sdks/typescript' },
{ id: 'python', label: 'Python', kind: 'server', install: 'pip install hanzoai', docs: '/docs/sdks/python' },
{ id: 'go', label: 'Go', kind: 'server', install: 'go get github.com/hanzoai/go', docs: '/docs/sdks/go' },
{ id: 'go', label: 'Go', kind: 'server', install: 'go get github.com/hanzoai/go-sdk', docs: '/docs/sdks/go' },
{ id: 'rust', label: 'Rust', kind: 'server', install: 'cargo add hanzo', docs: '/docs/sdks/rust' },
{ id: 'cpp', label: 'C++', kind: 'server', install: 'find_package(hanzo)', docs: '/docs/sdks/cpp' },
{ id: 'ruby', label: 'Ruby', kind: 'server', install: 'gem install hanzo' },
+5 -4
View File
@@ -16,9 +16,10 @@ import { HanzoDocsIcon } from '@/app/layout.client';
// Ordered the way a reader arrives: the whole thing, then the guided path
// through it, then the four surfaces they will write against.
//
// Guides points at /docs/start — six journeys, each shown as CLI, SDK, HTTP and
// MCP. "Start" is what the section is called on disk and not what anyone looks
// for in a nav bar; the page is unchanged and the word is the one people use.
// Guides points at /docs/guides: six task journeys, each written as CLI, SDK,
// HTTP and MCP, with the migration and integration guides nested beside them.
// The nav item, the URL, the page title and the sidebar heading are one word,
// which they were not — the nav said Guides and every other surface said Start.
export const linkItems: LinkItemType[] = [
{
// Exact, not nested: /docs is a prefix of every page here, so nesting would
@@ -29,7 +30,7 @@ export const linkItems: LinkItemType[] = [
},
{
text: 'Guides',
url: '/docs/start',
url: '/docs/guides',
active: 'nested-url',
},
{
+1 -1
View File
@@ -152,6 +152,6 @@ across vendors, though — `zen5` and `enso` exist only here.
<Cards>
<Card icon={<LayoutGrid />} title="Hanzo Dev" href="/docs/dev" description="AI-powered coding assistant for your terminal. Install, configure, and operate Hanzo Dev." />
<Card icon={<LayoutGrid />} title="Integrations" href="/docs/integrations" description="Connect blob storage, Slack, Mixpanel, and Insights to your project." />
<Card icon={<LayoutGrid />} title="Integrations" href="/docs/guides/integrations" description="Connect blob storage, Slack, Mixpanel, and Insights to your project." />
<Card icon={<LayoutGrid />} title="Integrations & Extensions" href="/docs/apps" description="Install and connect Hanzo across your browser, editor, desktop, docs, design tools, and business apps — one…" />
</Cards>
+1 -1
View File
@@ -8,7 +8,7 @@ Use these docs to install, configure, and operate Hanzo Dev.
## Start Here
- [Getting Started](/docs/start)
- [Getting Started](/docs/guides)
- [Installation](/docs/dev/getting-started/install)
- [Homebrew](/docs/dev/getting-started/homebrew)
- [Authentication](/docs/dev/getting-started/authentication)
@@ -47,7 +47,7 @@ Lands on `POST /v1/chat/completions`.
Put the key in a Worker secret — `wrangler secret put HANZO_API_KEY` — and it arrives on `this.env`. Streaming runs inside `ctx.waitUntil` so the Worker is not torn down while the response is still being written.
The other documented path is the AI SDK, which `AIChatAgent` and the starter template already use. Everything on the [Vercel AI SDK page](/docs/integrations/vercel-ai-sdk) applies unchanged inside a Cloudflare Agent.
The other documented path is the AI SDK, which `AIChatAgent` and the starter template already use. Everything on the [Vercel AI SDK page](/docs/guides/integrations/vercel-ai-sdk) applies unchanged inside a Cloudflare Agent.
## MCP
@@ -47,19 +47,19 @@ Hanzo's own tools are one MCP endpoint — `POST https://api.hanzo.ai/v1/mcp`, s
| Framework | Language | What you set | Where |
| --- | --- | --- | --- |
| [Agno](/docs/integrations/agno) | Python | `base_url` | `OpenAILike` |
| [AutoGen](/docs/integrations/autogen) | Python | `base_url` | `OpenAIChatCompletionClient` |
| [Claude Agent SDK](/docs/integrations/claude-agent-sdk) | TypeScript, Python | `ANTHROPIC_BASE_URL` | the environment |
| [Cloudflare Agents](/docs/integrations/cloudflare-agents) | TypeScript | `baseURL` | `new OpenAI()` |
| [CrewAI](/docs/integrations/crewai) | Python | `base_url` | `LLM` |
| [DSPy](/docs/integrations/dspy) | Python | `api_base` | `dspy.LM` |
| [Google ADK](/docs/integrations/google-adk) | Python | `api_base` | `LiteLlm` |
| [LangGraph](/docs/integrations/langgraph) | Python | `base_url` | `ChatOpenAI` |
| [Letta](/docs/integrations/letta) | any | base URL and key | the `/connect` flow |
| [LlamaIndex](/docs/integrations/llamaindex) | Python | `api_base` | `OpenAILike` |
| [Mastra](/docs/integrations/mastra) | TypeScript | `url` | the agent's `model` |
| [OpenAI Agents SDK](/docs/integrations/openai-agents) | Python | `base_url` | `AsyncOpenAI` |
| [Pydantic AI](/docs/integrations/pydantic-ai) | Python | `base_url` | `OpenAIProvider` |
| [Semantic Kernel](/docs/integrations/semantic-kernel) | .NET, Python | `endpoint`, `async_client` | `AddOpenAIChatCompletion` |
| [smolagents](/docs/integrations/smolagents) | Python | `api_base` | `OpenAIModel` |
| [Vercel AI SDK](/docs/integrations/vercel-ai-sdk) | TypeScript | `baseURL` | `createOpenAICompatible` |
| [Agno](/docs/guides/integrations/agno) | Python | `base_url` | `OpenAILike` |
| [AutoGen](/docs/guides/integrations/autogen) | Python | `base_url` | `OpenAIChatCompletionClient` |
| [Claude Agent SDK](/docs/guides/integrations/claude-agent-sdk) | TypeScript, Python | `ANTHROPIC_BASE_URL` | the environment |
| [Cloudflare Agents](/docs/guides/integrations/cloudflare-agents) | TypeScript | `baseURL` | `new OpenAI()` |
| [CrewAI](/docs/guides/integrations/crewai) | Python | `base_url` | `LLM` |
| [DSPy](/docs/guides/integrations/dspy) | Python | `api_base` | `dspy.LM` |
| [Google ADK](/docs/guides/integrations/google-adk) | Python | `api_base` | `LiteLlm` |
| [LangGraph](/docs/guides/integrations/langgraph) | Python | `base_url` | `ChatOpenAI` |
| [Letta](/docs/guides/integrations/letta) | any | base URL and key | the `/connect` flow |
| [LlamaIndex](/docs/guides/integrations/llamaindex) | Python | `api_base` | `OpenAILike` |
| [Mastra](/docs/guides/integrations/mastra) | TypeScript | `url` | the agent's `model` |
| [OpenAI Agents SDK](/docs/guides/integrations/openai-agents) | Python | `base_url` | `AsyncOpenAI` |
| [Pydantic AI](/docs/guides/integrations/pydantic-ai) | Python | `base_url` | `OpenAIProvider` |
| [Semantic Kernel](/docs/guides/integrations/semantic-kernel) | .NET, Python | `endpoint`, `async_client` | `AddOpenAIChatCompletion` |
| [smolagents](/docs/guides/integrations/smolagents) | Python | `api_base` | `OpenAIModel` |
| [Vercel AI SDK](/docs/guides/integrations/vercel-ai-sdk) | TypeScript | `baseURL` | `createOpenAICompatible` |
@@ -1,6 +1,7 @@
{
"$schema": "../../../../.docs/json-schema/docs.meta.json",
"title": "Frameworks",
"description": "Point any agent framework at Hanzo \u2014 the exact parameter, for sixteen frameworks.",
"description": "Point any agent framework at Hanzo — the exact parameter, for sixteen frameworks.",
"icon": "Component",
"pages": [
"agno",
@@ -20,4 +21,4 @@
"smolagents",
"vercel-ai-sdk"
]
}
}
@@ -0,0 +1,107 @@
---
title: Migrate
description: 39 vendors, each mapped to the Hanzo capability that answers it — how to start, nouns, the call before and after, and what does not carry.
icon: ArrowRightLeft
---
39 guides, one per vendor. Each one starts with the shortest path to a working
call, names the capability that answers the vendor, maps their nouns onto ours,
shows the same call both ways, and says plainly what you lose.
Every capability lives at one address — `/v1/<name>` — and the operation counts
below are read from the API document this site is built from.
## Hosting and delivery
| From | What it does | Capability |
|---|---|---|
| [Vercel](/docs/guides/migrate/vercel) | Building a repo and serving it on a domain | `/v1/platform` (37) · `/v1/projects` (27) |
| [Netlify](/docs/guides/migrate/netlify) | Static hosting, builds, edge functions and forms | `/v1/projects` (27) · `/v1/functions` (11) |
| [Render](/docs/guides/migrate/render) | Apps, cron and managed data stores | `/v1/platform` (37) · `/v1/provisioning` (28) |
| [Fly.io](/docs/guides/migrate/fly) | Machines placed in named regions | `/v1/platform` (37) · `/v1/visor` (34) |
| [Heroku](/docs/guides/migrate/heroku) | Dynos, buildpacks, pipelines and add-ons | `/v1/platform` (37) · `/v1/provisioning` (28) |
## Identity
| From | What it does | Capability |
|---|---|---|
| [Auth0](/docs/guides/migrate/auth0) | The identity provider your app redirects to | `/v1/iam` (159) |
| [Clerk](/docs/guides/migrate/clerk) | Drop-in auth components, users, orgs and sessions | `/v1/iam` (159) · `/v1/account` (10) |
| [WorkOS](/docs/guides/migrate/workos) | SSO, SCIM directory sync and audit logs | `/v1/iam` (159) · `/v1/audit` (1) |
| [Okta](/docs/guides/migrate/okta) | Enterprise SSO, lifecycle provisioning and MFA | `/v1/iam` (159) · `/v1/authz` (3) |
## Data and storage
| From | What it does | Capability |
|---|---|---|
| [Supabase](/docs/guides/migrate/supabase) | Postgres with auth, storage, realtime and vectors | `/v1/provisioning` (28) · `/v1/iam` (159) |
| [Firebase](/docs/guides/migrate/firebase) | Auth, documents, storage, functions and messaging | `/v1/iam` (159) · `/v1/kv` (6) |
| [PlanetScale](/docs/guides/migrate/planetscale) | A database with schema branches and deploy requests | `/v1/provisioning` (28) · `/v1/git` (44) |
| [Upstash](/docs/guides/migrate/upstash) | Serverless Redis, Kafka, scheduling and vectors | `/v1/kv` (6) · `/v1/mq` (15) |
| [Algolia](/docs/guides/migrate/algolia) | Search indexes with ranking, facets and typo tolerance | `/v1/index` (17) |
| [Pinecone](/docs/guides/migrate/pinecone) | Vector indexes, namespaces and metadata filters | `/v1/index` (17) · `/v1/knowledge` (9) |
## Observability and product
| From | What it does | Capability |
|---|---|---|
| [Datadog](/docs/guides/migrate/datadog) | Metrics, traces, logs, dashboards and monitors | `/v1/o11y` (381) · `/v1/metrics` (11) |
| [Sentry](/docs/guides/migrate/sentry) | Error tracking, releases and performance | `/v1/event` (12) · `/v1/o11y` (381) |
| [PostHog](/docs/guides/migrate/posthog) | Product analytics, flags, experiments and replay | `/v1/event` (12) · `/v1/flags` (8) |
| [Grafana](/docs/guides/migrate/grafana) | Dashboards, logs, traces and alerting | `/v1/o11y` (381) · `/v1/notify` (4) |
| [LaunchDarkly](/docs/guides/migrate/launchdarkly) | Which users see which behaviour | `/v1/flags` (8) · `/v1/experiment` (7) |
## Agents and inference
| From | What it does | Capability |
|---|---|---|
| [OpenAI platform](/docs/guides/migrate/openai) | Models, assistants and the platform around them | `/v1/ai` (272) · `/v1/agents` (37) |
| [Replicate](/docs/guides/migrate/replicate) | Running a model under a name | `/v1/ml` (7) · `/v1/ai` (272) |
| [Modal](/docs/guides/migrate/modal) | Serverless GPU functions, sandboxes and jobs | `/v1/functions` (11) · `/v1/sandbox` (19) |
| [LangSmith](/docs/guides/migrate/langsmith) | LLM tracing, datasets and evaluations | `/v1/o11y` (381) · `/v1/eval` (16) |
| [Composio](/docs/guides/migrate/composio) | Authenticated third-party tools for agents | `/v1/integrations` (48) |
| [E2B](/docs/guides/migrate/e2b) | Sandboxes for code an agent wrote | `/v1/sandbox` (19) · `/v1/exec` (4) |
| [Tavily](/docs/guides/migrate/tavily) | Web search and page extraction for agents | `/v1/websearch` (6) · `/v1/crawl` (1) |
## Messaging
| From | What it does | Capability |
|---|---|---|
| [Amazon SQS](/docs/guides/migrate/sqs) | Queues between services | `/v1/mq` (15) · `/v1/pubsub` (2) |
| [Twilio](/docs/guides/migrate/twilio) | Phone numbers, SMS and calls | `/v1/tel` (10) · `/v1/channels` (7) |
| [AgentMail](/docs/guides/migrate/agentmail) | Mailboxes an agent can send and read | `/v1/notify` (4) · `/v1/channels` (7) |
| [ElevenLabs](/docs/guides/migrate/elevenlabs) | Speech synthesis and transcription | `/v1/audio` (5) |
## Money and business
| From | What it does | Capability |
|---|---|---|
| [Stripe](/docs/guides/migrate/stripe) | Payments, subscriptions and invoices | `/v1/commerce` (181) · `/v1/billing` (45) |
| [Lago](/docs/guides/migrate/lago) | Metered billing and invoices | `/v1/billing` (45) · `/v1/usage` (11) |
| [DocuSign](/docs/guides/migrate/docusign) | Legally binding signatures on a document | `/v1/esign` (13) · `/v1/dataroom` (26) |
| [Carta](/docs/guides/migrate/carta) | Who owns what in a company | `/v1/captable` (31) |
| [GoDaddy](/docs/guides/migrate/godaddy) | Buying and holding domains | `/v1/domain` (7) |
## Secrets and automation
| From | What it does | Capability |
|---|---|---|
| [HashiCorp Vault](/docs/guides/migrate/vault) | Secrets, dynamic credentials and transit encryption | `/v1/kms` (5) |
| [Doppler](/docs/guides/migrate/doppler) | Secrets, held for an org | `/v1/kms` (5) |
| [Temporal](/docs/guides/migrate/temporal) | Durable workflows, retries and schedules | `/v1/auto` (17) · `/v1/tasks` (5) |
## The key carries the tenant
Every call below authenticates with one header:
```bash
-H "Authorization: Bearer $HANZO_API_KEY"
```
A secret key (`sk-`) resolves to a user; a publishable key (`pk-`) resolves to an
org. There is no org, user or project header to set — the gateway derives all
three from the validated key. Whatever your old vendor did with an account SID, a
workspace id, an entity or a project slug, here it is the key.
See [API keys](/docs/api-keys) for how to mint one, and [Errors](/docs/errors)
for the shape every failure takes.
@@ -1,4 +1,5 @@
{
"$schema": "../../../../.docs/json-schema/docs.meta.json",
"title": "Migrate",
"description": "39 vendors, each mapped to the capability that answers it.",
"icon": "ArrowRightLeft",
@@ -51,4 +52,4 @@
"doppler",
"temporal"
]
}
}
+1 -1
View File
@@ -153,7 +153,7 @@ one domain. Nothing is duplicated, so nothing is ambiguous.
{ name: 'Chat', href: '/docs/chat' },
{ name: 'Studio', href: '/docs/studio' },
{ name: 'Dev', href: '/docs/dev' },
{ name: 'Integrations', href: '/docs/integrations' },
{ name: 'Integrations', href: '/docs/guides/integrations' },
]}
>
The finished products built on the domains above — useful on their own, and a
+1 -3
View File
@@ -10,9 +10,7 @@
"cli",
"coding",
"---Guides---",
"start",
"migrate",
"integrations",
"guides",
"---Concepts---",
"concepts",
"glossary",
-107
View File
@@ -1,107 +0,0 @@
---
title: Migrate
description: 39 vendors, each mapped to the Hanzo capability that answers it — how to start, nouns, the call before and after, and what does not carry.
icon: ArrowRightLeft
---
39 guides, one per vendor. Each one starts with the shortest path to a working
call, names the capability that answers the vendor, maps their nouns onto ours,
shows the same call both ways, and says plainly what you lose.
Every capability lives at one address — `/v1/<name>` — and the operation counts
below are read from the API document this site is built from.
## Hosting and delivery
| From | What it does | Capability |
|---|---|---|
| [Vercel](/docs/migrate/vercel) | Building a repo and serving it on a domain | `/v1/platform` (37) · `/v1/projects` (27) |
| [Netlify](/docs/migrate/netlify) | Static hosting, builds, edge functions and forms | `/v1/projects` (27) · `/v1/functions` (11) |
| [Render](/docs/migrate/render) | Apps, cron and managed data stores | `/v1/platform` (37) · `/v1/provisioning` (28) |
| [Fly.io](/docs/migrate/fly) | Machines placed in named regions | `/v1/platform` (37) · `/v1/visor` (34) |
| [Heroku](/docs/migrate/heroku) | Dynos, buildpacks, pipelines and add-ons | `/v1/platform` (37) · `/v1/provisioning` (28) |
## Identity
| From | What it does | Capability |
|---|---|---|
| [Auth0](/docs/migrate/auth0) | The identity provider your app redirects to | `/v1/iam` (159) |
| [Clerk](/docs/migrate/clerk) | Drop-in auth components, users, orgs and sessions | `/v1/iam` (159) · `/v1/account` (10) |
| [WorkOS](/docs/migrate/workos) | SSO, SCIM directory sync and audit logs | `/v1/iam` (159) · `/v1/audit` (1) |
| [Okta](/docs/migrate/okta) | Enterprise SSO, lifecycle provisioning and MFA | `/v1/iam` (159) · `/v1/authz` (3) |
## Data and storage
| From | What it does | Capability |
|---|---|---|
| [Supabase](/docs/migrate/supabase) | Postgres with auth, storage, realtime and vectors | `/v1/provisioning` (28) · `/v1/iam` (159) |
| [Firebase](/docs/migrate/firebase) | Auth, documents, storage, functions and messaging | `/v1/iam` (159) · `/v1/kv` (6) |
| [PlanetScale](/docs/migrate/planetscale) | A database with schema branches and deploy requests | `/v1/provisioning` (28) · `/v1/git` (44) |
| [Upstash](/docs/migrate/upstash) | Serverless Redis, Kafka, scheduling and vectors | `/v1/kv` (6) · `/v1/mq` (15) |
| [Algolia](/docs/migrate/algolia) | Search indexes with ranking, facets and typo tolerance | `/v1/index` (17) |
| [Pinecone](/docs/migrate/pinecone) | Vector indexes, namespaces and metadata filters | `/v1/index` (17) · `/v1/knowledge` (9) |
## Observability and product
| From | What it does | Capability |
|---|---|---|
| [Datadog](/docs/migrate/datadog) | Metrics, traces, logs, dashboards and monitors | `/v1/o11y` (381) · `/v1/metrics` (11) |
| [Sentry](/docs/migrate/sentry) | Error tracking, releases and performance | `/v1/event` (12) · `/v1/o11y` (381) |
| [PostHog](/docs/migrate/posthog) | Product analytics, flags, experiments and replay | `/v1/event` (12) · `/v1/flags` (8) |
| [Grafana](/docs/migrate/grafana) | Dashboards, logs, traces and alerting | `/v1/o11y` (381) · `/v1/notify` (4) |
| [LaunchDarkly](/docs/migrate/launchdarkly) | Which users see which behaviour | `/v1/flags` (8) · `/v1/experiment` (7) |
## Agents and inference
| From | What it does | Capability |
|---|---|---|
| [OpenAI platform](/docs/migrate/openai) | Models, assistants and the platform around them | `/v1/ai` (272) · `/v1/agents` (37) |
| [Replicate](/docs/migrate/replicate) | Running a model under a name | `/v1/ml` (7) · `/v1/ai` (272) |
| [Modal](/docs/migrate/modal) | Serverless GPU functions, sandboxes and jobs | `/v1/functions` (11) · `/v1/sandbox` (19) |
| [LangSmith](/docs/migrate/langsmith) | LLM tracing, datasets and evaluations | `/v1/o11y` (381) · `/v1/eval` (16) |
| [Composio](/docs/migrate/composio) | Authenticated third-party tools for agents | `/v1/integrations` (48) |
| [E2B](/docs/migrate/e2b) | Sandboxes for code an agent wrote | `/v1/sandbox` (19) · `/v1/exec` (4) |
| [Tavily](/docs/migrate/tavily) | Web search and page extraction for agents | `/v1/websearch` (6) · `/v1/crawl` (1) |
## Messaging
| From | What it does | Capability |
|---|---|---|
| [Amazon SQS](/docs/migrate/sqs) | Queues between services | `/v1/mq` (15) · `/v1/pubsub` (2) |
| [Twilio](/docs/migrate/twilio) | Phone numbers, SMS and calls | `/v1/tel` (10) · `/v1/channels` (7) |
| [AgentMail](/docs/migrate/agentmail) | Mailboxes an agent can send and read | `/v1/notify` (4) · `/v1/channels` (7) |
| [ElevenLabs](/docs/migrate/elevenlabs) | Speech synthesis and transcription | `/v1/audio` (5) |
## Money and business
| From | What it does | Capability |
|---|---|---|
| [Stripe](/docs/migrate/stripe) | Payments, subscriptions and invoices | `/v1/commerce` (181) · `/v1/billing` (45) |
| [Lago](/docs/migrate/lago) | Metered billing and invoices | `/v1/billing` (45) · `/v1/usage` (11) |
| [DocuSign](/docs/migrate/docusign) | Legally binding signatures on a document | `/v1/esign` (13) · `/v1/dataroom` (26) |
| [Carta](/docs/migrate/carta) | Who owns what in a company | `/v1/captable` (31) |
| [GoDaddy](/docs/migrate/godaddy) | Buying and holding domains | `/v1/domain` (7) |
## Secrets and automation
| From | What it does | Capability |
|---|---|---|
| [HashiCorp Vault](/docs/migrate/vault) | Secrets, dynamic credentials and transit encryption | `/v1/kms` (5) |
| [Doppler](/docs/migrate/doppler) | Secrets, held for an org | `/v1/kms` (5) |
| [Temporal](/docs/migrate/temporal) | Durable workflows, retries and schedules | `/v1/auto` (17) · `/v1/tasks` (5) |
## The key carries the tenant
Every call below authenticates with one header:
```bash
-H "Authorization: Bearer $HANZO_API_KEY"
```
A secret key (`sk-`) resolves to a user; a publishable key (`pk-`) resolves to an
org. There is no org, user or project header to set — the gateway derives all
three from the validated key. Whatever your old vendor did with an account SID, a
workspace id, an entity or a project slug, here it is the key.
See [API keys](/docs/api-keys) for how to mint one, and [Errors](/docs/errors)
for the shape every failure takes.
+1 -1
View File
@@ -207,7 +207,7 @@ means and what it needs.
## Where to go next
- **[Six flows, four surfaces](/docs/start)** — hello, chat, money, store, agent,
- **[Six flows, four surfaces](/docs/guides)** — hello, chat, money, store, agent,
tools. The whole product in miniature, each journey shown four ways.
- **[Concepts](/docs/concepts)** — orgs, projects, sandboxes, agents, memory and
workflows. Read these once and the rest of the API explains itself.
+1 -1
View File
@@ -29,7 +29,7 @@ You need:
Go to [hanzo.id](https://hanzo.id) and sign in with email, GitHub, Google, or wallet. The first user to sign up under your domain becomes the owner. You are redirected to [console.hanzo.ai](https://console.hanzo.ai).
See [Getting Started](/docs/start) for the per-method details.
See [Getting Started](/docs/guides) for the per-method details.
## 2. Create your organization
+2 -2
View File
@@ -16,7 +16,7 @@ Credits land in the same [cloud-credit balance](/docs/openapi/billing) every pro
- **Bring your own compute.** Point Hanzo at your own GPUs or reserved cloud capacity and orchestrate them alongside Hanzo's -- your credits stretch further, and your workloads run where you want.
- **Priority support.** A direct line for architecture, scaling, and model-selection help.
Not accepted yet? You still start with **$5 in free trial credits, no card required** -- enough to make your first calls today. See [Getting Started](/docs/start).
Not accepted yet? You still start with **$5 in free trial credits, no card required** -- enough to make your first calls today. See [Getting Started](/docs/guides).
## Who Qualifies
@@ -39,7 +39,7 @@ Hanzo AI is a Techstars '17 company. Techstars-backed startups qualify for **cus
## Related
- [Getting Started](/docs/start) -- sign up, claim $5 free, and make your first call
- [Getting Started](/docs/guides) -- sign up, claim $5 free, and make your first call
- [Deploy on Hanzo](/docs/openapi/deploy) -- ship your app with one-click deploy
- [Credits & Billing](/docs/openapi/billing) -- how trial and prepaid credits work
- [Pricing](/docs/openapi/pricing) -- per-model and per-unit rates your credits pay for
@@ -146,6 +146,6 @@ ZAP implements defense-in-depth security:
## Next Steps
- [Getting Started](/docs/start) - Install and run your first ZAP agent
- [Getting Started](/docs/guides) - Install and run your first ZAP agent
- [Schema Language](/docs/zap/schema) - Learn the Cap'n Proto schema format
- [Protocol Specification](/docs/zap/protocol) - Understand the wire format
+68
View File
@@ -89,3 +89,71 @@
# on-ramp; deploy lives under the platform/paas services docs).
/docs/startups /docs/getting-started 301
/docs/deploy /docs/openapi/deploy 301
# The Guides destination: the nav item, the URL, the page title and the
# sidebar heading are one word now. These were /docs/start and two folders
# that sat beside it rather than inside it.
/docs/start /docs/guides 301
/docs/start/hello /docs/guides/hello 301
/docs/start/chat /docs/guides/chat 301
/docs/start/money /docs/guides/money 301
/docs/start/store /docs/guides/store 301
/docs/start/agent /docs/guides/agent 301
/docs/start/tools /docs/guides/tools 301
/docs/migrate/auth0 /docs/guides/migrate/auth0 301
/docs/migrate/firebase /docs/guides/migrate/firebase 301
/docs/migrate/composio /docs/guides/migrate/composio 301
/docs/migrate/vault /docs/guides/migrate/vault 301
/docs/migrate/elevenlabs /docs/guides/migrate/elevenlabs 301
/docs/migrate/heroku /docs/guides/migrate/heroku 301
/docs/migrate/render /docs/guides/migrate/render 301
/docs/migrate/tavily /docs/guides/migrate/tavily 301
/docs/migrate/openai /docs/guides/migrate/openai 301
/docs/migrate/twilio /docs/guides/migrate/twilio 301
/docs/migrate/fly /docs/guides/migrate/fly 301
/docs/migrate /docs/guides/migrate 301
/docs/migrate/planetscale /docs/guides/migrate/planetscale 301
/docs/migrate/supabase /docs/guides/migrate/supabase 301
/docs/migrate/langsmith /docs/guides/migrate/langsmith 301
/docs/migrate/carta /docs/guides/migrate/carta 301
/docs/migrate/algolia /docs/guides/migrate/algolia 301
/docs/migrate/sentry /docs/guides/migrate/sentry 301
/docs/migrate/clerk /docs/guides/migrate/clerk 301
/docs/migrate/godaddy /docs/guides/migrate/godaddy 301
/docs/migrate/okta /docs/guides/migrate/okta 301
/docs/migrate/upstash /docs/guides/migrate/upstash 301
/docs/migrate/posthog /docs/guides/migrate/posthog 301
/docs/migrate/sqs /docs/guides/migrate/sqs 301
/docs/migrate/modal /docs/guides/migrate/modal 301
/docs/migrate/workos /docs/guides/migrate/workos 301
/docs/migrate/datadog /docs/guides/migrate/datadog 301
/docs/migrate/lago /docs/guides/migrate/lago 301
/docs/migrate/replicate /docs/guides/migrate/replicate 301
/docs/migrate/doppler /docs/guides/migrate/doppler 301
/docs/migrate/temporal /docs/guides/migrate/temporal 301
/docs/migrate/grafana /docs/guides/migrate/grafana 301
/docs/migrate/netlify /docs/guides/migrate/netlify 301
/docs/migrate/pinecone /docs/guides/migrate/pinecone 301
/docs/migrate/e2b /docs/guides/migrate/e2b 301
/docs/migrate/vercel /docs/guides/migrate/vercel 301
/docs/migrate/agentmail /docs/guides/migrate/agentmail 301
/docs/migrate/stripe /docs/guides/migrate/stripe 301
/docs/migrate/docusign /docs/guides/migrate/docusign 301
/docs/migrate/launchdarkly /docs/guides/migrate/launchdarkly 301
/docs/integrations/google-adk /docs/guides/integrations/google-adk 301
/docs/integrations/letta /docs/guides/integrations/letta 301
/docs/integrations/mastra /docs/guides/integrations/mastra 301
/docs/integrations/pydantic-ai /docs/guides/integrations/pydantic-ai 301
/docs/integrations /docs/guides/integrations 301
/docs/integrations/langgraph /docs/guides/integrations/langgraph 301
/docs/integrations/semantic-kernel /docs/guides/integrations/semantic-kernel 301
/docs/integrations/crewai /docs/guides/integrations/crewai 301
/docs/integrations/vercel-ai-sdk /docs/guides/integrations/vercel-ai-sdk 301
/docs/integrations/agno /docs/guides/integrations/agno 301
/docs/integrations/dspy /docs/guides/integrations/dspy 301
/docs/integrations/cloudflare-agents /docs/guides/integrations/cloudflare-agents 301
/docs/integrations/claude-agent-sdk /docs/guides/integrations/claude-agent-sdk 301
/docs/integrations/openai-agents /docs/guides/integrations/openai-agents 301
/docs/integrations/smolagents /docs/guides/integrations/smolagents 301
/docs/integrations/llamaindex /docs/guides/integrations/llamaindex 301
/docs/integrations/autogen /docs/guides/integrations/autogen 301
+22 -7
View File
@@ -23,7 +23,7 @@ import { prose, text } from './mdx';
const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url));
const APP_ROOT = path.resolve(SCRIPT_DIR, '..');
const FLOWS = path.join(APP_ROOT, 'openapi-specs/flows.yaml');
const OUT_DIR = path.join(APP_ROOT, 'content/docs/start');
const OUT_DIR = path.join(APP_ROOT, 'content/docs/guides');
/**
* flows.yaml's shape: a map of flow id to a summary, the operationIds in CALL
@@ -173,7 +173,7 @@ function renderFlow(
function renderIndex(flows: Flow[], doc: Document): string {
const L: string[] = [];
L.push('---');
L.push('title: Start');
L.push('title: Guides');
L.push(
`description: ${JSON.stringify(
`One task per page, each written four ways: a CLI command, an SDK call, an HTTP request and an MCP tool.`,
@@ -184,7 +184,7 @@ function renderIndex(flows: Flow[], doc: Document): string {
L.push('');
L.push("import { Cards, Card } from '@hanzo/docs-base-ui/components/card'");
L.push('');
L.push('# Start');
L.push('# Guides');
L.push('');
// No counts in the prose. A number here is a fact about today's document that
// reads as a claim about the product, and it is wrong the next time the
@@ -223,7 +223,7 @@ function renderIndex(flows: Flow[], doc: Document): string {
L.push('');
L.push('<Cards>');
for (const f of flows) {
L.push(` <Card title=${JSON.stringify(f.title)} href="/docs/start/${f.id}">`);
L.push(` <Card title=${JSON.stringify(f.title)} href="/docs/guides/${f.id}">`);
L.push(` ${text(f.summary)}`);
L.push(' </Card>');
}
@@ -247,8 +247,13 @@ export async function genFlowPages(): Promise<void> {
const d = door(cat.tools);
const table = loadCliTable();
fs.rmSync(OUT_DIR, { recursive: true, force: true });
// Remove only what this generator writes. The authored guide folders
// (migrate, integrations) are siblings of these files, so a recursive wipe
// would delete them on every build.
fs.mkdirSync(OUT_DIR, { recursive: true });
for (const f of fs.readdirSync(OUT_DIR)) {
if (f.endsWith('.mdx') || f === 'meta.json') fs.rmSync(path.join(OUT_DIR, f));
}
let withCli = 0;
let withMcp = 0;
@@ -273,11 +278,21 @@ export async function genFlowPages(): Promise<void> {
path.join(OUT_DIR, 'meta.json'),
JSON.stringify(
{
title: 'Start',
title: 'Guides',
description: 'One task per page, each written as CLI, SDK, HTTP and MCP.',
// Not led by `index` — this folder's own `index.mdx` is its landing
// page already, and naming it publishes `Start > Start`.
pages: flows.map((f) => f.id),
// The flows, then the authored guide folders that live beside them.
// Read from disk rather than listed here, so adding one is a directory
// and not an edit to this generator.
pages: [
...flows.map((f) => f.id),
...fs
.readdirSync(OUT_DIR, { withFileTypes: true })
.filter((e) => e.isDirectory())
.map((e) => e.name)
.sort(),
],
},
null,
2,
+1 -1
View File
@@ -903,7 +903,7 @@ function renderIndex(cat: McpCatalog, doc: Document, groups: Map<string, McpTool
`**\`POST ${code(cat.door)}\`** is the agent-facing surface of the Hanzo cloud: one JSON-RPC 2.0 endpoint that answers \`tools/list\` with **${cat.meta.count} tools** and \`tools/call\` to run them. It is the same cloud the REST API serves — a tool here is an operation there, so an agent and a program reach identical behaviour.`,
);
L.push('');
L.push(`> [Browse the tool catalogue →](/docs/mcp-tools/all-tools) · [REST reference →](/docs/openapi) · [Get started →](/docs/start)`);
L.push(`> [Browse the tool catalogue →](/docs/mcp-tools/all-tools) · [REST reference →](/docs/openapi) · [Get started →](/docs/guides)`);
L.push('');
L.push('## Point a client at it');
+4 -4
View File
@@ -482,7 +482,7 @@ function renderOperation(
L.push('**Deprecated.** It still answers; a caller writing new code should not reach for it.');
L.push('');
}
L.push(`> [${text(p.title)} →](/docs/openapi/${p.name}) · [All API references →](/docs/openapi) · [Get started →](/docs/start)`);
L.push(`> [${text(p.title)} →](/docs/openapi/${p.name}) · [All API references →](/docs/openapi) · [Get started →](/docs/guides)`);
L.push('');
L.push('| | |');
L.push('|---|---|');
@@ -616,7 +616,7 @@ function renderReached(name: string, door: string, hips: Corpus): string {
'document, so it has no generated REST reference — it is reached another way.',
);
L.push('');
L.push(`> [All capabilities →](/docs/openapi) · [How the four surfaces line up →](/docs/start)`);
L.push(`> [All capabilities →](/docs/openapi) · [How the four surfaces line up →](/docs/guides)`);
L.push('');
L.push('| | |');
L.push('|---|---|');
@@ -674,7 +674,7 @@ function renderProduct(
const nav = [
'[All API references →](/docs/openapi)',
'[Get started →](/docs/start)',
'[Get started →](/docs/guides)',
];
L.push(`> ${nav.join(' · ')}`);
L.push('');
@@ -797,7 +797,7 @@ function renderIndex(
L.push('```');
L.push('');
L.push(
'Get a key at [console.hanzo.ai](https://console.hanzo.ai). New here? [Get started](/docs/start) walks the same journeys as CLI, SDK, HTTP and MCP.',
'Get a key at [console.hanzo.ai](https://console.hanzo.ai). New here? [Get started](/docs/guides) walks the same journeys as CLI, SDK, HTTP and MCP.',
);
L.push('');
L.push('## Start anywhere');