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.
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 app-server, Claude Code interactive, Antigravity/Agy, Gemini CLI, Anthropic, OpenAI, or an OpenAI-compatible endpoint.
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.
Gateway and bootstrap key.Admin account.LLM service.First conversation.
PawFlow runs on the selected port, the wizard is complete, and the first conversation can call your chosen provider.
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 (VNC): noVNC opens the relay desktop in the browser.Audio only: stream the relay's sound without opening a desktop.Video: agent inspects the screen, then acts through approved tools.
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.
Open Desktop from the webchat workspace menu and choose the relay's virtual desktop, or the local desktop when allow_local is intentionally enabled.
Use noVNC for operator observation/control; enable audio only for sessions that need sound playback or capture.
Let agents inspect UI state through screen screenshots or see multimodal analysis, then approve clicks/typing/shell/file actions separately.
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.
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.
Create an OpenAI-compatible llmConnection named ollama_gemma4_vision. Use https://ollama.com/v1, model gemma4:cloud, and leave supports_vision enabled.
Create the primary service ollama_glm52 with model glm-5.2:cloud.
Disable supports_vision on the GLM service. The vision_llm_service picker appears; select ollama_gemma4_vision.
Select ollama_glm52 as the agent's llm_service. No special agent prompt is required.
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.
For coordinate-based desktop work, capture a fresh screen before a sensitive click and verify the state after the action.
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.
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.
Create at least two enabled llmConnection services: one or more advisors and a different final LLM.
In Resources → Services, create an LLM Aggregator Service.
Select the final connection in aggregator_llm_service and enter the advisor service IDs in advisor_llm_services.
Keep enforce_read_only enabled. Choose best_effort when partial advice is useful or fail_fast when every advisor is mandatory.
Set max_parallel_advisors to the concurrency your providers can sustain, then select the aggregator as the agent or conversation LLM service.
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.
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.
Download the PawCode asset matching the release version shown above.
Install the package or unzip it into a directory on PATH.
Run PawCode, point it at the PawFlow server, and authenticate with the same user.
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.
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 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 .
Use PAWFLOW_SERVER for the exact PawFlow origin, including scheme and port.
Use PAWFLOW_GATEWAY_KEY when Private Gateway protects API/SSE routes; keep it in your shell profile or secret manager, not in prompts.
Run pawcode auth login if the browser auth token is missing or expired.
Use /conv and /resume <id> to continue webchat conversations.
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.
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.
Install the release .vsix, configure the server URL, then login.Video: install from VSIX, settings, login, chat sidebar, selection actions.The PawFlow panel in VS Code: chat, conversations, files, tools, and live streaming over the same backend.
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.
Install PawFlow and complete the first-run wizard.
Open resources/services and add a `relay` service.
Leave `token` empty for a managed server relay.
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.
Objective: connect the assistant to Codex app-server, Claude Code interactive, Antigravity/Agy, Gemini CLI, Anthropic, OpenAI, or a compatible endpoint.
Create or select an LLM service in the installer/resource panel.
Use direct `openai`/`anthropic` for API keys, `codex-app-server` for Codex subscriptions, `claude-code-interactive` for Claude subscriptions, and `antigravity-interactive` for Gemini subscriptions.
Set credentials through secrets or the matching OAuth credential provider.
Send a small inspection task before allowing edits or shell.
You get streaming responses from the selected provider.
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.
Create a bot with @BotFather and copy the bot token.
Store the token as a secret, then add a telegramBot service that references it. Set allowed_users to the Telegram user IDs you trust.
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.
Link your Telegram account to a PawFlow user from account settings, so messages run under your identity, scope, and permissions.
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.
Objective: store a conversation as ciphertext on disk so a stopped server reveals nothing.
In the conversation, run /encrypt on and set a passphrase (with confirmation). Existing content is migrated to ciphertext.
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).
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).
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.
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.
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).
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.
Click the microphone button in the webchat input row — right-click it to pick between services. Speak; barge in whenever you want.
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.