Paseo Cloud
For using Paseo across machines, with a team, or inside a company. Looking for design
diff --git a/packages/website/src/routes/docs.tsx b/packages/website/src/routes/docs.tsx
index 77d1ccb1f..b58934cb7 100644
--- a/packages/website/src/routes/docs.tsx
+++ b/packages/website/src/routes/docs.tsx
@@ -1,55 +1,23 @@
-import { createFileRoute, Link, Outlet } from "@tanstack/react-router";
+import { createFileRoute, Link, Outlet, useLocation } from "@tanstack/react-router";
import { Menu, X } from "lucide-react";
-import { useCallback, useState } from "react";
-import { type Doc, getDocs } from "~/docs";
+import { useCallback, useMemo, useState } from "react";
+import { DocsBreadcrumbs } from "~/components/docs-breadcrumbs";
+import { DocsNav } from "~/components/docs-nav";
+import { DocsOutline } from "~/components/docs-outline";
+import { buildDocsNavTree, getDoc, getDocs } from "~/docs";
import "~/styles.css";
export const Route = createFileRoute("/docs")({
component: DocsLayout,
});
-const ACTIVE_OPTIONS_EXACT = { exact: true };
-const MOBILE_ACTIVE_PROPS = { className: "text-foreground" };
-const DESKTOP_ACTIVE_PROPS = { className: "bg-muted text-foreground" };
-
-interface NavItem {
- name: string;
- href: string;
-}
-
-interface NavGroup {
- name: string | null;
- items: NavItem[];
-}
-
-const GROUP_LABELS: Record = {
- alternatives: "Alternatives",
-};
-
-function groupKey(doc: Doc): string | null {
- const idx = doc.slug.indexOf("/");
- return idx === -1 ? null : doc.slug.slice(0, idx);
-}
-
-function buildNavigation(): NavGroup[] {
- const groups = new Map();
- for (const doc of getDocs()) {
- const key = groupKey(doc);
- const items = groups.get(key) ?? [];
- items.push({ name: doc.frontmatter.nav, href: doc.href });
- groups.set(key, items);
- }
- const ordered: NavGroup[] = [];
- if (groups.has(null)) ordered.push({ name: null, items: groups.get(null)! });
- for (const [key, items] of groups) {
- if (key === null) continue;
- ordered.push({ name: GROUP_LABELS[key] ?? key, items });
- }
- return ordered;
-}
-
function DocsLayout() {
- const groups = buildNavigation();
+ const location = useLocation();
+ const tree = useMemo(() => buildDocsNavTree(getDocs()), []);
+
+ const slug = location.pathname === "/docs" ? "" : location.pathname.slice("/docs/".length);
+ const doc = getDoc(slug);
+
const [mobileNavOpen, setMobileNavOpen] = useState(false);
const toggleMobileNav = useCallback(() => setMobileNavOpen((v) => !v), []);
const closeMobileNav = useCallback(() => setMobileNavOpen(false), []);
@@ -57,7 +25,7 @@ function DocsLayout() {
return (
{/* Mobile header */}
-
+
-
+
{/* Desktop sidebar */}
-
);
diff --git a/packages/website/src/routes/download.tsx b/packages/website/src/routes/download.tsx
index 8bf2cfaff..99579a6c7 100644
--- a/packages/website/src/routes/download.tsx
+++ b/packages/website/src/routes/download.tsx
@@ -33,7 +33,7 @@ function Download() {
const urls = downloadUrls(release);
return (
-
+
Download
v{version}
diff --git a/packages/website/src/routes/privacy.tsx b/packages/website/src/routes/privacy.tsx
index 0f793eeaf..ffe49c3fe 100644
--- a/packages/website/src/routes/privacy.tsx
+++ b/packages/website/src/routes/privacy.tsx
@@ -14,7 +14,7 @@ export const Route = createFileRoute("/privacy")({
function Privacy() {
return (
-
+
Privacy Policy
diff --git a/packages/website/src/routes/sponsor.tsx b/packages/website/src/routes/sponsor.tsx
index 78f1fb208..f5affb9a6 100644
--- a/packages/website/src/routes/sponsor.tsx
+++ b/packages/website/src/routes/sponsor.tsx
@@ -14,7 +14,7 @@ export const Route = createFileRoute("/sponsor")({
function Sponsor() {
return (
-
+
Sponsor
{/* Founder note */}
diff --git a/packages/website/src/server-entry.ts b/packages/website/src/server-entry.ts
index 65a6958f8..1f48e9854 100644
--- a/packages/website/src/server-entry.ts
+++ b/packages/website/src/server-entry.ts
@@ -33,6 +33,12 @@ export default {
return Response.redirect(url.toString(), 301);
}
+ const altRedirectMatch = url.pathname.match(/^\/docs\/alternatives\/(.+?)\/?$/);
+ if (altRedirectMatch) {
+ url.pathname = `/alternatives/${altRedirectMatch[1]}`;
+ return Response.redirect(url.toString(), 301);
+ }
+
if (url.pathname === "/llms.txt") {
return markdownResponse(buildLlmsTxt());
}
diff --git a/packages/website/vite.config.ts b/packages/website/vite.config.ts
index 0433198a9..6b9bea956 100644
--- a/packages/website/vite.config.ts
+++ b/packages/website/vite.config.ts
@@ -22,8 +22,11 @@ function discoverDocsRoutes(): string[] {
continue;
}
if (!entry.name.endsWith(".md")) continue;
- const rel = path.relative(docsDir, full).replace(/\.md$/, "");
- if (rel === "index") continue;
+ const rel = path
+ .relative(docsDir, full)
+ .replace(/\.md$/, "")
+ .replace(/\/index$/, "");
+ if (rel === "index" || rel === "") continue;
routes.add(`/docs/${rel.split(path.sep).join("/")}`);
}
};
@@ -54,6 +57,17 @@ function discoverAgentRoutes(): string[] {
.map((slug) => `/${slug}`);
}
+function discoverAlternativeRoutes(): string[] {
+ const alternativesDir = path.join(__dirname, "src/routes/alternatives");
+ if (!fs.existsSync(alternativesDir)) return [];
+ const slugs = fs
+ .readdirSync(alternativesDir, { withFileTypes: true })
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".tsx"))
+ .map((entry) => entry.name.replace(/\.tsx$/, ""))
+ .sort();
+ return ["/alternatives", ...slugs.map((slug) => `/alternatives/${slug}`)];
+}
+
function discoverBlogRoutes(): string[] {
const postsDir = path.join(__dirname, "posts");
if (!fs.existsSync(postsDir)) return ["/blog"];
@@ -73,6 +87,7 @@ const sitemapPages = [
"/download",
"/privacy",
...discoverAgentRoutes(),
+ ...discoverAlternativeRoutes(),
...discoverDocsRoutes(),
...discoverBlogRoutes(),
].map((routePath) => ({
diff --git a/public-docs/best-practices.md b/public-docs/best-practices.md
deleted file mode 100644
index 88505fc79..000000000
--- a/public-docs/best-practices.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-title: Best practices
-description: Tips for getting the most out of Paseo and mobile-first agent workflows.
-nav: Best practices
-order: 17
----
-
-# Best practices
-
-What I've learned from using Paseo daily. Not rules, just patterns that have worked for me.
-
-## Agents replace typing, not thinking
-
-Your role has changed. You're no longer the one writing code line by line. You're the one making decisions: what to build, how it should work, what the architecture looks like. The agent executes, but you direct.
-
-You can't just say "implement feature X" and walk away. You still have to do the hard part: deciding what to build, how it fits into the system, what trade-offs to make. Thinking is not optional. At least for now, agents replace the typing, not the thinking.
-
-## Verification loops
-
-The agent needs a way to verify its work. TDD is one implementation of this pattern: get the agent to write a failing test, verify it fails for the right reasons, then tell it to make the test pass. The agent can loop on its own because it knows what "done" means.
-
-## Invest in tooling
-
-It's not just test runners. For web apps, something like Playwright MCP lets the agent take screenshots and verify UI changes. For a SaaS app I built a CLI that wraps all the business logic so the agent could launch jobs, check statuses, and scrape data without going through the UI.
-
-Code is cheap with coding agents. I would have never written that CLI before because it felt like wasted effort. Now I bootstrap tooling first. It pays off exponentially.
-
-## Agents are cheap
-
-Don't be shy about running multiple agents. Paseo lets you launch agents in isolated worktrees. Kick one off with voice while walking, then kick off another. They work independently. You get a notification when they're done.
-
-## Use voice extensively
-
-It's much more natural to use voice to communicate ideas and pull them out of your brain. The agent will parse and organize your thoughts better than if you try to write the perfect prompt. You don't need to organize anything. Just talk.
-
-Current speech-to-text models are really good. They catch accents, acronyms, technical terms. And even when they don't, the LLM will infer what you meant.
-
-## Understand the type of work
-
-Sometimes you need to plan: design a spec, verify it, get the agent to follow through. Maybe it takes a couple of agents to work through it. Other times it's conversational: kick off a single agent and start talking, asking questions. Match your approach to the task.
-
-## Iterate and refactor often
-
-Don't expect perfect. Expect working. Make it work, make it correct, make it beautiful. Each iteration gets you closer. With tests, refactoring is cheap.
-
-I don't let myself add too many features before stopping to refactor. Sometimes I kick off an agent and have it trace code paths, explain dependencies, show me how modules connect. I make mental notes during code review and circle back.
-
-## Use agents to check agents
-
-If an agent implements something and you ask it to review its own work, it will never find issues. Launch a separate agent with a fresh context to review the first agent's code. It will catch things the first agent missed or glossed over. An agent might say it's done when it's not. Another agent can detect that.
-
-## Learn your agents' quirks
-
-People argue about which model is better. That's the wrong question. Each model has strengths and weaknesses. Knowing them is more useful than chasing benchmarks. Benchmarks don't mean anything. You need to try the models yourself to form an opinion.
-
-I use Claude Code as my main driver because it's quick and uses tools well. But sometimes it jumps to conclusions and gives up too easily. Codex is frustratingly slow but goes deep, doesn't stop, and is methodical. It's also stubborn and too serious. These aren't good or bad traits, just differences you learn to work around. Use the right model for the job.
diff --git a/public-docs/claude-code.md b/public-docs/claude-code.md
index 44ddb206f..83ece5d6b 100644
--- a/public-docs/claude-code.md
+++ b/public-docs/claude-code.md
@@ -2,7 +2,8 @@
title: Claude Code
description: How Paseo runs Claude Code and how Anthropic's usage policy applies.
nav: Claude Code
-order: 7
+order: 23
+category: Providers
---
# Claude Code
@@ -57,4 +58,4 @@ Paseo has first-class terminal support. You can run Claude Code in your terminal
- [Anthropic: Use the Claude Agent SDK with your Claude plan](https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan)
- [Custom providers](/docs/custom-providers), for custom binaries, third-party endpoints, or multiple Claude profiles.
- [Supported providers](/docs/supported-providers), for other agents you can run alongside Claude Code.
-- [Paseo vs Claude Desktop](/docs/alternatives/claude-desktop), for a feature comparison.
+- [Paseo vs Claude Desktop](/alternatives/claude-desktop), for a feature comparison.
diff --git a/public-docs/cli.md b/public-docs/cli.md
index 6af28b531..371528241 100644
--- a/public-docs/cli.md
+++ b/public-docs/cli.md
@@ -2,7 +2,8 @@
title: CLI
description: "Paseo CLI reference: manage agents, daemons, permissions, and worktrees from your terminal."
nav: CLI
-order: 8
+order: 3
+category: Getting started
---
# CLI
diff --git a/public-docs/configuration.md b/public-docs/configuration.md
index 7f07342dd..3d66bf91c 100644
--- a/public-docs/configuration.md
+++ b/public-docs/configuration.md
@@ -2,7 +2,8 @@
title: Configuration
description: Configure Paseo via config.json, environment variables, and CLI overrides.
nav: Configuration
-order: 14
+order: 40
+category: Configuration
---
# Configuration
diff --git a/public-docs/custom-providers.md b/public-docs/custom-providers.md
index 6e2706925..0e0ca34b4 100644
--- a/public-docs/custom-providers.md
+++ b/public-docs/custom-providers.md
@@ -2,7 +2,8 @@
title: Custom providers
description: Configure custom providers, alternative endpoints, profiles, custom binaries, and ACP agents in ~/.paseo/config.json.
nav: Custom providers
-order: 7
+order: 22
+category: Providers
---
# Custom providers
diff --git a/public-docs/index.md b/public-docs/index.md
index 1c2deba50..99ebb8999 100644
--- a/public-docs/index.md
+++ b/public-docs/index.md
@@ -3,6 +3,7 @@ title: Getting started
description: Install Paseo and start running coding agents from anywhere.
nav: Getting started
order: 1
+category: Getting started
---
# Getting started
diff --git a/public-docs/mcp.md b/public-docs/mcp.md
index a16826a9c..4cd5e8ca4 100644
--- a/public-docs/mcp.md
+++ b/public-docs/mcp.md
@@ -2,7 +2,8 @@
title: Paseo MCP
description: Paseo MCP tools injected into agents.
nav: Paseo MCP
-order: 9
+order: 30
+category: Automation
---
# Paseo MCP
diff --git a/public-docs/metadata-generation.md b/public-docs/metadata-generation.md
index 2c22ec069..48b9c9d6b 100644
--- a/public-docs/metadata-generation.md
+++ b/public-docs/metadata-generation.md
@@ -2,7 +2,8 @@
title: Metadata generation
description: How Paseo uses providers to generate agent titles, branch names, commit messages, and pull request text, and how to configure them.
nav: Metadata generation
-order: 15
+order: 42
+category: Configuration
---
# Metadata generation
diff --git a/public-docs/providers.md b/public-docs/providers.md
index 3b75d14ff..fbf5e0c84 100644
--- a/public-docs/providers.md
+++ b/public-docs/providers.md
@@ -2,7 +2,8 @@
title: Providers
description: How Paseo thinks about coding agents, wrapping existing CLIs, native vs ACP support, and where to go next.
nav: Providers
-order: 5
+order: 20
+category: Providers
---
# Providers
diff --git a/public-docs/schedules.md b/public-docs/schedules.md
index 8e6e7bed1..0c34fa02f 100644
--- a/public-docs/schedules.md
+++ b/public-docs/schedules.md
@@ -2,7 +2,8 @@
title: Schedules
description: Run Paseo agents on intervals or cron.
nav: Schedules
-order: 11
+order: 31
+category: Automation
---
# Schedules
diff --git a/public-docs/security.md b/public-docs/security.md
index 9f98a17a0..79d9c362f 100644
--- a/public-docs/security.md
+++ b/public-docs/security.md
@@ -2,7 +2,8 @@
title: Security
description: "Security model for Paseo: architecture overview, connection methods, relay encryption, and best practices."
nav: Security
-order: 16
+order: 4
+category: Getting started
---
# Security
diff --git a/public-docs/skills.md b/public-docs/skills.md
index 1ef6630b8..3e282027d 100644
--- a/public-docs/skills.md
+++ b/public-docs/skills.md
@@ -2,7 +2,8 @@
title: Orchestration skills
description: "Paseo orchestration skills: teach coding agents to spawn, coordinate, and manage other agents using slash commands."
nav: Skills
-order: 12
+order: 32
+category: Automation
---
# Orchestration skills
diff --git a/public-docs/supported-providers.md b/public-docs/supported-providers.md
index f64a5f410..1b8395682 100644
--- a/public-docs/supported-providers.md
+++ b/public-docs/supported-providers.md
@@ -2,7 +2,8 @@
title: Supported providers
description: Every coding agent Paseo can launch, natively supported providers and the ACP catalog.
nav: Supported providers
-order: 6
+order: 21
+category: Providers
---
# Supported providers
diff --git a/public-docs/updates.md b/public-docs/updates.md
index 365273ec5..e5a11eee2 100644
--- a/public-docs/updates.md
+++ b/public-docs/updates.md
@@ -2,7 +2,8 @@
title: Updates
description: How Paseo releases work, the difference between stable and beta channels, and how to opt in to earlier updates.
nav: Updates
-order: 18
+order: 5
+category: Getting started
---
# Updates
diff --git a/public-docs/voice.md b/public-docs/voice.md
index 2045e5218..bb6adbf1b 100644
--- a/public-docs/voice.md
+++ b/public-docs/voice.md
@@ -2,7 +2,8 @@
title: Voice
description: Paseo voice architecture, local-first model execution, and provider configuration.
nav: Voice
-order: 13
+order: 41
+category: Configuration
---
# Voice
diff --git a/public-docs/why.md b/public-docs/why.md
index d1d9fceab..307aaf599 100644
--- a/public-docs/why.md
+++ b/public-docs/why.md
@@ -3,6 +3,7 @@ title: Why Paseo?
description: What Paseo is, what it isn't, and how it fits into your workflow.
nav: Why Paseo?
order: 2
+category: Getting started
---
# Why Paseo?
diff --git a/public-docs/workspaces.md b/public-docs/workspaces.md
index 6aa4af945..70ed9b8af 100644
--- a/public-docs/workspaces.md
+++ b/public-docs/workspaces.md
@@ -2,7 +2,8 @@
title: Workspaces
description: Understand Paseo's project, workspace, and session model before setting up agents or git worktrees.
nav: Workspaces
-order: 3
+order: 10
+category: Workspaces
---
# Workspaces
diff --git a/public-docs/worktrees.md b/public-docs/worktrees.md
index 81dd66a03..2911d0d9b 100644
--- a/public-docs/worktrees.md
+++ b/public-docs/worktrees.md
@@ -2,7 +2,8 @@
title: Git worktrees
description: Run agents in isolated git worktrees with setup hooks, scripts, and long-running services.
nav: Git worktrees
-order: 4
+order: 11
+category: Workspaces
---
# Git worktrees