← Back to the animated How-to guideFull recipe view

How-tos

Small recipes for the first useful PawFlow sessions.

Install the runtime, connect relays, configure providers, publish packages, and turn useful agent work into flows.

Agent routing, work state, delegation, continuations

Choose the tool that owns the job

Objective: keep agents from treating similar-looking tools as interchangeable. PawFlow gives each kind of context, delegation, orchestration, and waiting a distinct owner.

Delegate deliberatelydelegate talks to an existing conversation agent; flash_delegate creates disposable parallel workers; consult_agent is a tool-free one-shot second opinion; a2a calls a configured remote agent.
Track the right worktodolist is the current agent's unfinished-work ledger. Plans add approval, steps, assignment, and verification. assign_task runs a predefined autonomous job. Flows make repeatable work deterministic.
Resume instead of pollingUse Monitor for a short blocking command, schedule_continuation to end the turn and resume long work, and ScheduleWakeup for a future or recurring check.
Keep state scopedFacts belong in memory, relationships in the KG, agent lessons in the diary, unfinished work in todo, temporary evidence in scratchpad, and project structure/knowledge in the relay-scoped graph and wiki.

PawFlow injects a compact selection map containing only tools available to the active agent. The agent can then call get_tool_schema(family="delegation") for an on-demand comparison and get_tool_schema(tool_name="delegate") for exact parameters. The full technical decision map also covers search/read/edit tools, artifacts, notifications, resources, packages, skills, tasks, and flows.

Read the complete tool-selection guide

Install and relays

From first server to controlled workspaces.

Install script + wizard

Run the release installer and reach the first conversation

Objective: show the full first-run path from the shell script to the PawFlow conversation screen with assistant selected.

Terminal running the PawFlow release install script
1. Download the release zip, unzip it, and run scripts/install-pawflow.sh.
Video: install script, browser wizard, and first chat.
terminal
Loading current release command...
Gateway screenOpen https://localhost:19990/install, accept the local certificate for private installs, enter the bootstrap key, then replace it with your real Private Gateway key.
Admin screenCreate the first admin account. This user owns the initial runtime resources and can configure global agents/services.
LLM provider screenSelect the first provider: Codex interactive, Claude Code interactive, Antigravity/Agy, Gemini CLI, Anthropic, OpenAI, or an OpenAI-compatible endpoint. Codex app-server and Claude Code `cc -p` are legacy choices for existing configurations only.
Summarizer screenChoose the summarizer service and context limits so compaction is explicit and does not flood provider context.
Runtime screenDeploy the main PawFlow Agent flow: httpReceiver to agentLoop to handleHTTPResponse.
Conversation screenOpen the starter conversation, confirm assistant is selected, send a small prompt, and verify streaming output.
PawFlow installer gateway screen
Gateway and bootstrap key.
PawFlow installer admin account screen
Admin account.
PawFlow installer LLM provider screen
LLM service.
First PawFlow conversation after install
First conversation.

PawFlow runs on the selected port, the wizard is complete, and the first conversation can call your chosen provider.

Published conversation, stdio, CC, Codex, Agy/Gemini, OpenCode, JCode, Pi, Hermes

Install a published PawFlow conversation as a local MCP server

Objective: bind one Claude Code, Codex, Agy/Gemini, OpenCode, JCode, Pi, Hermes, or generic MCP client instance to exactly one PawFlow conversation and agent, while allowing other agents in that conversation to have independent MCP publications.

ChatGPT inspects the current MyWorkspace commits through a read-only PawFlow MCP session.
Read-only published MCP architecture from external clients through PawFlow policy gates to conversation context and relay-backed workspace reads
Read-only publications remove write tools during discovery and reject write calls again before execution.
WindowsDownload the ZIP, extract it, then run install.cmd or powershell -ExecutionPolicy Bypass -File .\install.ps1.
Linux and macOSExtract either archive, enter its directory, then run ./install.sh.
IsolationThe installer never changes global harness settings. It creates one private session bundle and prints the command that must launch that instance.
ConcurrencyEach published agent accepts one active client instance. Publish another attached agent from the same conversation for an independent endpoint, key set, lease, and terminal.

Download ZIP Download tar.gz

  1. Open the target conversation, then Resources → MCP Repository → Publish/configure this conversation.
  2. Select the attached agent, create an API key, and copy the endpoint and key immediately. Repeat with another attached agent when it needs its own publication.
  3. Extract the client archive and run the installer for the current OS.
  4. Enter a unique session name, endpoint, hidden API key, optional hidden gateway key, local project directory, and a comma-separated client subset from cc, codex, agy, opencode, jcode, pi, and hermes.
  5. Choose read-only or read/write access and whether shell execution is allowed. The secure default leaves shell execution disabled.
  6. Start the client with the session-bound command printed by the installer, confirm the MCP server is listed, then call pawflow_relay_status. It must report auto_default: false.

For any other MCP-compatible stdio client, use the generated mcp.json or entry.json in a dedicated client profile. Never merge it into a shared global profile: one local process must load one PawFlow session bundle.

Read the complete MCP client installation guide
AG-UI, CopilotKit

Embed a published agent in your own app with AG-UI

