docs

Ask Buoy

+
UniversalWorks with Expo & React Native CLI

This tool works with both Expo and React Native CLI projects. Just install and go.

just ask, in 69 seconds

Ask Buoy is an AI chat inside your app. It uses the Buoy tools you installed. It can read app data, like web calls and storage. It can also make changes, like editing storage or faking a web call. It needs Pro, Business or a trial. It is in beta.

Use Buoy's hosted AI, or point it at your own model.

Inspect the example request

1 / 8

This is a scripted conversation using example app data. Ask Buoy shows a response and the tool results behind it. A real app needs a configured model endpoint, tool access and account setup.

9:41
Loading live demo…
Scripted turns, real components — the same chat that renders in your app, fed the engine's own events. Step through the tour, or type something.

A few things people ask:

  • "Make the next checkout call fail with a 500" (Network)
  • "Show me what user 8823 sees on the rewards screen" (Impersonate)
  • "Give me 1500 points" (Storage or a state tool)

Before you start

  • Plan. Pro, Business or a trial. See pricing.
  • Tools. Ask Buoy can only use tools you installed. Set those up first.
  • Versions. Keep all Buoy packages on the same version. Hosted AI needs 7.0.54 or later. Check with npm ls @buoy-gg/license.
  • Build. Use a dev build for fake web calls and for tapping through screens. Some of those actions only work when __DEV__ is true. A release build can still read data, sign in as a test user and change screens. Ask Buoy refuses what can't work in your build, and says why.
  • Web. Import from the package's /web entry (7.0.41 or later). See Web installation.

Installation

npm install @buoy-gg/ask-buoy

It shows up in the dial as ASK BUOY.


Hosted Ask Buoy (beta)

This is the easy way. You need no AI key and no server. Buoy runs the AI, and your plan comes with credits each week.

tsx
import { FloatingDevTools } from "@buoy-gg/core";
import { hostedAskBuoy } from "@buoy-gg/ask-buoy";

<FloatingDevTools signIn askBuoy={hostedAskBuoy({ policy: { readOnly: true } })} />
import { FloatingDevTools } from "@buoy-gg/core";
import { hostedAskBuoy } from "@buoy-gg/ask-buoy";

<FloatingDevTools signIn askBuoy={hostedAskBuoy({ policy: { readOnly: true } })} />

readOnly lets it look but not change things. Remove it once you trust what it does.

Each person signs in with Buoy in your app. They scan the QR code or type the code at buoy.gg/activate. That adds your app to your account's Sites list. On a team, only an admin can add it. See Sign in with Buoy.

Credits

PlanCredits each weekAbout how many asks
Pro2,300500
Business4,600 per seat, shared by the team1,000 per seat
Trial1,000, once250

Most asks use about 5 credits. A long, many-step ask uses more. One ask never uses more than 100. Credits reset each Monday at 00:00 UTC. Unused credits don't carry over.

See what's left in Ask Buoy's settings. You can also see it on buoy.gg: open the Dashboard, then the Ask Buoy tab. That tab is also where you pick your model.

When something goes wrong

Each error shows a short code and a request id. Tap Copy details to copy them. Tap Report problem to send them to us. A report never has your chat in it.

What you seeWhat it means
You used this week's creditsThey come back on the date shown.
Sign in to use hosted Ask BuoySign in with Buoy in the app first.
Hosted AI is paused right nowWe paused it for a short time. Try again later, or use your own model.
Claude is busy right now, so Luna is answeringClaude is down for now. Luna answers until you start a new chat.
Ask Buoy is down right nowClaude and Luna are both down. We get an alert and are working on it. Try again in a few minutes.

Use your own model

Want your data to stay with your own AI company? Point Ask Buoy at your own server.

tsx
import { FloatingDevTools } from "@buoy-gg/core";

<FloatingDevTools
  askBuoy={{
    endpoint: "https://ai.acme.com/v1/messages",
    protocol: "anthropic",   // or "openai" — covers Azure, Gemini-compat, most gateways
    model: "YOUR_MODEL_ID",
    policy: { readOnly: true },

    // Called before every request, so short-lived tokens work.
    // Your gateway must validate the token and authorize the request.
    headers: async () => ({ Authorization: `Bearer ${await auth.getToken()}` }),
  }}
/>
import { FloatingDevTools } from "@buoy-gg/core";

<FloatingDevTools
  askBuoy={{
    endpoint: "https://ai.acme.com/v1/messages",
    protocol: "anthropic",   // or "openai" — covers Azure, Gemini-compat, most gateways
    model: "YOUR_MODEL_ID",
    policy: { readOnly: true },

    // Called before every request, so short-lived tokens work.
    // Your gateway must validate the token and authorize the request.
    headers: async () => ({ Authorization: `Bearer ${await auth.getToken()}` }),
  }}
/>

Your server must check the token and the user. It should limit which models and how big a request can be. It must stream answers back. Keep your AI key on the server.

apiKey can call an AI company straight from the app. But the key ends up inside the app. Use it only on your own machine, and never give that build to testers.


Try one safe ask

Send "List the installed tools." You should see a short list of your tools. Nothing in the app should change. Then ask it to read one web call. Check that the answer matches the Network tool.

Changes and Undo

By default it reads and makes normal changes right away. Big changes, like wiping storage, wait for your tap. The changes bar at the top counts what it changed. Tap Undo to put most of it back. A change it can't undo is marked permanent. You can also type "undo that".

You can make it ask before every change, or allow only some tools. See In the chat and the policy option in Teach it your app.

What it sends, and what it saves

Where the chat goes. With hosted AI, it goes through Buoy's server to Anthropic's Claude Haiku 5.5 model. If Claude is down, it goes to OpenAI's GPT-6 Luna model instead, by way of OpenRouter. You can pick Luna first in Ask Buoy's settings. Buoy keeps the cost of each ask, but not the chat. The first time someone uses it, Ask Buoy shows a note about this before it sends anything. With your own model, the chat goes only to your server.

What each ask sends. Your message goes first. Then your context notes and types. Then a sketch of the app: route paths, store names, storage key names and field names. It also sends the screen you're on with its route params, which query keys are on screen and your last few web call URLs. Params, keys and URLs can hold ids. Tool results go too, like storage values and web call bodies. It strips anything that looks like a secret first. SecureStore values stay off unless you set policy.secureReads: true.

What stays on the phone. The chat is saved so it comes back after a reload. Tool results are not saved. The undo list is saved, and it holds the old and new value of each change so Undo can work. A change that holds a secret is dropped from it. Turn saving off with persistTranscript: false.

Be careful with real user data. App data can come from places an attacker controls. Text in that data could trick the AI. Use readOnly when you point it at real user data.

See Telemetry for what Buoy sends about your account.

If it doesn't work

  • A strange error on the first message. Your endpoint and protocol don't match. Ask Buoy warns you when it can tell.
  • The answer shows up all at once. React Native's own fetch can't stream. Buoy switches to a different way after the first answer. On Expo, you can also use expo/fetch as the global fetch.
  • "does not work in this build". That action needs a dev build. It's not a bug.

More fixes are in In the chat.

Go further