Track what is new in Fleet Pi. For an introduction to the product, see Fleet Pi. For other products, see all changelogs.
Week of November 2: Fleet Pi
New features
Interactive generative UI OpenUI Lang 1.1 adds Select, Switch, and Modal components. Input, Select, and Switch bind to reactive $variables, and the @Count, @Sum, @Avg, and @Filter built-ins compute values from state. See Generative UI.Updates
- Oxc toolchain.
pnpm lint runs Oxlint through Vite+, pnpm format runs Oxfmt, and CI checks formatting with pnpm format:check. ESLint and Prettier are no longer used. TypeScript moves to 7. See Quickstart and Project structure.
- CircleCI deploy lane. CircleCI mirrors the validation gates and adds an approval-gated production deploy from
main, plus a manual rollback pipeline. GitHub Actions remains the automatic deployer. See Runbooks.
Week of October 26 — Fleet Pi
Updates
- Neon Function chat host retired. Chat now runs only on the Cloudflare Worker.
VITE_FLEET_PI_CHAT_RUNTIME_URL and FLEET_PI_CHAT_RUNTIME_CORS_ORIGINS are removed. See Configuration.
Week of October 19 — Fleet Pi
Updates
- Plan mode blocks non-read-only commands on hosted turns. Hosted
bash calls in Plan mode must pass the read-only command check. See Plan mode.
- Hosted file tools stay in the workspace. Hosted
write and edit refuse paths outside the workspace. In Harness mode, commands that touch agent-workspace/system/ also wait for confirmation. See Harness mode.
- Deleted hosted sessions stay deleted. A turn sent to a deleted hosted session returns
404 with Session not found. See Hosted and local sessions.
- Steering stays in its conversation. While a hosted turn runs, steer and follow-up prompts join it only when they target the same conversation. See Hosted chat on Cloudflare Workers.
- Stricter provider URL checks. Custom provider base URLs that use IPv4-mapped IPv6 literals for loopback, private or metadata addresses are rejected. See LLM providers.
Week of October 12 — Fleet Pi
New features
Hosted Agent chat runs on your Pi Durable Object On the Cloudflare deployment, new Agent chat sessions now stream from the signed-in user’s Pi Durable Object (UserPiDurable, bound as USER_PI_DURABLE). The object’s SQLite storage is the hosted transcript, and hosted session ids start with durable:. Neon keeps auth, settings, and an optional projection, and session JSONL is no longer copied to object storage. Sessions that still send a sessionFile keep the legacy path. See Hosted chat on Cloudflare Workers and Hosted and local sessions.Fork a hosted conversation POST /api/chat/fork forks a hosted conversation from its latest entry. The fork keeps the parent conversation’s model. See the HTTP API reference.Hosted Plan, Harness, and agent loop settings Hosted turns now apply Plan mode, Harness mode, and the Settings > Agent loop values you save, including codemode and mcpServers. Hosted chat accepts https:// MCP servers only. In Harness mode, a write, edit, or bash call that targets system/ or evals/ waits for confirmation. See Agent loop settings and Harness mode.Discover models for custom providers Add models now loads the model list from a custom or OpenAI Chat Completions provider’s base URL and registers only the models you enable. You can save a custom provider without model ids and fill them in from discovery later. See POST /api/chat/models/discover and Named OpenAI-compatible instances.Updates
- Model switches apply to resumed conversations. Each hosted turn sets the conversation’s model, so switching models on an existing session no longer fails. A changed API key, base URL, or API reopens the harness. See
POST /api/chat.
- Account erasure reaches hosted transcripts.
DELETE /api/chat/account now also clears your Durable Object storage. Deleting a single hosted session only hides it. See Hosted chat on Cloudflare Workers.
- Gateway token stays on Neon. Fleet Pi stops a turn before sending it when a Neon AI Gateway token would go to a non-Neon endpoint, and the error names the provider. See LLM providers.
- Model picker shows the models you added. The composer lists the OpenAI Chat Completions slot, your custom provider models, and built-in provider models you explicitly enabled. Hosted turns use the saved BYOK credentials for those built-in providers. See LLM providers.
- Tighter route authentication.
GET /api/chat/settings, GET /api/chat/providers, and /api/sandbox/settings now go through the authenticated chat request gate. See Authentication.
Week of October 5 — Fleet Pi
Fleet Pi had no user-facing merges from August 6 to October 7. This entry covers the work that landed from October 8 to October 11.New features
Deploy on Cloudflare Workers The Fleet Pi web app now runs on Cloudflare Workers, and Cloudflare is the only supported deploy host. FLEET_PI_DEPLOYMENT=cloudflare switches Fleet Pi to its hosted, fail-closed, Postgres-backed code paths. Build and deploy from apps/web with pnpm build:cloudflare and pnpm deploy:cloudflare. See Cloudflare Workers deployment.Pi SDK 1.1 Fleet Pi moves to @earendil-works/pi-* 1.1.0. The azure-openai-responses provider is now azure, and saved settings migrate automatically. The system prompt now describes the Fleet Pi web workspace instead of Pi’s terminal app, and the model sees the Daytona sandbox as its working directory. See Architecture.Chat without workspace tools On a hosted deployment without a Daytona key, chat still works: the model runs without file, shell, search, or workspace tools. The first start frame carries a workspace field so the client can explain why. See Workspace status.Updates
- Default model resolved on the server. A new session that arrives without a model now gets the configured default, then the first model with credentials. With no credentials, the turn fails with a clear error. The composer also holds your first message until the model picker loads. See LLM providers.
- Explicit aborted state. Every turn now ends with a terminal
done frame. A stopped turn carries stopReason: "aborted" with whatever streamed before the stop. See Stream events.
- OpenAI-compatible variables clarified.
OPENAI_API_KEY always targets api.openai.com. Use OPENAI_CHAT_COMPLETIONS_API_KEY, OPENAI_CHAT_COMPLETIONS_BASE_URL, and OPENAI_CHAT_COMPLETIONS_MODEL for gateways and other compatible endpoints. These apply to local runs only. See LLM providers.
- Configurable migration role.
chat:migrate and auth:migrate grant to the role named by FLEET_PI_APP_ROLE (default fleet_pi_app). See Chat session mirror.
- Owner columns use UUIDs.
chat:migrate converts pi_* user columns to uuid with a foreign key to neon_auth.user. Rows without a matching Neon Auth user are copied to pi_orphan_quarantine first. See Chat session mirror.
- Signed Daytona webhooks.
POST /api/webhooks/daytona now verifies an HMAC-SHA256 of the raw body keyed by DAYTONA_WEBHOOK_SECRET. Workspace routes return 403 with a readable message when no Daytona credential is set. See the HTTP API reference.
- Steadier Daytona startup. Fleet Pi waits for a new user volume to be ready before mounting it, and a failed warm-up no longer crashes the server. See Daytona-backed user sandboxes.
Fleet Pi — Named OpenAI-compatible instances
New features
Multiple named OpenAI Chat Completions providers per user Each user can now save several OpenAI-compatible Chat Completions endpoints in parallel — for example one instance for OpenCode Zen and another for Nebius — instead of overwriting a single BYOK slot. Each instance carries its own display name, base URL, model ID, and API key, and shows up as a distinct row in the config panel and the model picker. Deployed chat encrypts them in Postgres; local anonymous chat persists them in a gitignored .fleet/providers.json file store. The default OCC slot still exists and still takes precedence over the platform Neon AI Gateway. See Named OpenAI-compatible instances.Updates
- Named instances work in local anonymous chat. Fleet Pi now picks the storage backend at runtime: Postgres
pi_user_providers for signed-in deployed users, and a per-project .fleet/providers.json file store for local anonymous chat. OCC-family instances may point at http://localhost on local dev surfaces (useful for Ollama or LM Studio); deployed chat keeps https:// enforced at both save time and runtime registration.
- Broken named OCC instances surface as “Not configured”. If a named instance’s stored API key can’t be decrypted or its base URL fails the safety checks, Fleet Pi now skips registration with a warning diagnostic and marks the row as Not configured in Settings — the model picker no longer advertises endpoints that would fail at request time. See Named OpenAI-compatible instances.
- Daytona sandbox sync stays on the default OCC slot. Additional named OpenAI-compatible instances live in the chat runtime’s provider store and are not injected into the user’s Daytona sandbox. Sandbox tool calls needing one of those endpoints go through the chat runtime, not directly from the container. See Provider credentials in the sandbox.
Week of July 27 — Fleet Pi
New features
Neon AI Gateway as the default authenticated chat backend Signed-in users on deployed environments now get working chat immediately after login — no BYOK required. Fleet Pi routes authenticated chat through the Neon AI Gateway as the platform OpenAI-Chat-Completions backend, with qwen35-122b-a10b enabled as the primary model and gpt-oss-120b also available. Local dev and anonymous chat still default to Google Gemini (gemini-3.5-flash). See Neon AI Gateway.BYOK takes precedence over the platform Gateway Users who save their own OpenAI-Chat-Completions provider in the in-app config panel continue to hit their own endpoint. Legacy OCC records are only migrated to the platform Gateway shape when the Gateway is active and the user has not brought their own credentials. See BYOK precedence.Updates
*.neon.tech host allowlist on the Gateway URL. Fleet Pi normalizes the Gateway base URL to a single /v1 suffix and rejects any host that does not resolve to *.neon.tech, so a misconfigured variable can never route chat to an untrusted origin. See URL shape.
- Gateway credentials scrubbed from the process environment.
NEON_AI_GATEWAY_BASE_URL and NEON_AI_GATEWAY_TOKEN are captured into process memory once at boot and then deleted from process.env, so agent shell tools cannot read the token by inspecting environment variables at runtime.
- Tightened deployment readiness gate.
pnpm verify-deployment-readiness now validates that NEON_AI_GATEWAY_BASE_URL is a well-formed, allowlisted Gateway URL — not just present. Deploys fail closed on a malformed or off-allowlist value instead of silently shipping broken chat. See Readiness gate.
Week of May 12 – May 19
New features
Fleet Pi — Daytona sandbox integration Pi chat modes can now invoke Daytona sandbox tools end-to-end, with webhook and client support added to the web surface and improved startup memory recall. See Chat modes and Runtime SDK integration.
Week of June 11 — Fleet Pi 0.5.0
New features
hax-design consolidation packages/ui is renamed to packages/hax-design and is now the single source of truth for agent-elements, OpenUI, Fleet Pi chat surfaces, shadcn primitives, and shared Pi protocol types. apps/web routes are thinner, and the config panel is split into focused modules. Forks must update imports from @workspace/ui to @workspace/hax-design. See Project structure.Google Gemini as the default LLM provider The default model is now gemini-3.5-flash through Pi’s google provider. Extensions receive mode-aware context (ctx.mode, getSystemPromptOptions()). Amazon Bedrock remains available via AWS credentials — set provider and model in .pi/settings.json or environment variables if you need it. See Configuration.Neon Postgres session mirror Setting FLEET_PI_CHAT_DATABASE_URL mirrors Pi session entries, run events, tool executions, and file mutations into Neon tables prefixed with pi_. JSONL remains the source of truth and mirror failures never break streaming. Apply migrations with pnpm chat:migrate. See Configuration and Runtime SDK integration.Web access tools in Agent mode The new pi-web-access package wires web_search, fetch_content, and code_search into Agent mode end-to-end. See Chat modes.Updates
- Memory recall improvements. Workspace memory content is now enriched and retrieval is prompt-aware for better long-session context.
- Question bar UX. New
usePendingQuestionBar hook and suppressQuestionTool prop on AgentChat for cleaner Plan-mode question handling.
- Security and reliability. Critical and high-severity issues fixed and vulnerable transitive dependencies patched.
- Documentation. Comprehensive docs added for the UI package, configuration, data models, dependencies, and security posture.
Breaking changes
- Import path rename:
@workspace/ui → @workspace/hax-design (package directory: packages/ui → packages/hax-design).
- Default LLM provider changed from Amazon Bedrock to Google Gemini.
- New optional environment variables for the chat mirror:
FLEET_PI_CHAT_DATABASE_URL, FLEET_PI_CHAT_MIGRATION_DATABASE_URL.
Last modified on November 10, 2026