Objective: drive a PawFlow agent from any AG-UI client — CopilotKit and the wider AG-UI ecosystem — with streaming runs, frontend tools, shared state, and interrupts.

  1. Publish the agent once: Resources → A2A → publish, create a Bearer key. The same publication serves A2A and AG-UI.
  2. Point the AG-UI client at POST https://your-server/agui/{publication_id} with the Bearer key. A GET on the same URL returns the descriptor and its capabilities.
  3. Each AG-UI threadId becomes a durable server-side conversation (isolated context policy): the client can send full history, PawFlow only consumes what is new.
  4. Declare frontend tools in RunAgentInput.tools: the agent calls them by name, the call streams as TOOL_CALL_*, your app executes it and returns the result as a role:"tool" message in the next run.
  5. Use shared state for live UI sync: state seeds the document, every run opens with STATE_SNAPSHOT, and the agent's agui_state tool streams STATE_DELTA patches while it works.
  6. For approvals, the agent raises an interrupt (agui_interrupt): the run finishes with an interrupt outcome and your app answers through resume.

One publish action, three protocols: MCP for tools, A2A for agent-to-agent, AG-UI for your user-facing app.

Read the AG-UI integration guide
Desktop, noVNC, audio, screen tools

Use a relay desktop with noVNC, audio, screen, and see

Objective: explain the operator view and the agent-visible tools for desktop work. This applies to any relay running a desktop-capable image — server relay, remote Relay CLI, or Relay Desktop alike.

Desktop Relay noVNC session in the browser
Desktop (VNC): noVNC opens the relay desktop in the browser.
Audio-only relay streaming panel
Audio only: stream the relay's sound without opening a desktop.
Video: a text-only agent inspects the desktop through delegated vision, then acts through approved tools.
  1. Connect any relay whose image ships the virtual desktop (server relay, remote Relay CLI, or Relay Desktop); for a local GUI session, install Relay Desktop on the workstation that owns it.
  2. Open Desktop from the webchat workspace menu and choose the relay's virtual desktop, or the local desktop when allow_local is intentionally enabled.
  3. Use noVNC for operator observation/control; enable audio only for sessions that need sound playback or capture.
  4. Let agents inspect UI state through screen screenshots or see multimodal analysis, then approve clicks/typing/shell/file actions separately.
  5. Keep desktop permissions narrower than filesystem permissions when the task only needs visual inspection.

You watch the same desktop surface the agent sees, while agent actions stay routed through auditable screen/see/tool calls.

Read desktop docs
Delegated vision, text-only LLM, desktop

Give GLM 5.2 vision and desktop awareness through Gemma 4 Cloud

Objective: keep GLM 5.2 as the reasoning and tool-using model while a separate Gemma 4 Cloud service describes uploads, screenshots, and visual tool results.

Video: text-only GLM 5.2 opens Chromium, searches YouTube, and plays a song — every screenshot described by a separate vision model. Demo cut, narrated, and scored by a Claude agent inside PawFlow.
EyesGemma 4 Cloud receives each unique image and returns visible text, layout, UI controls, states, and approximate pixel coordinates.
BrainGLM 5.2 receives that structured description, reasons about the task, and selects the next approved tool call.
Handsscreen, browser, click, and typing tools act on the relay desktop; the main model never needs native image support.
  1. Create an OpenAI-compatible llmConnection named ollama_gemma4_vision. Use https://ollama.com/v1, model gemma4:cloud, and leave supports_vision enabled.
  2. Create the primary service ollama_glm52 with model glm-5.2:cloud.
  3. Disable supports_vision on the GLM service. The vision_llm_service picker appears; select ollama_gemma4_vision.
  4. Select ollama_glm52 as the agent's llm_service. No special agent prompt is required.
  5. Attach an image or ask the agent to inspect the desktop with screen, see, or an image read. The server log should report that the image was described through the delegated service.
  6. For coordinate-based desktop work, capture a fresh screen before a sensitive click and verify the state after the action.
vision service
{
  "type": "llmConnection",
  "provider": "openai",
  "api_key": "${OLLAMA_API_KEY}",
  "base_url": "https://ollama.com/v1",
  "default_model": "gemma4:cloud",
  "supports_vision": true
}
primary service
{
  "type": "llmConnection",
  "provider": "openai",
  "api_key": "${OLLAMA_API_KEY}",
  "base_url": "https://ollama.com/v1",
  "default_model": "glm-5.2:cloud",
  "supports_vision": false,
  "vision_llm_service": "ollama_gemma4_vision"
}

In practice: only the first view of a screen pays the description round-trip (a few seconds, comparable to a native vision turn); byte-identical repeats are served from the hash cache instantly. Click coordinates come from the vision model's description — the text model only selects the target and copies them — which is why a text-only GLM 5.2 clicks accurately in real desktop sessions.

PawFlow transforms only the outbound call: the conversation keeps the original image, while GLM receives a cached textual description. Treat visual text as untrusted input and keep normal tool approvals enabled. Screen captures also return a revision for guarded clicks: the relay compares the target region locally immediately before input, with no second vision request or image-token charge when the screen is unchanged. Only the small opaque revision travels in the normal tool exchange. A changed region cancels the click and requires a fresh screenshot.

Read the delegated vision reference
Agents, parallel advisors, synthesis

Combine several LLM advisors behind one final agent

Objective: ask complementary LLMs for detailed internal plans in parallel, then let one final LLM synthesize their findings and complete the user's request.

AdvisorsDirect llmConnection services inspect the request concurrently and return internal plans. Their contexts are silent and ephemeral.
AggregatorA separate direct llmConnection receives the reports, streams the only visible response, and owns the final tool loop.
BoundariesAdvisors are fail-closed read-only by default. The final LLM keeps the conversation's normal tools and approvals.
  1. Create at least two enabled llmConnection services: one or more advisors and a different final LLM.
  2. In Resources → Services, create an LLM Aggregator Service.
  3. Select the final connection in aggregator_llm_service and enter the advisor service IDs in advisor_llm_services.
  4. Keep enforce_read_only enabled. Choose best_effort when partial advice is useful or fail_fast when every advisor is mandatory.
  5. Set max_parallel_advisors to the concurrency your providers can sustain, then select the aggregator as the agent or conversation LLM service.
  6. Send a planning or implementation request. PawFlow runs advisors only once for that user turn, reuses their reports through later tool results, and shows only the final LLM's stream.
LLM aggregator service
{
  "type": "llmAggregator",
  "aggregator_llm_service": "llm_final",
  "advisor_llm_services": [
    "llm_architect",
    "llm_reviewer"
  ],
  "max_parallel_advisors": 2,
  "advisor_max_iterations": 20,
  "failure_policy": "best_effort",
  "enforce_read_only": true
}

The final connection cannot also be an advisor, and every reference must target a direct llmConnection. Advisor calls add provider usage but are tracked separately from the final turn and do not inflate the main context gauge. Disable read-only enforcement only when you explicitly trust every advisor with all conversation tools.

Read the complete multi-LLM guide
Agents, provider continuity, turn-level routing

Route each agent turn across LLM providers safely

Objective: select a direct LLM connection once per turn, retain it through tool iterations, and cold-handoff safely after a classified provider failure.

Immutable turn planordered, round_robin, sticky_round_robin, and least_recently_used select exact scoped candidates without rotating mid-turn.
Current stateDuring AgentLoop work, PawFlow flushes persisted messages and cold-starts the next provider from the latest conversation context.
Safe boundariesCancel and force stop never alter route health. PawFlow reports one sanitized error only after all planned candidates fail.
  1. Create and test at least two enabled direct llmConnection services.
  2. In Resources → Services, create an Adaptive LLM Router.
  3. Add candidates with the structured editor, set priority and enabled state, then choose a strategy.
  4. Select the new llmRouter as the agent or conversation LLM service.
  5. Use Health and Explain last decision for sanitized diagnostics.
  6. Test with one provider unavailable; persisted work remains in the cold-started child context.
Adaptive LLM router
{
  "type": "llmRouter",
  "strategy": "ordered",
  "candidates": [
    {"service_id": "llm_primary", "priority": 10, "enabled": true},
    {"service_id": "llm_backup", "priority": 20, "enabled": true}
  ]
}

If PawFlow cannot confirm that queued conversation writes are durable, it stops instead of handing an incomplete context to the next provider. Health and decision details are bounded and secret-free.

Read the technical service reference
PawCode installer

Install PawCode and attach a terminal agent to PawFlow

Objective: install the PawCode CLI package and continue a PawFlow conversation from a terminal.

PawCode installer and terminal login
Download the platform package, install it, then connect to the PawFlow server.
Video: install, login, select conversation, stream a response.
  1. Download the PawCode asset matching the release version shown above.
  2. Install the package or unzip it into a directory on PATH.
  3. Run PawCode, point it at the PawFlow server, and authenticate with the same user.
  4. Select an existing conversation or create a new one; relays, memories, and tool policies stay server-side.

Terminal work and webchat share the same PawFlow conversation.

PawCode usage

Start PawCode with explicit server and Private Gateway settings

Objective: make the terminal client predictable across localhost, private deployments, and gateway-protected routes.

PawCode server and gateway settings
Set the server URL once, then login and resume shared conversations.
Video: server URL, Private Gateway key, login, resume, and run a relay-backed command.
PawCode terminal client running a live agent conversation with streaming thinking and tool events
PawCode in a terminal: live thinking, tool calls, and streaming responses over the same backend.
terminal
# Local server
PAWFLOW_SERVER="https://localhost:19990" pawcode --dir .

# Gateway-protected server
PAWFLOW_SERVER="https://pawflow.example.com" \
PAWFLOW_GATEWAY_KEY="your-private-gateway-key" \
pawcode --dir .

# Common flow after login
pawcode auth login
pawcode --dir .
  1. Use PAWFLOW_SERVER for the exact PawFlow origin, including scheme and port.
  2. Use PAWFLOW_GATEWAY_KEY when Private Gateway protects API/SSE routes; keep it in your shell profile or secret manager, not in prompts.
  3. Run pawcode auth login if the browser auth token is missing or expired.
  4. Use /conv and /resume <id> to continue webchat conversations.
  5. Use /new --agent assistant --llm <service> --relay <relay_id> when creating a terminal-first conversation with an existing relay binding.

PawCode connects to the chosen server, passes Private Gateway, and uses the same relay and tool permissions as webchat.

Read PawCode docs
VS Code plugin

Install the PawFlow VS Code extension from a release VSIX

Objective: make the VS Code client installable without opening the extension source folder or running a development host.

VS Code install from VSIX flow
Install the release .vsix, configure the server URL, then login.
Video: install from VSIX, settings, login, chat sidebar, selection actions.
PawFlow extension running inside VS Code with a live agent conversation, streaming responses and tool events in the chat panel
The PawFlow panel in VS Code: chat, conversations, files, tools, and live streaming over the same backend.
  1. Download pawflow-vscode-<version>.vsix from the current release.
  2. In VS Code, run Extensions: Install from VSIX... and choose the file.
  3. Set pawflow.serverUrl to the PawFlow server, for example https://localhost:19990.
  4. Set pawflow.gatewayKey when Private Gateway is enabled.
  5. Run PawFlow: Login, then use the PawFlow activity bar view or editor context menu actions.

VS Code is another PawFlow client over the same backend.

Relay Desktop installer

Install Relay Desktop for GUI workstations

Objective: connect a desktop machine to PawFlow with filesystem, terminal, browser, noVNC, audio, and screen capabilities scoped by relay profile.

Relay Desktop installer and connection profile
Install the desktop app, create a PawFlow server profile, then register a workspace.
Video: installer, profile, workspace, connected relay.
  1. Install the Relay Desktop package for the workstation OS.
  2. Add the PawFlow server URL and authenticate with the user that owns the conversation.
  3. Register a workspace root and choose whether local host access is allowed.
  4. Confirm the relay appears connected in PawFlow before enabling desktop or shell tools.

Webchat can link the workstation relay and use Desktop Relay/noVNC for GUI tasks.

Relay CLI installer

Install Relay CLI for server and terminal workspaces

Objective: run a lightweight relay on machines that do not need the Desktop app.

Relay CLI install and terminal connection
Unpack the CLI, authenticate, and connect a workspace directory.
Video: CLI install, profile/login, relay connected in webchat.
  1. Download the Relay CLI archive for the target machine.
  2. Unpack it and place the executable on PATH, or run it from the extracted directory.
  3. Authenticate against the PawFlow server and register a workspace root.
  4. Use Docker/container relay mode for isolated work, and enable local host mode only for trusted tasks.

The machine appears as a relay-backed filesystem and shell target, no desktop session required.

Install

Install PawFlow with Docker

Objective: start a self-hosted PawFlow server and open the first-run wizard.

  1. Open the current release downloads for .
  2. Download the installer zip.
  3. Unzip it and run the install command shown in the quickstart.
  4. Open `https://localhost:19990/install`.

You land in a starter conversation with `assistant` selected.

Open full quickstart
Update

Update the server from the browser

Objective: move a running deployment to a new release without opening a terminal.

  1. Open Admin → Update server. A read-only preflight reports the deployment, the target image, and how many agent turns are in flight.
  2. Confirm: a restart kills every running turn, and the dialog says so before anything happens.
  3. The update runs in a throw-away `pawflow-updater` container, which keeps its logs if it fails.
  4. The page waits for a different server process to answer `/health`, then reloads on the new version.

If the server never restarts, the panel names which failure happened and prints `docker logs pawflow-updater`. The command line stays available: `bash scripts/install-pawflow.sh --check-updates`.

Read the update mechanism
Managed PawFlow server relay setup
Server relay

Install a managed relay server

Objective: run a full relay on the PawFlow server itself, so agents get filesystem, shell, and tool access to server-side workspaces — the pure remote self-hosted setup — and client relays can register against it.

  1. Install PawFlow and complete the first-run wizard.
  2. Open resources/services and add a `relay` service.
  3. Leave `token` empty for a managed server relay.
  4. Save and confirm health before attaching client relays.

Agents work directly in server-side workspaces, and PawFlow brokers filesystem, shell, screen, browser, and desktop-capable clients.

Read service docs
Relay Desktop and Relay CLI installation
Remote relay

Install a remote relay with Desktop or CLI

Objective: connect the machine that owns the files, terminal, browser, or desktop to PawFlow.

  1. Choose Relay Desktop for GUI workstations or Relay CLI for server/terminal machines.
  2. Install the package from the release downloads.
  3. Add the PawFlow server URL and gateway key/login.
  4. Register a workspace and link it to the webchat conversation.

The workstation appears as a selectable relay with explicit tool boundaries.

Read relay client docs
Desktop relay session in PawFlow
Desktop

Open a desktop through a relay

Objective: give an agent controlled access to a full desktop surface for UI work.

  1. Start a relay with desktop/screen tooling enabled.
  2. Open the Desktop Relay view from webchat.
  3. If the relay uses `allow_local`, choose the local desktop where the host helper runs.
  4. Require approvals for screen, browser, shell, file, and delete operations.

The agent inspects and operates a desktop while you watch the same session.

Read desktop docs
Relay terminal open in a webchat tab
Terminals

Open relay terminals from webchat

Objective: debug or operate the environment attached to a conversation without leaving the browser.

  1. Open the webchat workspace menu.
  2. Choose the Docker relay terminal for containerized workspace commands.
  3. Choose the local terminal only when `allow_local` is enabled intentionally.
  4. Use the server relay terminal to work directly in PawFlow server workspaces and provider containers.

Docker, local host, and server relay boundaries stay visible.

Read filesystem docs
Agents

Configure the first LLM-backed agent

Objective: connect the assistant to Codex interactive, Claude Code interactive, Antigravity/Agy, Gemini CLI, Anthropic, OpenAI, or a compatible endpoint.

  1. Create or select an LLM service in the installer/resource panel.
  2. Use direct `openai`/`anthropic` for API keys, `codex-interactive` for Codex subscriptions, `claude-code-interactive` for Claude subscriptions, and `antigravity-interactive` for Gemini subscriptions. Codex interactive reuses the existing Codex OAuth pool.
  3. Do not select the legacy `codex-app-server` or Claude Code `cc -p` agent transports for a new service; keep them only while migrating an existing configuration.
  4. Set credentials through secrets or the matching OAuth credential provider.
  5. Send a small inspection task before allowing edits or shell.

You get streaming responses from the selected provider.

Read provider docs
Agents

Enable native Codex and Claude Code plugins

Objective: keep the native CLI ecosystem inside PawFlow sessions — OpenAI's curated Codex plugins (Linear, GitHub, Gmail, Calendar...) and Claude Code plugin marketplaces.

  1. Open your recommended `codex-interactive` LLM service and set `codex_plugins` to a comma-separated list, e.g. `github,linear,gmail` (OAuth/subscription mode — plugins are authorized at the ChatGPT account level). Existing legacy `codex-app-server` services keep the same parameter while they are migrated.
  2. For Claude Code interactive, declare marketplaces in `claude_marketplaces` (`name=owner/repo` or `name=git-url`) and list `claude_plugins` as `plugin@marketplace` ids; Claude Code auto-installs them at session start.
  3. Gemini CLI extensions: install once inside the persistent session slot (`gemini extensions install <git-url>`) — the slot survives restarts.
  4. Remove an entry from the service to disable it on the next session.

PawFlow runs the real CLI engines, so plugin commands, skills, and connectors behave exactly as in the native CLI.

Read provider docs
VS Code code-server attached to a PawFlow relay
Editor

Open VS Code/code-server on the relay workspace

Objective: review files manually while agents continue to work in the same conversation.

  1. Link the target relay to the conversation.
  2. Open VS Code/code-server from the webchat workspace menu.
  3. Inspect diffs, run searches, or edit files directly in the browser editor.
  4. Ask the agent to explain or continue from the same relay workspace.

Manual review and agent work share one workspace boundary.

Read VS Code docs
Providers

Inspect interactive provider tmux sessions

Objective: debug subscription-backed CLI providers without losing the conversation state.

  1. Configure `claude-code-interactive`, `codex-interactive`, or `antigravity-interactive` for the selected agent.
  2. Open the provider runtime view or relay terminal from webchat.
  3. Inspect the tmux session when login, tool approval, or provider streaming needs attention.
  4. Return to the conversation after the provider state is healthy.

Interactive CLI providers stay observable.

Read provider docs

Identity, filesystems, and secrets

Connect accounts without leaking credentials.

OAuth provider setup in PawFlow
OAuth

Set up an OAuth provider

Objective: let users sign in through a supported external identity provider.

  1. Create the OAuth application at the provider and copy the client id/secret.
  2. Set the redirect URI to your PawFlow callback URL, for example `https://your-host/auth/callback`.
  3. Add the provider in Auth Gateway or the installer OAuth step.
  4. Set allowed domains, default role, and auto-provisioning rules before exposing the login button.
GoogleGoogle Cloud Console OAuth client, authorized redirect URI, email/profile scopes.
GitHubGitHub OAuth App, callback URL, optional org restrictions.
MicrosoftEntra app registration, web redirect URI, user.read/email scopes.
XX/Twitter developer app, OAuth callback, profile/email permissions when available.
Meta/FacebookMeta app, Facebook Login product, valid OAuth redirect URI.
AmazonLogin with Amazon security profile, allowed return URL.
TelegramBotFather bot plus allowed domain for Telegram login widget.
GenericAny OIDC/OAuth provider with authorize, token, userinfo endpoints.

External users authenticate through PawFlow with predictable provisioning.

Read auth docs
rclone filesystem setup
Filesystem

Add an rclone filesystem

Objective: mount remote storage such as Google Drive or OneDrive into relay-backed tools.

  1. Create an `rcloneOAuthCredentials` service for the backend, such as Google Drive or OneDrive.
  2. Add an `rcloneFilesystem` service that references the credential service.
  3. Link the filesystem service to the conversation or relay.
  4. Use `/remote/<service_id>` from relay shell/tools when the relay image includes rclone.

Agents read and write approved remote storage, with no raw OAuth tokens in prompts.

Read filesystem tools
Config

Use local or external secrets

Objective: keep stable logical names while credentials remain encrypted locally or owned by an external vault.

  1. Create a normal local secret, or add a secretProvider service for AWS Secrets Manager/SSM, HashiCorp Vault, Azure Key Vault, Google Cloud Secret Manager, or Keeper.
  2. Bind the logical secret name to the exact provider entry. PawFlow stores the encrypted locator, not the remote value.
  3. Reference the same name from expressions, services, packages, shell tools, and scripts; consumers do not need to know which provider owns it.
  4. Set a conversation allowlist and, when needed, a narrower per-agent allowlist. Their intersection is the effective secret set.

Remote values are read-only, cached only in memory for a bounded TTL, and fail closed without lower-scope fallback. The first delivery uses the normal service surface plus authenticated management actions; a dedicated binding editor remains follow-up work.

Read the external secret provider guide

Repositories, skills, tools, and marketplace

Manage the PawFlow depots as product resources.

Depots

Understand PawFlow resource depots

Objective: know where reusable definitions live and how scope changes visibility.

  1. Use the resource panel to browse agents, flows, skills, prompts, tools, MCP servers, services, themes, task definitions, and packages.
  2. Choose the right scope: global for shared defaults, user for personal assets, conversation for local experiments.
  3. Promote stable resources upward only after review.
  4. Keep secrets separate from imported packages and marketplace assets.

Teams reuse resources with experiments kept separate from production defaults.

Read resource tools
Skills

Create, import, and use skills

Objective: give agents task-specific instructions and assets on demand.

  1. Create a skill with `/skill add @name "prompt"` or from the resource panel.
  2. Import reviewed external skills from supported marketplaces or GitHub trees.
  3. Assign skills explicitly to agents with `/skill assign @agent @skill`.
  4. Run a skill immediately with `/skill run` or `//skill-name`; agents load full content with `load_skill` only when needed.

Specialized knowledge is available on demand, without bloating every prompt.

Read skill commands
Skills

Let agents learn skills from their own work

Objective: turn hard-won procedures into a curated, growing skill library.

  1. Work normally: agents are instructed to crystallize novel multi-step procedures into conversation-scoped skills, and to fix a skill whose instructions proved wrong during use.
  2. Review `skill-draft` memories proposed after compaction; ask the agent to create the skill when a procedure recurs.
  3. Accept scope promotion when a conversation skill is loaded repeatedly — the agent asks, you decide.
  4. Schedule the `skillCurator` flow task (with a cron trigger) to get periodic keep/archive/merge reports based on real usage stats.

The library improves from real work; nothing is archived or promoted without your confirmation.

Read the skill loop design
Extend

Add MCP servers, hooks, tools, flows, and prompts

Objective: extend agents with controlled capabilities.

  1. Add MCP servers as opt-in resources and activate them only for the conversations that need them.
  2. Add tools for reusable actions, and document required inputs, side effects, and permissions.
  3. Add agent hooks for pre/post behavior where policy or automation must run around agent turns.
  4. Create prompts and flows as versioned resources so operators can reuse them without copying chat text.

Extensions are explicit, reviewable, and scoped.

Read tool catalog
PFP package install and marketplace
Packages

Import, export, and update PFP packages

Objective: move signed bundles of agents, flows, skills, themes, tools, task providers, and service providers between environments.

  1. Inspect a `.pfp` before installing; review capabilities, object list, required secrets, and risk flags.
  2. Install only selected objects and bind package secrets to existing PawFlow secrets.
  3. Export stable local resources into a `.pfp` or `.pfpdir` for review.
  4. Use update/uninstall through the package registry instead of overwriting resources manually.

Reusable assets are distributed with provenance and explicit consent.

Read package docs
Marketplace

Use marketplace assets safely

Objective: discover packages or skills without trusting remote metadata blindly.

  1. Add registries from the package dialog or package commands.
  2. Search by capability, package id, author, or object type.
  3. Confirm download size/hash before fetching remote `.pfp` files.
  4. Install only reviewed objects and keep marketplace secrets bound locally.

Marketplace discovery stays separate from execution trust.

Read publisher guide
Themes

Select, create, and import themes

Objective: customize the webchat without editing product code.

  1. Select a global or conversation theme from the chat theme menu.
  2. Create a theme resource with `theme.json`, CSS, and optional assets.
  3. Import a theme from a PFP package or resource depot.
  4. Test readability across chat, resource panels, terminals, and modals before sharing globally.

Teams brand or specialize workspaces while preserving accessible controls.

Read theme docs

Flows, tasks, and plans

Turn agent work into explicit automation.

PawFlow flow engine explanation
Flows

Understand PawFlow flows

Objective: know when to use deterministic flow execution instead of a free-running agent loop.

  1. Model work as a graph of tasks connected by relationships.
  2. Use services for external systems, credentials, LLMs, filesystems, and media providers.
  3. Use triggers for schedules, webhooks, messages, files, or manual starts.
  4. Keep LLM calls explicit through agent or `inferLLM` tasks where variability is acceptable.

Recurring work runs with visible routing, retries, checkpoints, and backpressure.

Read architecture docs
Main PawFlow Agent flow
Agent flow

Understand the main PawFlow Agent flow

Objective: recognize the runtime path behind the starter webchat.

  1. `httpReceiver` accepts chat/API events.
  2. `agentLoop` builds context, calls the selected LLM service, executes tools, and streams events.
  3. `handleHTTPResponse` returns the immediate HTTP response while background streaming continues.
  4. Conversation store, event bus, memory, relays, and FileStore keep the UI synchronized.

Operators can pinpoint whether an issue is HTTP, context, provider, tool relay, or persistence.

Read agent system docs
Plans

Use tasks and PawFlow plans

Objective: coordinate work that needs status, verification, or recurrence.

  1. Use tasks for assigned work, scheduled loops, or recurring objectives.
  2. Use `create_plan` for multi-step work that needs approval before execution.
  3. Update plan steps as they move through pending, in progress, blocked, and done.
  4. Use verification when another agent or user must approve the result before continuing.

Long work becomes observable and trackable.

Read task commands
Agent-created daily digest flow
Automation

Create a deterministic daily digest flow

Objective: use an agent to design a recurring automation, then let a JSON flow run it.

  1. Prompt the agent to create a daily digest with source fetch, LLM summary, and delivery.
  2. Review the generated task graph.
  3. Keep LLM calls explicit through `inferLLM` tasks.
  4. Deploy the flow once the shape is correct.

CRON and flow tasks execute on their own, with no free-running agent in the loop.

Read the example

Channels

Reach the same agents from messaging apps.

Chatting with a PawFlow agent from Telegram, with live thinking and tool events streamed into the chat
Telegram

Talk to your agents from Telegram

Objective: use a Telegram bot as a first-class client for the shared agent runtime, with the same durable conversations, agents, and tools as web chat and PawCode.

  1. Create a bot with @BotFather and copy the bot token.
  2. Store the token as a secret, then add a telegramBot service that references it. Set allowed_users to the Telegram user IDs you trust.
  3. Deploy the Telegram agent flow: telegramReceiver ingests messages and telegramAgentClient submits them through the shared agent API. Add telegramConversationBridge to mirror live conversation events back to the chat.
  4. Link your Telegram account to a PawFlow user from account settings, so messages run under your identity, scope, and permissions.
  5. Message the bot: text, documents, photos, and voice are accepted. Use /new to start a conversation, /conv to switch, /tts for spoken replies, and /help for commands; slash commands mirror into the conversation.

The same agents, multi-agent context, attachments, and FileStore outputs are available from Telegram, with responses streamed back to the chat.

Read multi-client docs
Video: select a saved PawFlow server, connect, and use the native tabbed webchat. The private server URL is intentionally blurred.
Android

Install the native Android app

Objective: run the full PawFlow webchat from a native Android client with multi-server profiles, native sign-in, and parallel chat tabs.

  1. Download the APK (pawflow-android-<version>-debug.apk, also on the latest GitHub release) and install it (allow installs from your browser; the beta APK uses a debug signature).
  2. Add a server profile: a label, the server's HTTPS origin, and its private gateway key. Keys are encrypted with an AES-GCM key held in Android Keystore; cleartext HTTP is rejected.
  3. Select the server and sign in with native controls: built-in credentials post directly to the server, OAuth2 providers open in a Custom Tab and return through a PKCE-bound handoff — the session token never travels in the callback.
  4. Chat in native tabs: + opens another webchat tab, numbered tabs switch without reloading, × closes one, and Servers returns to the selector without logging out. The toolbar and tab strip fold away behind a right-edge grip so the chat gets the whole screen.
  5. Files the webchat offers (agent-shared files, exports) download through the system DownloadManager with your session, landing in Downloads with a notification.

Every tab shares the server login and keeps its own history; Android Back walks the active WebView history before returning to the selector.

Read the Android app docs

Security, context, and gateway

Keep access narrow and context intentional.

Security

Encrypt a sensitive conversation at rest

Objective: store a conversation as ciphertext on disk so a stopped server reveals nothing.

  1. In the conversation, run /encrypt on and set a passphrase (with confirmation). Existing content is migrated to ciphertext.
  2. Optionally add a recovery passphrase with /encrypt escrow on, or bind a trusted relay for unattended unlock with /encrypt relay <pubkey> (from pawflow-relay key export-pubkey).
  3. The conversation locks on logout, 15-minute idle, or server restart; reopen it and run /encrypt unlock (or it auto-unlocks via a connected trusted relay).
  4. To encrypt a conv-scoped relay workspace too, run /relay encrypt <id> on.

Message content and tool I/O are unreadable on disk without the passphrase; metadata and other conversations are unaffected.

Read the security model
Context

Edit context and memory before the next turn

Objective: keep long-running conversations precise instead of letting stale state accumulate.

  1. Open the context editor to inspect what the selected agent will receive.
  2. Remove stale snippets or add focused context before a sensitive task.
  3. Open the memory editor to review durable memories and correct bad facts.
  4. Send the next turn only after the visible context matches the task.

The agent runs with auditable short-term context and curated long-term memory.

Read cognitive tools docs
Context

Choose memory, diary, todo, or scratchpad

Objective: give each piece of context the correct owner and lifetime.

  1. Use remember for durable facts and preferences; use the Knowledge Graph when the fact is a clear subject–relationship–object triple.
  2. Use diary_write for the agent's durable first-person decisions, lessons, recurring failures, and reflections — not routine turn summaries.
  3. Use todolist as the authoritative ledger for unfinished multi-step or deferred work.
  4. Use scratchpad for expiring evidence, hypotheses, local decisions, and resume cues. Only topics/count/expiry enter context; the agent explicitly retrieves note bodies.
  5. Use Project Graph and Project Wiki for relay-scoped code structure and sourced architecture shared by every conversation on that project.

The model receives a canonical routing hint, while each tool schema provides the exact actions and parameters.

Read the complete decision guide
Reading

Choose how a conversation reads

Objective: follow a working agent without scrolling through every technical row.

  1. New conversations open in Simplified: your message, one live activity block, then the turn's last message under it.
  2. Expand the block for Messages, Thinking, Tool calls, and Artifacts; the header counts the turn's seconds and freezes on what it took.
  3. Switch to Classic from the View menu for the flat transcript, with the grouping toggles for technical, task, and delegate rows.
  4. Or pick Openspace: a live 3D office where each agent sits at a desk — speech and thought bubbles mirror the stream, status orbiters circle the agents (🧠 thinking, 🔧 tool runs, 💤 idle), battery gauges show context use, a wall screen projects the live transcript, wall posters open every side panel (cognitive tools, todo, cost, context, plans, scheduled tasks, file explorer, desktop, terminal, tmux), a FileStore TV plays the conversation's media files, and the flows poster projects deployed flows on a 3D stage with animated dataflow.
  5. The choice is stored per conversation, so one can read simplified while another stays classic or openspace.

Long turns stay readable while the full record remains one click away.

Read the view reference
Context

Configure compact and summarizer settings

Objective: control how long conversations stay usable without flooding the provider context.

  1. Set `max_context_size` on the LLM service to match the real model window.
  2. Choose a summarizer service during install or in services.
  3. Use `compact_threshold_pct` for proactive compaction, or disable proactive compaction with `0` when manual control is preferred.
  4. Review compact summaries and memory extraction after long sessions.

Conversation history stays durable while provider prompts stay bounded.

Read agent context docs
Private Gateway setup and ban rules
Gateway

Configure Private Gateway and bans

Objective: protect exposed routes before a demo or internet-facing install.

  1. Enable Private Gateway during install or from gateway services.
  2. Replace the bootstrap key immediately; `RoyBatty` is only temporary.
  3. Set rate limits, failed-attempt cooldowns, and ban behavior for repeated failures.
  4. Use skins only as UX; do not treat them as security controls.

Public routes require an explicit gateway step, and abusive clients can be slowed or banned.

Read security model
Security

Run a private demo safely

Objective: show PawFlow without exposing unrestricted host access.

  1. Use HTTPS or a trusted reverse proxy.
  2. Enable Private Gateway for internet-facing routes.
  3. Prefer Docker relay mode for untrusted workloads.
  4. Restrict agent tools and require approval for shell/edit/delete/desktop operations.

A useful demo with explicit trust boundaries.

Read security model

Media and voice

Add multimodal services after the core runtime works.

PawFlow media service setup
Media

Add image, video, and audio services

Objective: enable multimodal tools without embedding large media payloads in context.

  1. Add the provider you need: image, video, audio/music, 3D, lipsync, upscaling, or speech-to-video.
  2. Store API keys as secrets or choose a local provider.
  3. Use clear service ids such as `image.default`, `video.default`, or `audio.default`.
  4. Run a tiny generation test and confirm the output is a FileStore URL or relay file path.

Agents return reusable files — FileStore URLs or relay paths.

Read media docs
Self-hosted image and video

Connect ComfyUI to PawFlow

Objective: let agents run reviewed ComfyUI graphs without exposing arbitrary workflows or loading large outputs into server memory.

From a mobile PawFlow conversation, the agent drives ComfyUI on a Windows relay, waits for the render, validates it, and returns the finished video.
  1. Install ComfyUI from its official manual/desktop instructions, install the required models and custom nodes, then verify http://127.0.0.1:8188/system_stats. ComfyUI has no official Docker image; community images remain operator-managed.
  2. Run and test each graph in ComfyUI. End it in an artifact-producing save/combine node, then use File → Export Workflow (API), not the ordinary Save JSON.
  3. In PawFlow Resources → Services, add comfyUIImageGeneration or comfyUIVideoGeneration.
  4. For ComfyUI on the relay host, keep base_url=relay://${conv.relay}/localhost:8188 and relay_local=true. Set relay_local=false only when ComfyUI runs in the relay container.
  5. Paste trusted presets in workflows. Each operation contains the complete API workflow, explicit bindings such as prompt -> 6.text, and an explicit output such as node 9, key images, index 0.
  6. Configure only the operations the graph supports: generate/edit_image for images; generate, image_to_video, frame_to_video, reference_to_video, video_edit, or video_extend for video.
  7. Generate a small artifact, confirm a FileStore/relay-file result, then tune time and byte limits. Keep port 8188 private or place authenticated TLS in front of it.

PawFlow uploads declared inputs, submits only the configured graph, polls prompt history, and streams the selected artifact to disk.

Open the complete ComfyUI guide and configuration examples
TTS and STT service setup in PawFlow
Voice

Set up TTS and STT

Objective: enable read-aloud, browser dictation, voice cloning, and speech tools.

  1. Add a TTS service such as `supertonicTTS`, `voicebox`, `luxTTS`, or a compatible hosted provider.
  2. Add an STT service such as `openaiCompatibleSTT` or `voicebox`.
  3. For Supertonic, use fast private local TTS; for Voicebox, configure the local endpoint/profile.
  4. Test the speaker and microphone buttons, then test `speak`, `clone_voice`, or `speech_to_video` if needed.

Webchat can speak and transcribe, and agents can generate voice artifacts.

Read voice docs
Voice

Talk live with an agent (realtime voice)

Objective: hold a full-duplex spoken conversation — you talk, the agent answers in its own voice, you can interrupt it, and the transcript lands in the conversation.

  1. Add a `realtimeVoiceConnection` service: pick `openai_realtime` (references an `openai` LLM service, model `gpt-realtime`) or `gemini_live` (references a `gemini` LLM service with its `api_key` set, a Live-capable model).
  2. Optionally set `voice`, `vad` (`server` auto-detection or `manual` push-to-talk), `tool_profile` for spoken tool use, and `context_mode` so the agent knows what was already discussed.
  3. Click the microphone button in the webchat input row — right-click it to pick between services. Speak; barge in whenever you want.
  4. Pin the service on an agent ("Realtime voice service" in the agent editor) to make it voice-native: on Telegram, voice notes to that agent get voice-note replies in the same voice.

Both transcripts persist as normal messages, so the text agent resumes with full context after the call.

Read realtime voice docs
Troubleshooting

Debug the first blocked install

Objective: isolate common setup failures without guessing.

  1. Run the doctor script first.
  2. Check Docker daemon access and selected port availability.
  3. Confirm provider credentials are stored as secrets or login-backed services.
  4. Check relay connection state before testing filesystem tools.

The failing layer is visible: host prerequisites, server, provider, or relay.

Read Docker docs