# Floot — full documentation > Floot turns a plain-language description into a real, deployed full-stack app — React + TypeScript frontend, serverless TypeScript endpoints, Postgres database, authentication, file storage, and email — hosted on Floot's infrastructure with a live URL. You build it by connecting Floot to the AI assistant you already use (Claude, ChatGPT/Codex, Cursor, or any MCP client) and describing what you want in that conversation: the connector is how building on Floot happens. Floot is a remote MCP (Model Context Protocol) server, and the connector is how you build on Floot. An MCP client can create, edit, run, and publish a complete Floot project without a browser. - MCP endpoint: https://mcp.floot.com/mcp (streamable HTTP, OAuth) - Registry name: com.floot/floot in the official MCP registry - One-click connect in Claude: https://claude.ai/directory/connectors/floot-mcp-updated - One-click install in ChatGPT: https://chatgpt.com/plugins/plugin_asdk_app_6a500d350f8c819194e30335a7b134af - One-click install in Cursor: https://cursor.com/marketplace/floot - Any other client (VS Code, Zed, or Cursor without the marketplace): add the endpoint above as a remote server — see https://floot.com/docs/integrations/other-mcp-clients - Discovery manifest: https://floot.com/.well-known/mcp.json When connected over MCP, the model does the reasoning and token spend happens on the client's side (Claude or ChatGPT), not in Floot credits — building this way is free on Floot. What Floot meters instead is a build action per tool call (see https://floot.com/docs/integrations/build-actions). Image generation uses a small number of Floot credits. Creating a project returns a project view on https://floot.com — a live preview of the app that updates as writes land, alongside the project's data, services, and Publish button. It is where the user watches the build and where they can point at an element or annotate a screenshot for the assistant to pick up; it is not a second way to build, and there is no prompt box on it. A handful of steps also finish there rather than over MCP: turning on native mobile app builds, completing a custom domain's DNS, downloading the code as a zip, pasting third-party API keys, and anything involving plans or payment. What a Floot project is made of: page, component, helper, and endpoint files in TypeScript/React, plus static assets. Backends are serverless HTTP endpoints (GET/POST) with no filesystem or in-memory persistence between requests; persistent state goes in the provisioned Postgres database or object storage. Projects can also be published as native iOS and Android apps. This file is the complete contents of https://floot.com/docs (32 pages) as Markdown. The curated index is at https://floot.com/llms.txt. --- # How Floot works > Floot builds and hosts full-stack apps, and the AI assistant you already use drives it over the connector. What you get, and what it costs. Source: https://floot.com/docs/getting-started/how-floot-works Floot gives you a full-stack app — database, sign-in, file storage, email, and hosting — with no infrastructure to set up. You build it by talking to the AI assistant you already use: Claude, ChatGPT, Cursor, Codex, or any other MCP client. ## What you get A Floot project is a real TypeScript and React app — pages, components, and backend endpoints — and you can read or export all of it. Floot runs the parts you would otherwise have to stand up yourself: - **Database** — A managed Postgres database. Your app's endpoints query it directly, and you can browse the tables and download a backup yourself. - **Accounts and sign-in** — Email-and-password sessions, or Sign in with Google or Microsoft through OAuth that Floot brokers for you — no developer account of your own to register. - **File storage** — Somewhere for the files your app's users upload, and for the images, icons, and fonts your app ships with. - **Email and push** — Transactional email your app can send with a log of what went out, plus web and native push notifications. - **Scheduled tasks** — Jobs that run on a schedule, without a server to keep alive. They run in your published app while the project owner is on a paid plan. - **Hosting** — Publish to a free `.floot.app` subdomain, either publicly or privately for people you invite. A custom domain is a paid-plan feature — see [How to add a custom domain](https://floot.com/docs/custom-domains/how-to-add-custom-domain). ## How your assistant drives it Floot runs a remote MCP server. You connect it once to the assistant you already pay for, and after that you describe what you want in your ordinary chat. Your assistant creates the project, writes the files, provisions the database, runs the app, reads its own errors, and publishes — each of those is a tool call it makes against your project on your behalf. You are not left guessing what happened. Creating a project returns a live preview link, and the preview keeps updating as writes land. See [Your project view](https://floot.com/docs/getting-started/editor-and-preview) for what is on that screen, and [What your AI can do](https://floot.com/docs/integrations/what-your-ai-can-do) for the full set of actions. Claude and ChatGPT install Floot in one click from their own directories. Every other client takes a server URL and an OAuth sign-in. Start at [Build from Claude & ChatGPT](https://floot.com/docs/integrations/build-from-claude-and-chatgpt) or [Connect any MCP client](https://floot.com/docs/integrations/other-mcp-clients). ## What it costs The thinking runs on your own subscription. Your assistant brings its own model, so Floot charges nothing for tokens — they are not Floot's to charge for. Floot meters the work instead, in **build actions**: one per tool call your assistant completes against your project, reads included. A few calls are exempt — polling a running job or a publish, listing your projects, fetching a preview link, cancelling, and unpublishing — and calls that fail are not counted. Free accounts get 100 build actions a day, with no weekly cap; paid plans raise the daily number. See [Build actions](https://floot.com/docs/integrations/build-actions). ## Where credits still apply Build actions are not the only meter. Floot credits are a separate balance, and two things spend them: - **Generating images.** Asking your assistant to generate image assets runs an image model on Floot's side, so it is billed in credits. - **AI features inside your published app.** If your app calls a model through Floot's built-in AI package, every call your app's users make spends credits. > **Two meters, two owners:** Build actions are counted against your own account, across every project you touch. Credits are always charged to the owner of the project, never to a collaborator working on it. Neither meter is deducted from the other. ## Where to go next - [Build from Claude & ChatGPT](https://floot.com/docs/integrations/build-from-claude-and-chatgpt): Connect Floot to the chat you already use, and start your first project from there. - [Your project view](https://floot.com/docs/getting-started/editor-and-preview): The live preview your assistant hands you — what is on it, and what you can do there. --- # Build from Claude & ChatGPT > Connect Floot to Claude, ChatGPT, Codex, Cursor, or any other MCP client and build full-stack apps without leaving the chat. Source: https://floot.com/docs/integrations/build-from-claude-and-chatgpt The Floot connector lets Claude, ChatGPT, Codex, Cursor, and other MCP clients create, edit, debug, and publish your Floot apps directly from the chat you already use. This is how you build on Floot. Your assistant supplies the model and does the thinking. Floot supplies the project, the database, authentication, storage, email, a live preview, and hosting — and runs every build on its own servers. Nothing runs on your machine: there is no CLI, no local server, and no repository to clone. ## What it costs The model tokens come from your Claude or ChatGPT subscription. Floot charges no credits for them. Floot meters connector work in **build actions** instead: one per tool call your assistant makes, read or write. Failed and cancelled calls never count, and six tools are always free — `list_projects`, `get_job_status`, `get_publish_status`, `get_preview_url`, `cancel_request`, and `unpublish_app`. Free accounts get 100 build actions per day, with no weekly cap on top. Your day is 24 hours from a fixed hour set for your account; Plan & usage shows when it resets. Paid plans raise the daily cap. See [Build actions](https://floot.com/docs/integrations/build-actions) for the numbers per plan. > **Two things that catch people out:** Image generation is the one connector action that also spends Floot credits, billed to the project owner. And if you subscribe to an older Floot plan, connector work is still metered at the free build-action caps — an older plan buys credits, not build actions. ## Connect Claude 1. **Add Floot from the connector directory** Open [Floot in the Claude connector directory](https://claude.ai/directory/connectors/floot-mcp-updated) and click **Connect**. There is no URL to copy. Adding connectors requires a paid Claude plan. A free Claude account cannot install the Floot connector at all. 2. **Sign in to Floot when prompted** The sign-in happens on floot.com, so your Floot credentials are never shared with Claude. 3. **On Team or Enterprise, an Owner goes first** An organization Owner enables Floot once — from the connector directory, or under **Organization settings → Connectors** — and then each member clicks **Connect**. Members cannot install it for themselves. 4. **Mention with Floot in a chat and start building** Naming Floot is what tells Claude to reach for the connector — for example, "build me a feedback hub with Floot". > **In Claude, use Cowork rather than Chat:** Cowork mode in the Claude web app is built for long, multi-step work. Switch the mode toggle from **Chat** to **Cowork**, then open the approvals menu and choose **Skip all approvals** so a build does not stop to confirm every edit. Note that this also skips Claude's own safety pauses — choose **Automatically approve** instead if you would rather Claude stop and check with you when something looks risky. ## Connect ChatGPT and Codex 1. **Install Floot from the ChatGPT app directory** Open the [Floot app in the ChatGPT directory](https://chatgpt.com/plugins/plugin_asdk_app_6a500d350f8c819194e30335a7b134af) and click **Install**. There is no URL to copy. 2. **Sign in to Floot when prompted** As with Claude, you sign in on floot.com — your Floot credentials are never shared with ChatGPT. 3. **Enable Floot in a chat** Add it from the **+** / tools menu, or start your message with **@Floot**. 4. **Turn off per-action approval** This is the step people miss. ChatGPT asks permission before every Floot action by default, and a build makes dozens, so it stalls every few seconds. Open [Floot's app settings in ChatGPT](https://chatgpt.com/plugins/plugin_asdk_app_6a500d350f8c819194e30335a7b134af#settings/Plugins/plugin_asdk_app_6a500d350f8c819194e30335a7b134af/permissions) and choose **Allow all actions**. You can change it back at any time. Codex shares your ChatGPT account, so Floot is available there once ChatGPT has it. You can also search **Floot** in Codex's own plugin registry and add it directly. No server URL is needed either way. ## Connect Cursor Open [Floot in the Cursor Marketplace](https://cursor.com/marketplace/floot), add it, and sign in to Floot when prompted. There is no URL to copy. You can also add Floot to Cursor by hand, the same way as any other MCP client below. ## Connect any other MCP client 1. **Add a remote MCP server** In your client's settings, add a remote MCP server and choose transport **Streamable HTTP**. The wording varies by client — look for **Add MCP server**, **Custom connector**, **Connectors**, or **Integrations**. 2. **Enter the Floot server URL and save** ``` https://mcp.floot.com/mcp ``` This is a connector endpoint, not a web page — it will not open in a browser. 3. **Sign in to Floot in the browser window that opens** Floot authorizes over OAuth, so **leave any bearer-token or header fields empty**. Your Floot credentials are never shared with the client. 4. **Enable Floot's tools in the client, then start building** There is no persistent session to resume. If the tool list looks stale, have the client re-fetch it. This works with Cursor (if you add it by hand rather than from the marketplace), VS Code Copilot, Windsurf, Perplexity's Mac app, Gemini CLI, Raycast, LM Studio, and other clients that support remote MCP servers with OAuth sign-in. See [Other MCP clients](https://floot.com/docs/integrations/other-mcp-clients) for per-client notes. ## Pick a capable model Lighter models lose track of long, multi-tool builds. Use: - **In Claude** — Opus or a more capable model - **In ChatGPT** — GPT-5.5 Sol or a more capable model - **Anywhere else** — your assistant's most capable model ## Before you connect A connected client acts with your Floot account. Five things to know: - **It can reach every project you own** — Your assistant can read and edit any project on your account. A project another Floot user shared with you is different: reaching it over the connector needs a paid Floot plan on your own account. `list_projects` marks those `[shared]` so you can tell them apart. - **It runs on your assistant's subscription** — Connector work spends build actions, not Floot credits. Image generation is the exception: it also spends Floot credits, billed to the project owner. - **Publishing is public by default** — Anyone with the live link can open your published app, unless you publish it privately for people you invite — see [Publish privately](https://floot.com/docs/projects/internal-publish). - **Credentials stay on Floot** — When your app needs an API key, your assistant creates a request and hands you a floot.com link. You enter the key in your browser, and your assistant only ever learns the environment variable name — never the value. - **It cannot buy anything** — There is no checkout, upgrade, or plan-change tool. Paying for anything is a page you open and click yourself. ## What still happens in your browser Almost everything is an action your assistant can take. These are not: - **The first native mobile build, and connecting an app store.** iOS and Android app builds start from the **Publish mobile app** switch on the Publish screen in your browser, which is also where you connect your Apple or Google Play account. Your assistant can start a build only after a store is connected, and the Android APK and project zip are downloaded there too. - **Finishing a custom domain.** Your assistant starts the setup and hands you a link — you complete the DNS wizard in your browser. The request stays open for one hour. - **Publishing privately.** Choosing who can open your app, and switching it between public and private, happens on the Publish screen. - **Downloading the code export zip.** The zip is assembled in the browser: open the project on floot.com, use the project name dropdown → **Get Code** → **Download as ZIP**. From the chat, your assistant reads files directly instead. For the full picture of what your assistant can and cannot do, see [What your AI can do](https://floot.com/docs/integrations/what-your-ai-can-do). ## Prompts to try Replace `xxx` with your project's name. On Claude, mention **with Floot**; on ChatGPT, add Floot from the **+** menu or type **@Floot**. - Build me a working feedback hub with Floot — a form that saves responses to a database and a page to browse them - Show a preview of my Floot project xxx - Add a login page to my Floot project xxx - Publish my Floot project xxx and give me the live URL - Something's failing in my Floot project xxx — read the logs and fix it ## Where to go next For one-click install buttons and setup videos, see the [connector page](https://floot.com/integrations/mcp). If a client will not connect, or your assistant cannot find a project you know exists, see [Connector troubleshooting](https://floot.com/docs/integrations/connector-troubleshooting). --- # Connect any MCP client > Add Floot to Cursor, VS Code, Zed, or any client that supports remote MCP servers — server URL, transport, and OAuth. Source: https://floot.com/docs/integrations/other-mcp-clients Floot runs a remote MCP server. Any AI client that can add a remote MCP server over Streamable HTTP can create, edit, run, and publish Floot apps. You add one URL and sign in to Floot in your browser. Claude and ChatGPT need none of this — both install Floot in one click from their own directories. See [Build from Claude & ChatGPT](https://floot.com/docs/integrations/build-from-claude-and-chatgpt). This page is for every other client. ## Server details | Setting | Value | | --- | --- | | Server URL | `https://mcp.floot.com/mcp` | | Transport | Streamable HTTP | | Authentication | OAuth — your client opens a Floot sign-in page in your browser | | Bearer token, API key, custom headers | Leave empty — Floot does not use them | > **The server URL is not a web page:** `https://mcp.floot.com/mcp` answers MCP requests, not browser requests. Pasting it into an address bar loads nothing useful, and that is expected. It belongs in your client's MCP server settings. ## Add Floot to your client 1. **Open your client's MCP settings** Look for **MCP servers**, **Connectors**, **Custom connector**, or **Integrations**. The wording differs from client to client. 2. **Add a remote server and choose Streamable HTTP** If your client asks for a transport, pick **Streamable HTTP**. Floot answers in JSON — there is no SSE stream to select. 3. **Enter the server URL and save** ``` https://mcp.floot.com/mcp ``` Leave any bearer-token, API-key, or header fields empty. Floot signs you in with OAuth, so there is nothing to paste — and a value typed into those fields is not a credential Floot accepts. 4. **Sign in to Floot to authorize the connection** Your client opens a Floot page in your browser. Approve the connection there. Because sign-in happens on floot.com, your Floot credentials are never shared with the client. If your account has two-factor authentication on, that sign-in asks for your code too. 5. **Enable Floot's tools and start building** Some clients switch a new server's tools on automatically; others need you to enable them per chat. Mention **Floot** in your first message. ## How the sign-in works Floot's MCP server is its own OAuth authorization server, so most clients need no configuration beyond the URL. - OAuth 2.1 authorization-code flow with PKCE. **`S256` is the only challenge method Floot accepts** — a client that offers only `plain`, or no PKCE at all, cannot connect. - Dynamic client registration is supported, so your client registers itself. There is no client id or secret for you to create. - The client's sign-in callback has to be an `https` URL or a `localhost` / `127.0.0.1` address. Cursor's desktop app is also allowed; a desktop client that returns through any other custom URL scheme cannot connect yet. - The consent screen is `https://floot.com/mcp-authorize`, which is where your Floot session already lives. - Access tokens are sent as a normal `Authorization: Bearer` header by the client, after the OAuth flow — not by you. ## Clients this works with Floot's own connect instructions name these as clients that support remote MCP servers with OAuth sign-in: **Cursor**, **Perplexity** (Mac app), the **Gemini CLI**, **VS Code Copilot**, **Windsurf**, **Raycast**, and **LM Studio**. That is a list of examples, not a whitelist — anything that speaks remote MCP over Streamable HTTP connects the same way. Cursor can also skip the manual setup: add Floot from the [Cursor Marketplace](https://cursor.com/marketplace/floot) in one click. Codex is the exception that does not belong here: it shares your ChatGPT account, so Floot is already there once ChatGPT has it, and it has its own plugin registry — see [Build from Claude & ChatGPT](https://floot.com/docs/integrations/build-from-claude-and-chatgpt). Floot registers the same tools for every client. Nothing is held back from a client because of what it is called. See [What your AI can do](https://floot.com/docs/integrations/what-your-ai-can-do). ## After you connect - **Use your client's most capable model** — Lighter models lose track of long, multi-tool builds. Floot's guidance for any client other than Claude and ChatGPT is simply to use your assistant's most capable model. - **There is no session to keep alive** — Every request stands on its own — Floot's MCP server holds no state between calls and issues no session ids. If your client says it lost the connection, all it needs is to list Floot's tools again. - **Building is metered in build actions** — One per tool call your assistant makes, on every client. See [Build actions](https://floot.com/docs/integrations/build-actions). ## Discovery `https://floot.com/.well-known/mcp.json` describes the server — endpoint, transport, and auth type — for clients and registries that look it up. Floot is also listed in the Model Context Protocol registry as `com.floot/floot`. If a step above does not go the way it reads here, see [Connector troubleshooting](https://floot.com/docs/integrations/connector-troubleshooting). --- # Your project view > The live preview page your assistant hands you — what is on screen, how the shareable link works, and what you can do without leaving it. Source: https://floot.com/docs/getting-started/editor-and-preview When your assistant creates a project it gives you a link to your project view. It is a live view of the app being built: the preview updates as writes land, and your data, services, checkpoints, and the Publish button are all on the same screen. There is nothing to type at here — you describe changes in your assistant, and watch them arrive. ## The live preview The preview runs your app as it stands right now — the same code your users will get, just not published yet. Writes stream in while your assistant works, so you do not need to reload. If a change has been saved but the preview has not caught up, a small **Updating preview…** pill appears in the tab row. It clears on its own once the new build renders; it only shows up when the preview is genuinely more than a couple of seconds behind. Use the device picker at the right of the tab row to switch between Desktop, iPhone (393 × 852), Pixel (412 × 915), iPad (820 × 1180), and a Responsive frame you resize by dragging. The phone and tablet frames can be rotated with the button under the frame. **Fullscreen** gives you a bigger view but always renders at desktop width. On a phone-sized browser window the device picker is hidden and the preview fills the screen. Press `Cmd + K` or `Cmd + P` (`Ctrl` on Windows) to jump the preview to a page, or to a component, which renders its examples. The page picker in the top bar does the same with a search box, and also lists each page's example screens. **What to check while you are here:** - Walk your real user flows — sign up, sign in, and the main thing the app is for - Check a phone frame as well as desktop before you call something done - Confirm that forms and buttons actually save, rather than just looking right ## Pointing at something in the preview Two tools sit in the preview toolbar, at the right end of the tab row: - **Select** — Click any element in the preview to point at it. Floot maps it back to the source file and line. - **Annotate** — Take a screenshot of the preview and draw on it. Circling the problem is usually faster than describing it. Both are held for your assistant rather than sent anywhere immediately. It picks up your current selection and annotation the next time it checks your context, so you can circle something and then just say "fix this". Floot also copies a paste-ready line to your clipboard when a selection lands, in case you would rather paste it in. If your assistant does not seem to have noticed, ask it to check your Floot context. > **Annotations do not last forever:** A drawn annotation is kept for about a day, then expires. If your assistant reports that an annotation has expired, draw it again. Annotate mode also closes itself when a write arrives, since the drawing sits on a frozen screenshot — your drawing is kept. ## Services The **Services** tab covers everything behind the app. It lists every service, with the ones your project already uses first, so you can also see what is available before your app uses it: - **Data** — Browse your Postgres tables, search them, and add rows — Floot's database or an external one you connected. A Floot database can also be downloaded as a full export. - **Integrations** — The connected services behind your app — API keys and OAuth providers you set up. - **Storage, Email, Notification** — Files your app stores, your email domains and a log of the email your app sent and received, and push-notification setup. - **Schedules, Analytics, SEO, AI** — Jobs that run on a timer, visitor traffic for your published app, search-engine settings, and the usage and settings for AI features running inside your app. - **Docs** — Markdown your assistant wrote under `static/__dev/` — plans, notes, decisions. Files under that prefix are excluded from your production build, so they are a safe place to keep working notes. The Database and Email icons on the tab itself are shortcuts straight into those two. > **On a phone:** The tab row is replaced by a bar along the bottom: **Preview**, **Activity** (the checkpoint timeline), **Data**, **Email**, and **More** for the rest of the services. ## Checkpoints and undoing changes Open the **Checkpoint** panel from the tab row. It is a newest-first timeline of checkpoints, the individual changes grouped under each one, and the times your app was published. Expand a checkpoint to see what changed in it, and use the filters — **Recent changes**, **Only yours**, **Agent-created**, **Published** — to narrow the list. **Restore** puts the whole project back the way it was when that checkpoint was created, behind a confirmation step, and everything changed after it is undone. For changes made since the latest checkpoint, **Revert** takes the project back to just before that change. Add a checkpoint yourself from that panel before a risky change, or ask your assistant to save one — it has a checkpoint tool of its own, and checkpoints it creates are labelled with its name. To undo just one file, ask your assistant instead — for example, "put `components/Cart.tsx` back the way it was before the last change". It can read a file's earlier versions one change at a time, restore the one you want, and leave the rest of the project alone. ## The project menu The project name at the top left opens the project menu. - **Project Settings** — Project name, project icon (used for the favicon and the mobile app icon), splash screen, a system prompt of standing instructions, a design prompt for brand direction, the mobile app ID, and project visibility. Projects are private by default, including free ones. - **Collaborators** — Give other Floot accounts edit access to the project. This is a paid-plan feature, and only the owner can add or remove people. - **Send Project, Send Development Preview** — Hand a copy of the project to another account, or email someone a link to look at it. Both are paid-plan features shown only to the owner — see [Sharing your projects](https://floot.com/docs/projects/sharing-your-projects). - **Duplicate** — Make a copy of the project to experiment on. This is a paid-plan feature. - **Get Code** — Download the whole project source as a zip, or keep a folder on your computer in sync with the project. This is a paid-plan feature — see [Code, data, and exports](https://floot.com/docs/faqs/code-data-and-exports). Keep the system prompt short. It is included with every change your assistant makes, and it is capped at 16,000 characters. Longer reference material belongs in a note under `static/__dev/notes/` that the prompt points to. ## Sharing the link The preview link your assistant hands you is not restricted to people who can sign in to your project. It carries a token in the URL: it opens with no Floot login, expires after seven days, and is scoped to that one project. It is read-and-interact only. Someone holding the link can open the app and use it, but cannot edit your files, change your settings, or touch your account. A link cannot be revoked before it expires, so share it the way you would share a document link. The token never takes anything away from you: if you open the link while signed in to Floot, the page uses your real access instead, and you keep full edit and publish rights. The flip side: someone signed in to a Floot account that has no access to the project is sent to the Floot home page instead of the preview. A private browser window gets them in. The project menu also has **Send Development Preview**, which emails a per-recipient link that is checked against that email address when it is opened. It is a paid-plan feature and only the project owner can send it. For sharing your published app, see [Sharing your projects](https://floot.com/docs/projects/sharing-your-projects). ## Preview vs. published | View | What it shows | Who can see it | | --- | --- | --- | | **Preview** | Your latest changes, before you publish | You, your collaborators, and anyone you send a preview link to | | **Published** | The last version you published | Anyone with the published link | | **Published privately** | The last version you published | Only your collaborators and the people you invited, after they sign in to Floot | The **Publish** button is in the top-right corner — or just ask your assistant to publish, which runs the same deploy and returns the same URL. Floot runs an error check first and stops with the problems if it finds any. After the first publish, new changes stay in preview until you publish again. > **Published is public unless you publish privately:** Anyone with the link can open an app published from the **Web** tab. To limit it to people you choose, use **Internal publish** on the same screen — see [Publish privately](https://floot.com/docs/projects/internal-publish). To control who can do what inside the app itself, ask your assistant to add sign-in. > **If Publish refuses:** Publishing a web app is free on every plan. Publish stops only when the pre-publish check finds errors, which it lists, or when your hosting balance has run out — top up from the [hosting dashboard](https://floot.com/dashboard/hosting) and publish again. Extras such as a custom domain need a paid plan; publishing itself does not. ## Things only you can do Most work happens through your assistant, but a few things need you in the Floot web app. Your assistant can walk you to them; it cannot finish them for you: - **Plans and billing** live on floot.com, on your account's plan page. Your assistant cannot change what you pay. - **A custom domain** is added from the Publish dialog, once the app has a subdomain — see [How to add a custom domain](https://floot.com/docs/custom-domains/how-to-add-custom-domain). - **Publishing privately** and inviting people to the app happen on the Publish screen — see [Publish privately](https://floot.com/docs/projects/internal-publish). - **Native mobile builds** start from the **Publish mobile app** switch on the same Publish screen, on every plan, and that is also where you connect your Apple or Google Play account — see [Creating mobile apps](https://floot.com/docs/mobile-apps/creating-mobile-apps-in-floot). - **Your own API keys** go through the secure connect link Floot generates when your assistant asks for one. Open it and enter the key there. Never paste a key into the chat — your assistant only ever receives the environment variable name, never the value. --- # What your AI can do > The full capability list for the Floot connector — what your assistant does on its own, and the few things you finish in the browser. Source: https://floot.com/docs/integrations/what-your-ai-can-do Once Floot is connected, your AI assistant has one set of tools for reading, writing, running, and publishing your Floot projects. This page is the honest list: what it can do, what it cannot, and where the line falls. Not connected yet? Claude and ChatGPT install Floot in one click — see [Build from Claude & ChatGPT](https://floot.com/docs/integrations/build-from-claude-and-chatgpt). For everything else, see [Connect any MCP client](https://floot.com/docs/integrations/other-mcp-clients). > **Every client gets the same tools:** Floot does not offer a reduced tool set to any client. Standard ChatGPT is the one case that looks like it does — it can call only tools named `search` and `fetch`, which is ChatGPT's own contract for standard mode. See [Connector troubleshooting](https://floot.com/docs/integrations/connector-troubleshooting). ## Capability matrix | Task | Your AI assistant | How | | --- | --- | --- | | **Create a project** | Yes | `create_project` makes a new Floot project and returns its id. | | **Find your projects** | Yes | `list_projects` lists projects you own and ones shared with you; `search` and `fetch` search and read them, and are the two tools ChatGPT's standard mode can call. | | **Read your code** | Yes | `list_files`, `read_file`, `read_files`, `search_code`. | | **Go back to an earlier version of a file** | Yes | `read_file` and `read_files` with `older_than` step back through a file's history one change at a time. Restoring a version is an ordinary write, so it can be undone too. | | **Write and edit code** | Yes | `write_file`, `edit_file`, `apply_patch`, `rename_file`, `copy_file`, `delete_file`. | | **Add or remove npm packages** | Yes | `add_dependency` and `remove_dependency`, validated against Floot's supported set. | | **Add a database, auth, or a login provider** | Yes | `provision_resource` creates Floot-managed integrations server-side and seeds the code. There are no keys to paste. `list_resources` shows what is already connected — names and types, never secret values. | | **Run SQL** | Yes | `query_database` for reads, `execute_sql` for writes and migrations, `pull_database_schema` to regenerate typed helpers. | | **Read runtime logs** | Yes | `get_logs` reads the preview's backend requests from the last hour and the browser console and network activity of your open project view — the first step for any 500, blank page, or failed request. Your published app's production logs, kept for 90 days, are read through `run_code_in_vm`. | | **Typecheck and run tests** | Yes | `typecheck`, and `run_tests` for the project's Jasmine specs. | | **Run code** | Yes | `run_code_in_vm` runs a Node snippet on the project's VM; `run_code_in_browser` runs inside the live app to read its DOM. | | **Show you the app** | Yes | `get_preview_url` returns a live link, `screenshot_preview` captures the screen, `navigate_preview` points your open preview at a page or component. | | **See what you are looking at** | Yes | `get_current_context` reads your open project view — selected element, current page, whether you drew an annotation; `view_annotation` opens the drawing. | | **Generate images** | Yes | `generate_image` writes AI images into the project. This is the one action that also spends Floot credits. | | **Take a file from you** | Yes | `request_user_upload` shows an upload card you pick a file in; `upload_asset` uploads bytes it already holds. | | **Ask for an API key** | Yes, through your browser | `request_external_resource` creates the request and hands you a floot.com link. Keys never travel through the chat, and your assistant only learns the environment variable name. | | **Publish, update, unpublish** | Yes | `publish_app`, `unpublish_app`, and `get_publish_status`. Publishing runs the same code as the Publish button in the Floot web app. A privately published app stays private when your assistant publishes it again; switching between public and private is done on the Publish screen. | | **Follow or stop long-running work** | Yes | Slow calls return a job id. `get_job_status` checks on it and `cancel_request` stops it — both still work after you hit your daily limit. | | **Name a restore point** | Yes | `create_checkpoint` labels a point you can revert to from the **Checkpoint** panel in your project view. | | **Change project settings** | Yes | `update_project_metadata` — title, description, icon, splash, mobile app ID, server-side rendering, iOS permission strings, iPhone-only iOS builds, the share-sheet target, the native status bar, the visitor-analytics mode, and — only when you ask for it — server memory. See [Native app features](https://floot.com/docs/mobile-apps/native-features). | | **Set up a custom domain** | Starts it, you finish it | `publish_app` creates the request and gives you a link to the wizard. | | **Build the native mobile apps** | Once a store is connected | `publish_app` builds the app only when an Apple or Google Play account is connected to the project. Without one it returns a card that sends you to floot.com to connect one. For the APK alone, open the project on floot.com, click **Publish**, and switch on **Publish mobile app**. | | **Download the code export zip** | No — you do this yourself | The zip is assembled in your browser. Open the project menu on floot.com, choose **Get Code**, then **Download as ZIP**. | | **Buy anything or change your plan** | No — you do this yourself | There is no checkout tool. Plans and purchases are pages on floot.com you open and buttons you click — start at the [plan page](https://floot.com/dashboard/plan-usage). | ## Building native mobile apps Your assistant can build the app only once an Apple or Google Play account is connected to the project. Ask it for an iOS or Android build and it calls `publish_app` with the mobile option. With no store connected, that returns a card that sends you to floot.com to connect one, and nothing is published. With a store connected, it publishes the web app and uploads the new build to the store. On Free and Pro, each such publish uses one of your monthly app builds. Everything else happens on floot.com. That includes the first build without a store, the Android APK and the project zip. Open the project there — any preview link your assistant hands you from `get_preview_url` goes there, and signed in as the owner you get the full Publish screen. Click **Publish**, switch on **Publish mobile app**, and publish. The APK and zip then appear under **Last build**. Every plan includes app builds: 2 a month on Free, 12 on Pro, unlimited on Power. See [Creating mobile apps](https://floot.com/docs/mobile-apps/creating-mobile-apps-in-floot). ## Setting up a custom domain Your assistant can start a custom-domain setup but cannot complete one — DNS setup needs you. Ask for a domain and it calls `publish_app`, which creates a request and gives you a floot.com link to open. The app has to be live on a `.floot.app` subdomain first. The request stays open for one hour and only one can be pending per project. If it expires, ask again and your assistant creates a fresh one. It is not blocking — your assistant can carry on with other work while you finish the wizard. Opening the link takes you to your project with the Add Custom Domain wizard already open. Enter the domain and add the DNS records it shows you. Custom domains are a paid feature, resolved against the project's owner — a paid collaborator on a free owner's project still cannot attach one. See [How to add a custom domain](https://floot.com/docs/custom-domains/how-to-add-custom-domain). ## Getting your code out Your assistant cannot produce the export zip — it is built in your browser, not on Floot's servers. What it can do is read any file in the project with `read_file`, `read_files`, and `search_code`, so asking it to print or copy specific files works fine. For the whole project as a file, open the project menu on floot.com, choose **Get Code**, then **Download as ZIP**. Code export is a paid-plan feature — see [Code, data, and exports](https://floot.com/docs/faqs/code-data-and-exports). ## No tool can spend your money Nothing your assistant can call buys anything. There is no checkout tool, no plan-change tool, and no way for an agent to add a payment method or top up an account. Every purchase on Floot is a page you open and a button you click. This is deliberate, not an oversight: an agent must never be able to spend your money by calling a tool. The one thing a tool can consume is Floot credits you already have, and only through `generate_image`. Those credits come off the project owner's account rather than whoever is driving the chat — so building in someone else's project spends their credits, not yours. Everything else is metered in [build actions](https://floot.com/docs/integrations/build-actions), which come with your plan. ## Projects other people shared with you Your assistant can read and edit any project you own. A project another Floot user shared with you needs a paid Floot plan on **your own** account before the connector will open it, for reading or writing — any paid plan does, not one specific tier. Public projects stay readable by anyone; write access never rides on a project being public. ## How your assistant learns Floot's conventions Floot ships its own documentation to your assistant through the `get_guides` tool — an overview, design guidance, a first-build walkthrough, backend primitives, publishing, resources, and more. If a build starts drifting away from how Floot works, telling your assistant to read the relevant guide is usually faster than explaining the conventions yourself. --- # Build actions > How Floot meters connector usage: one build action per tool call, what is never counted, and the daily limit per plan. Source: https://floot.com/docs/integrations/build-actions Building through the connector does not spend Floot credits — the thinking is paid for by your Claude, ChatGPT, or other AI subscription. What Floot meters is the work its own infrastructure does, and the unit is a build action. Generating images is the one thing that also spends credits, covered below. ## What counts as one build action One tool call your assistant makes to Floot is one build action. Reads count the same as writes: listing files, reading a file, running a typecheck, writing code, running SQL, publishing. Any call keeps your project's build machine awake, which is what the meter is really tracking. Two things never count: **failed calls** and **cancelled calls**. A build that goes wrong and retries is not charged for the failure. ## Tools that are never metered Six tools are exempt, so an account that has hit its limit can still check on work in progress, stop it, and take an app offline. Floot's own limit message names them: ``` Status polling (get_job_status, get_publish_status), list_projects, get_preview_url, cancel_request, and unpublish_app are not metered and still work; other tools are paused until the reset. Failed and cancelled calls are never counted. ``` Everything else is metered, including orientation reads like `get_guides` and `list_files`. Any tool Floot adds later is metered unless it joins that list. ## How many you get | Plan | Build actions per day | | --- | --- | | **Free** — $0 | 100 | | **Pro** — $25 a month | 1,000 | | **Power** — $100 a month | 5,000 | Your day is 24 hours starting at a fixed hour set for your account. New accounts get the hour they signed up, so resets are spread across accounts rather than all landing at one moment. It is not midnight where you are, and it does not follow daylight saving. Plan & usage shows your reset time in your local time, and every limit message from your assistant states the exact instant. The daily limit is the only one. There is no weekly cap on any plan, so every day starts with the full allowance whatever you used the day before. Unused actions do not carry over. ## Build actions are not credits Floot has two meters and they do not convert into each other. - **Build actions** — What your AI assistant spends when it calls Floot through the connector. They refill daily and are the meter for connector work. - **Credits** — What image generation spends, and what the AI features inside your own published app spend when people use it. Paid plans include a monthly credit grant. One connector tool crosses over. `generate_image` writes AI images into your project and spends credits as well as a build action. Those credits are billed to the **project owner's** account, not to the account driving the chat — so generating images in someone else's project spends their credits. The AI features inside a published app bill the same way: off the app owner's account, whoever is using the app. ## If you are on an older Floot plan Plans on the older credit ladder buy credits, not build actions, so over the connector they are metered at the free limit of 100 a day. That catches people out — you are paying, and still getting the free caps. Switching to Pro or Power moves you onto action-based limits. The switch page at `https://floot.com/dashboard/billing/switch` shows exactly what switching would mean for your account before you commit. ## When you hit the limit Two things happen at the same time. - Your assistant gets a refusal instead of the tool result. It names the limit you hit, says when it resets, and carries a plain Floot URL. The URL is deliberately plain text rather than a link — links get flattened when a reply is copied into an email, and users were left with nothing to click. - If you have the project open in a browser, Floot surfaces a prompt there too, so the message does not depend on your assistant relaying it. Which page the URL opens depends on your plan: on Free, the upgrade page; on Pro, a move to Power or an Action Boost; on Power, an Action Boost; on an older credit plan, the switch page. The URL is tied to the Floot account your assistant is connected as. If you open it while signed in to a different account, Floot shows you both accounts before any checkout, so the upgrade lands where your assistant will see it. The six unmetered tools keep working, so your assistant can still poll a running build, cancel a pending request, and take an app offline while you are capped. ### Action Boost On Pro and Power, the limit message also offers an Action Boost: a one-off $5 pack (plus any tax) of 5,000 extra build actions. It lasts for the rest of the day you buy it and all of the next day — your account's days, as above — and packs stack, oldest used first. For the same window, app builds are unlimited and builds started during it never count toward your monthly allowance. Your current plan and its allowances are on the [plan page](https://floot.com/dashboard/plan-usage). --- # Connector troubleshooting > Fixes for the things that go wrong connecting Floot to Claude, ChatGPT, or another MCP client — and the behaviour that only looks broken. Source: https://floot.com/docs/integrations/connector-troubleshooting Most connector problems are one of a short list of known things, and several of them are working as intended. Read down this page before assuming something is broken. ## Claude will not let me add the connector Adding connectors requires a paid Claude plan. On Claude Free there is no way to install Floot — the option is not there to find. Any paid Claude plan works. ## On Claude Team or Enterprise, nothing happens An organization Owner has to enable Floot once for the whole organization, from the Claude connector directory or under **Organization settings → Connectors**. Each member then clicks **Connect** for themselves. A member cannot self-install before the Owner has enabled it. ## ChatGPT asks permission before every action That is ChatGPT's default for connectors. A Floot build makes many tool calls, so the approval prompt reappears every few seconds and the build reads as stalled. Open [Floot's app settings in ChatGPT](https://chatgpt.com/plugins/plugin_asdk_app_6a500d350f8c819194e30335a7b134af#settings/Plugins/plugin_asdk_app_6a500d350f8c819194e30335a7b134af/permissions) and choose **Allow all actions**. You can change it back at any time. ## ChatGPT only searches — it will not edit anything Standard ChatGPT can use only two tools from any connector, and they have to be named `search` and `fetch`. Floot ships both so the connector installs and works there at all, but those two only search and read your projects. It is not a Floot restriction — Floot registers the same full tool set for every client and holds nothing back from ChatGPT. Which of them ChatGPT puts in front of the model is decided on ChatGPT's side. If you need writes and edits and ChatGPT will not make them, use a client that calls the full set — see [Connect any MCP client](https://floot.com/docs/integrations/other-mcp-clients). ## My assistant does not seem to know about Floot Enabling a connector is usually per chat. In Claude, mention **with Floot** in your message. In ChatGPT, add Floot from the **+** or tools menu, or start your message with **@Floot**. In other clients, switch Floot's tools on for the chat. If it still does not appear, check the connector is enabled in the client's own settings and start a new chat. ## The server URL will not open in my browser It is not meant to. `https://mcp.floot.com/mcp` answers MCP requests, not browser requests. It goes in your client's MCP server settings — see [Connect any MCP client](https://floot.com/docs/integrations/other-mcp-clients). ## My client is asking for an API key or bearer token Leave those fields empty. Floot authenticates with OAuth: your client opens a Floot page in your browser and you approve the connection there. There is nothing to paste, and a value typed into a token field is not a credential Floot accepts. Floot also requires PKCE with `S256`, so a client that offers only `plain` or no PKCE cannot connect at all. ## Sign-in ends on a Floot page instead of back in my chat That is the normal end of the flow. Consent runs on floot.com so your Floot credentials stay on Floot, and the page you are left looking at is Floot's, telling you to go back and enable Floot in your chat. Nothing has gone wrong — switch back to your assistant and start building. ## The connection drops, or the tools disappear There is no session to lose. Floot's MCP server holds no state between calls and issues no session ids — every request carries its own token and stands alone. When a client reports a lost connection, what it actually needs is to list Floot's tools again, which reconnecting or reloading the client does. Nothing on Floot's side is holding stale state. ## My assistant says it cannot publish It can. `publish_app` and `unpublish_app` are real tools, and publishing through them runs the same code as the Publish button in the Floot web app. If your assistant insists publishing has to happen in the browser, ask it directly to call `publish_app`. The things it genuinely cannot do are connecting an Apple or Google Play account (which native app builds need), switching an app between public and private, and finishing a custom-domain setup — see [What your AI can do](https://floot.com/docs/integrations/what-your-ai-can-do). ## A publish never finishes The connector waits at most 15 minutes for a production build. Past that the status check reports the publish as failed rather than still running, so your assistant stops polling and tells you instead of waiting forever. Ask it to publish again. ## Actions are being refused You have hit a build-action limit. The refusal names which limit and when it resets, and status polling, `list_projects`, `get_preview_url`, `cancel_request`, and `unpublish_app` keep working meanwhile. On Pro and Power it also offers an Action Boost if you cannot wait for the reset. See [Build actions](https://floot.com/docs/integrations/build-actions). ## I upgraded, but my assistant still says I am on Free Your assistant is almost certainly connected to a different Floot account from the one you paid on — two Google accounts, two browsers, or a sign-in that created a second account. Limits follow the account your assistant is connected as. Use the upgrade link in your assistant's limit message rather than going to floot.com directly: it shows which account your assistant is connected to before you pay. If you already paid on the other one, see [Your account](https://floot.com/docs/faqs/your-account). ## Sign-in fails with a redirect or callback error Floot accepts a client's sign-in callback only on an `https` URL, on `localhost` or `127.0.0.1`, or from Cursor's desktop app. A desktop client that returns through a different custom URL scheme cannot connect yet — tell support which client it is. ## A project someone shared with me will not open Opening a project owned by another Floot user over the connector needs a paid Floot plan on your own account, for reading as well as writing — unless the project is public, which stays readable by anyone. Projects you own yourself are never affected. > **Use your client's strongest model:** Lighter models lose track of long, multi-tool builds, and the symptoms read like a broken connector — steps skipped, files half-written, the same call repeated. In Claude use Opus or a more capable model; in ChatGPT use GPT-5.5 Sol or a more capable model; elsewhere pick your assistant's most capable model. --- # Prompting tips > How to describe what you want so your AI assistant builds the right thing on the first attempt. Source: https://floot.com/docs/best-practices/prompting-tips You build by talking to your own AI assistant — Claude, ChatGPT, Cursor, or another client with the [Floot connector](https://floot.com/docs/integrations/build-from-claude-and-chatgpt) attached. Your prompt is what it works from, and these habits make the biggest difference to what comes back. ## Start with what the app does For a first prompt, describe the core features and what the app should do for the person using it. Keep it short — you will add detail as you go, and a fuzzy idea is better talked through than written up. There is no stack to choose. Every Floot project is React and TypeScript on the front end, with serverless endpoints and — when the app needs one — a Floot-provisioned Postgres database behind it. Naming a framework only narrows the result: ask for Tailwind, for example, and it will not be installed, because Floot does not support it. > **Naming a package is still fine:** Ask for a specific npm package when you genuinely need one. A few cannot be used — React Native and Expo packages (Floot builds native apps from your web app instead), anything ffmpeg- or ffprobe-based, wasm modules, and most packages that need node-gyp (`sharp` is the supported exception for backend image work). Your assistant is told why, so it can offer another route. ## Include enough context Be specific and descriptive about what you want changed. When something is broken, do not just say “it doesn't work” — describe what you did, what you expected to happen, and what actually happened. ``` When I click the Submit button, a dialog should open, but nothing happens. ``` That works far better than “that button doesn't work”. > **An attached image is not a file in your project:** Attaching a mockup or a logo in a chat client lets the model see it, but the file itself never reaches Floot. If you want that image in the app, your assistant shows you an upload card so you can hand over the actual file in one click. ## Point at the exact element The preview link your assistant gives you opens your project view at `/mcp-preview/`. Use **Select** or **Annotate** above the preview there: Select picks one element, Annotate takes a screenshot you can draw on. Neither one sends a message for you. What you picked is copied to your clipboard, so you can paste it into the chat and add what you want changed. It is also stashed for your assistant, so “check my Floot context” works just as well — it then reads the selected element, your drawing, and the page you were on before it changes anything. ## Keep it focused Ask for **one thing** per prompt. Bundling several changes together means you cannot verify any of them cleanly, and if something goes wrong you have to untangle which change caused it. > **One feature, one fix, one prompt:** Build it, check it in the preview, then move on to the next thing. ## Describe outcomes, not implementations Say what the app should do for the person using it, not how to build it. “Someone should be able to save a recipe and find it again next time they sign in” gives your assistant far more to work with than a list of tables and routes. ## Let it read the project first With the connector attached, your assistant can list and read your files, search your code, read your logs, and read Floot's own build guides before it writes a line. On an existing project, ask it to look before it changes anything — “read the pages this touches first” costs one turn and saves several. For a big change, ask it to talk the change through before it touches the code. If you want the plan to stay in the project, ask it to write the plan into a file under `static/__dev/plans/`. If your project view is open when it does, the plan opens there with a **Build Plan** button: clicking it copies your go-ahead to your clipboard to paste into the chat, and your assistant also picks it up the next time it checks your Floot context. ## Check each change before the next one After each change, click through the flow in the preview yourself. One bug described on its own is far easier to fix than five found at the end, and leaving visual polish until the features work saves redoing it. > **Ask for the preview link first:** Ask for the preview link at the start of the session and keep it open. It live-updates as the app changes, opens with no Floot login, and works on your phone. ## When something breaks, ask for the logs Your assistant can read the project's runtime logs: the preview's backend requests from the last hour, the browser console and network activity from your open project view, and your published app's backend logs from the last 90 days. Ask for them by name — “read the logs before you try another fix” — rather than letting it guess from the error text alone. Browser logs are only captured while your project view is open in a browser, so keep that tab open while you are debugging. > **When the same error survives three attempts:** Stop and change the approach rather than trying a fourth time. Asking for the logs to be read before another fix is attempted clears most loops. Full steps: [Troubleshooting and support](https://floot.com/docs/faqs/troubleshooting-and-support-flow). ## Save a restore point before something risky Ask for a named checkpoint before a big refactor — “checkpoint this first” is enough. Assistants are also told to create one each time they finish a coherent piece of work. Named checkpoints show up in the **Checkpoint** panel in your project view, and you can restore any of them from there. Restoring rolls back code and project settings only. Database rows, uploaded files, and anything already published are not rolled back. When only one or two files went wrong, you do not need a whole-project restore. Ask your assistant to put just those files back — “restore `helpers/pricing.tsx` to how it was two changes ago” — and it steps back through that file's history without touching anything else. --- # What's built in > The services every Floot project comes with — database, auth, AI, storage, email, realtime, and jobs. Source: https://floot.com/docs/integrations/whats-built-in A lot of what you would normally wire up yourself is already part of every Floot project. Ask your AI assistant for the feature and the built-in service gets wired in for you. No accounts, no API keys, no setup. | Service | What it gives you | | --- | --- | | **Floot Database** | A managed Postgres database. Your assistant reads the schema and runs SQL against it directly. You can also browse tables yourself in the **Data** tab of your project on floot.com, and download a `pg_dump` from there any time. | | **Authentication** | Sign-up, login, and sessions out of the box, plus one-click **Sign in with Google** and **Sign in with Microsoft** — Floot brokers both, so there is no OAuth app to register. Other providers, including Apple, GitHub, LinkedIn, and Slack, work too, using your own OAuth credentials. | | **Floot AI** | Text generation with tool calling and web search, image generation and editing, embeddings, and speech-to-text transcription, with no provider account. AI features running inside your published app spend Floot credits, billed to the project owner — or bring your own provider key instead and pay that provider directly. | | **Floot Storage** | File uploads and downloads for your users — documents, photos, contracts — served from Floot's CDN. A free account gets 100 MB across all its projects; paid plans have no cap, and storage past the first 100 MB per project per day is metered as hosting usage. A single file can be at most 100 MB on any plan. | | **Email** | Send email from your app, one at a time or in bulk, and receive email into it, without signing up for a mail provider. Verify your own sending domain before you go live — see the note below and [Email](https://floot.com/docs/integrations/email). | | **Google and Microsoft accounts** | Let your users connect their own Gmail, Google Calendar, and Google Drive — or Outlook mail, calendar, and OneDrive — so your app can read and act on them, with no OAuth app of your own to register. Google Drive access covers the files your app created or the user picked; OneDrive access covers all of the user's files. | | **Floot Realtime** | Live updates over WebSockets — presence, collaborative screens, dashboards that move on their own. | | **Scheduled jobs** | Run backend work on a cron schedule: nightly cleanups, weekly digests, morning reports. Schedules run in your published app while the project owner is on a paid plan; on a free plan they are saved but do not run. | | **Background jobs** | Kick off work that outlives the request. Immediate background tasks and fan-out work on every plan; delayed jobs and schedules your app creates at runtime need the project owner on a paid plan. | | **Push notifications** | Send notifications to your users' phones and browsers. Native push in the iOS and Android apps is set up when you connect an app store — see [Native app features](https://floot.com/docs/mobile-apps/native-features). | | **Analytics** | Built-in visitor tracking: page views, traffic sources, and trends, with no cookies. Opening the analytics dashboard requires a paid plan. See [Visitor analytics](https://floot.com/docs/integrations/analytics). | | **Hosting & CDN** | Globally distributed hosting with automatic SSL and scaling. Running a published app is metered as hosting usage: a free account has a one-time $3 hosting credit from signup and no recurring allowance, while paid plans include a monthly one. See [Reliability and limits](https://floot.com/docs/platform/reliability-and-limits). | > **Verify a sending domain before you go live:** Until your workspace has a verified sending domain, any message your app addresses to someone other than you is delivered to **you** instead — the subject is prefixed with the intended recipient, and a notice is added to the body explaining why. Nothing errors and nothing bounces, so this is easy to miss: you test a signup email on yourself, it arrives, and no customer ever receives one. Add and verify your domain in the **Email** tab of your project on floot.com — open the project from your dashboard, or from the preview link your assistant gave you. Adding an email domain requires a paid plan. > **You don't have to choose these by name:** Describe the outcome — "let users upload a profile photo", "email me when someone books" — and the right service gets reached for. ## Agents and chatbots Your app can have conversational agents of its own: a support bot, an assistant that answers from your data, or a background agent that works on a schedule. Conversation history, tool calling, memory, and streaming responses come with the built-in AI service — describe what the agent should be able to do and it gets wired in. Its usage is billed like any other Floot AI usage: credits from the project owner, unless you connect your own provider key. ## Bringing your own services Built-in does not mean locked in. If you already use Stripe, Twilio, Resend, Mapbox, an external Postgres database, or your own AI provider key, Floot connects to those instead. Browse the full directory on the [integrations page](https://floot.com/integrations). --- # Email > Sending and receiving email from your app: verifying a domain, daily limits, bulk sends, bounces, and what it costs. Source: https://floot.com/docs/integrations/email Every Floot app can send and receive email through Floot's own mail service — no provider account and no API key. Ask your assistant for the feature ("email me when someone books", "let customers write to support@") and it wires it in. This page covers what you set up yourself, and the limits worth knowing. ## Verify a sending domain before you go live Until your project has a verified sending domain, your app's mail goes out from Floot's shared domain, and anything addressed to someone other than you is delivered to **you** instead, with `[target: …]` in front of the subject and a notice in the body explaining why. That is handy while you test and wrong for a live app: nothing errors, so it is easy to miss that no customer ever received a signup email. Bulk sends are refused outright until a domain is verified. 1. **Open the Email tab** Open your project on floot.com, go to **Services → Email**, and click **Add email domain**. Adding a domain requires a paid plan. 2. **Enter the domain to send from** If your main domain already serves your website or has mailboxes, use a subdomain such as `mail.yourdomain.com` — Floot suggests one when it spots a likely conflict. Your app can then send from any address at that domain. 3. **Add the DNS records** **Set up automatically** connects to your DNS provider and adds the records for you; **Set up manually** shows them so you can copy them yourself. Verification usually takes minutes but can take up to 24 hours, and Floot keeps checking while the Email tab is open. ## Receiving email Your app can also receive email at its domain — a support inbox, replies to notifications, mail that turns into tasks. Sending has to be verified first. Then open the domain's **⋮** menu in the Email tab, choose **Set up receiving emails**, and add the one MX record it shows. A subdomain is the safe choice: receiving on your root domain takes over mail for any mailboxes already there, and Floot warns you when it finds some. Your assistant writes the code that handles incoming mail. Mail that the spam or virus scan flags is never handed to it; it shows in the Email tab as **rejected**, with the reason. ## Limits and cost - **1,000 emails a day** — Per project, counted separately for the preview and the published app, per UTC day, on every plan. If a legitimate app needs more, contact support. - **Bulk sending** — For the same email to many people, your assistant uses a bulk send: one template, up to 200 recipients per call, with per-recipient details and unsubscribe headers. It is paced by the mail system, so a long list takes a while. - **Cost** — Email is metered as hosting usage: about $0.30 per 1,000 emails sent and $0.40 per 1,000 received. > **Marketing email needs extra care:** Every Floot app sends through one shared mail system, so an app that draws spam reports or bounces gets its sending stopped. The policy, measured over 30 days: fewer than 4% of your app's emails may bounce and fewer than 0.08% may be reported as spam. We email you when your app crosses either line. Email only people who opted in, include an unsubscribe link and the one-click unsubscribe headers, stop mailing addresses that bounced or complained, and send an imported list a small test batch first. Your assistant knows these rules — ask it to follow them. ## Bounces and delivery status The Email tab keeps a log of what your app sent and received. Your app can also read the status of the email it sent — delivered, bounced, complained, or rejected — for 30 days after each send. That is not a permanent history: if you want a record, such as a per-contact bounce flag, ask your assistant to save it in your app's own database. ### An address that bounced is blocked Because the mail system is shared, an address that hard-bounced is blocked for every Floot app, and sends to it are refused without being attempted. If the address works now — say the mailbox was just created — open that email in the Email tab's log, click **Allow sending to
again**, and send it again. You can do this once per address every 30 days, and five times a day per project. An address blocked because its owner marked your mail as spam needs support. ## Sharing a domain with your other projects A verified domain belongs to one project, but other projects you own can send from it too: open the domain's **⋮** menu and choose **Share with project…**. Their mail goes out under that domain's reputation and appears in the owning project's email log; receiving stays with the owning project. The share stops working if the two projects end up with different owners. ## Using your own provider Floot email is optional. If you already use Resend, SendGrid, Mailgun, Postmark, Amazon SES, or Mailchimp, your app can use that instead — see [Connecting external services](https://floot.com/docs/integrations/overview). --- # Visitor analytics > What Floot's built-in tracker records, where to see it, and how it handles cookie consent. Source: https://floot.com/docs/integrations/analytics Every published Floot app counts its visitors with Floot's built-in tracker. There is nothing to set up, and it sets no cookies. ## What it records For each page view: the path, the referrer, the browser's user agent and language, and a country worked out from the visitor's time zone — never the query string, the part after `#`, or the IP address — plus a random session id that lasts 30 minutes. Your app can record events of its own too; ask your assistant for them. ## Where to see it Open your project on floot.com and go to **Services → Analytics** for page views, traffic sources, countries, devices, and trends. The analytics dashboard requires a paid plan. ## Cookies and consent The tracker never sets a cookie. By default it keeps the session id in the browser's local storage, which EU and UK privacy rules treat like a cookie, so visitors there have to agree before it is stored. There are three modes. Ask your assistant to switch, and the change takes effect on your next publish: | Mode | What it does | Consent banner needed | | --- | --- | --- | | **storage** (default) | Keeps the session id in local storage | Yes, for visitors in the EU and UK | | **memory** | Keeps the session id in memory only, so nothing is stored on the device. A reload counts as a new session | No | | **off** | Sends nothing | No | You can also keep **storage** and add a consent banner: ask your assistant for one that covers Floot analytics. The banner tells the tracker what the visitor chose, nothing is stored until they accept, and their choice is remembered on later visits. Analytics you add yourself, such as Google Analytics, need their own consent handling. ## How long it is kept Raw page-view events are kept for 12 months. The totals built from them are kept after that. --- # Connecting external services > How Floot apps talk to third-party APIs, webhooks, and email providers. Source: https://floot.com/docs/integrations/overview Floot apps can connect to almost any external service over its API. This page covers how that works, and where the edges are. ## API integrations Describe the integration you want to your AI assistant, and the endpoints, database tables, and screens get built for you. Anything reachable over HTTPS from a serverless backend is fair game. **Works best with:** - Well-documented APIs - APIs with clear authentication (API keys, OAuth) - Established APIs that have been around a while **For newer or niche APIs:** if the documentation is public, your assistant can read it — Claude, ChatGPT, and other clients research on their own before calling Floot's tools. If it is not public, paste the relevant pages into the chat so the endpoints and data shapes are known. > **Never paste API keys into the chat:** Your assistant never needs the key itself, and it should never see one. When your app needs a credential, your assistant creates a request and hands you a floot.com link — you type the key into Floot's secure dialog in your browser, not into Claude, ChatGPT, or whichever chat you are building in. There is no in-chat dialog, by design. Your assistant only ever learns the environment variable name; the value is stored server-side, never returned to any client, never included in what the AI can read about an integration, and injected into your backend at runtime. If a key does end up in a chat transcript, treat it as exposed and rotate it with the provider. ### Example ``` Implement the product checkout flow using Stripe. ``` What happens: 1. The API connection is set up 2. You get a link to open in your browser, enter the key in Floot's dialog, and it is stored server-side — or, if your Floot account already holds a matching key from another project, it is connected silently and you are not asked at all 3. The endpoints and screens your app needs get built > **The key request does not block the build:** Your assistant knows the environment variable name as soon as it makes the request, so it can keep building against that name while you fill the key in. ## Webhooks Webhooks let external services push data into your Floot app when something happens — a payment succeeds, a form is submitted, a delivery status changes. 1. **Ask for an endpoint** ``` Create a webhook endpoint that handles payment events. ``` 2. **Publish your app** The webhook URL is a real, public URL on your published app. 3. **Register the URL with the service** Paste it into the external service's webhook settings and send a test event. ## Email Floot apps can send and receive email with no third-party account — see [What's built in](https://floot.com/docs/integrations/whats-built-in). If you would rather use your own provider, Floot integrates with Resend, SendGrid, Mailgun, Postmark, Amazon SES, and Mailchimp: ``` Set up SendGrid to send welcome emails when users sign up. ``` ## Things to know Floot backends are serverless, which shapes a few design decisions: - **No local filesystem or in-memory state** — Anything that has to survive between requests belongs in the database or in Floot Storage — not on disk or in a variable. - **No always-on custom server process** — Long-running or recurring work runs as a scheduled or background job instead of a daemon you keep alive. - **Heavy scraping belongs elsewhere** — For large-scale web scraping, use a dedicated service such as ScrapingBee and have your app call it. > **Background work and realtime are supported:** Long-running and recurring work is covered: scheduled cron jobs, background and queued jobs, and WebSocket realtime are all built in. See [What's built in](https://floot.com/docs/integrations/whats-built-in). If an integration is not behaving, the fastest fix is usually to have your assistant read the backend logs before changing code. --- # Reliability and limits > The infrastructure behind your published app, the limits that apply to it, and what happens when you reach one. Source: https://floot.com/docs/platform/reliability-and-limits Floot is built for production apps. Your site runs on managed AWS infrastructure, with no DevOps work from you. This page covers what every app gets, the limits that apply to it, and what happens when you reach one. ## What's included with every app | Feature | Description | | --- | --- | | **Database** | Managed Postgres for your app's data | | **Backend** | Highly scalable serverless backend on AWS Lambda | | **Authentication** | User sign-up, login, and session management | | **Hosting** | Globally distributed content delivery built on AWS CloudFront | | **File storage** | CDN-backed storage for user uploads and assets | | **Email** | Send and receive email from your app — verify your own sending domain to reach real recipients | | **Realtime** | WebSocket-based live updates and presence | | **Jobs** | Background work on every plan; scheduled cron jobs, timers and recurring jobs on paid plans | | **Custom domains** | Connect your own domain on a paid plan, once the app is live on its `.floot.app` subdomain | | **Security** | HTTPS everywhere, and secrets kept server-side and never shown to the AI — see [Security and data](https://floot.com/docs/platform/security-and-data) | ## Hosting infrastructure - Automatic scaling based on traffic — no capacity planning - Global CDN for fast load times worldwide - SSL certificates (HTTPS) issued and renewed automatically - More backend memory on request — if heavy work such as large files or PDFs runs out of memory, ask your assistant to raise it, anywhere from 512 MB to 4 GB. More memory makes each request cost more hosting ## Uptime and reliability Floot aims for high availability on all published apps. The longest disruption to published apps so far was the [October 2025 AWS event](https://www.thousandeyes.com/blog/aws-outage-analysis-october-20-2025), which took out a large part of the internet rather than Floot alone. There have been a small number of platform incidents since, most of them affecting building and publishing rather than apps that were already live. A single app can still go offline for reasons that have nothing to do with the platform: an unpaid hosting balance takes it down (see below), and a traffic spike can get it throttled. > **Runaway traffic is throttled automatically:** If an app's traffic spikes far past its own baseline — usually an infinite loop or a runaway client-side poller rather than real users — Floot caps that app's backend concurrency automatically. The cap lifts on its own: no sooner than half an hour after it went on, and only once traffic has settled back below it. While a cap is in place your app sheds some requests. We are alerted whenever this happens, but no message goes out to you automatically, so if you think your app is being capped, open the support chat. If you experience downtime or performance issues, reach out via the support chat and we will respond quickly. ## What gets metered while you build Your assistant brings its own model tokens, so building does not spend Floot credits. It spends **build actions** instead. One action is one tool call your assistant makes on a project, and the count is charged to the account whose Floot login authorized the connector — not to the project owner. | Plan | Build actions per day | | --- | --- | | Free | 100 | | Pro — $25/mo | 1,000 | | Power — $100/mo | 5,000 | | Older Floot credit plans | 100 | Failed and cancelled calls never count. Six housekeeping tools are free and never count either: `get_job_status`, `get_publish_status`, `list_projects`, `get_preview_url`, `cancel_request`, and `unpublish_app` — unpublishing is deliberately free so a capped account can always take an app offline. The daily cap is the only limit — there is no weekly cap on any plan. It resets once every 24 hours at a fixed hour set for your account — Plan & usage shows when. On Pro and Power, an Action Boost adds 5,000 actions for the rest of the day and the next — see [Build actions](https://floot.com/docs/integrations/build-actions). If you subscribe to one of Floot's older credit plans, your usage is metered at the free caps. Those plans buy credits, not build actions — switching to Pro or Power is what raises the ceiling. ## What credits are for Credits are a second, separate meter. They do not convert into build actions, and build actions do not convert into them. Paid plans include a monthly credit quota — 5,000 on Pro, 15,000 on Power — and two things spend them: - **Image generation.** Images made with `generate_image` are produced by Floot's own model, so they spend credits in addition to counting as a build action. - **AI features inside your own published app.** Floot's built-in `@floot/ai` package — chat, embeddings, image generation, and transcription running in your app for your users — draws on the same credit balance. Connecting your own OpenAI or Anthropic key instead moves that spend to your provider bill. Both are billed to the project owner's balance, whoever triggered them. See [Billing, credits, and plans](https://floot.com/docs/faqs/billing-credits-and-plans). ## Account limits | Limit | Free | Paid | | --- | --- | --- | | Projects | 5 | Unlimited | | Published apps | Unlimited | Unlimited | | File storage | 100 MB | Unlimited, billed past the daily free allowance | | Single file upload | 100 MB | 100 MB | | Scheduled jobs per project | Saved, but they do not run | 10, every 5 minutes at most | | Delayed and recurring background jobs | Not available | 25 pending timers (1 minute to 7 days out) and 10 recurring per project | | People you can invite to private apps | 5, across all your apps | Up to 500 per project | | Native app builds per month | 2 | 12 on Pro, unlimited on Power | | Emails sent per project per day | 1,000 | 1,000 | | Custom domains | Not available | Included | Scheduled and delayed jobs follow the **project owner's** plan. The project cap is checked at the moment you would exceed it and is never applied retroactively. If you are already over it, you keep everything you have — you just cannot create more projects until you upgrade or delete one. Private files your app serves are handed out as time-limited links: a private download URL can be signed for at most 24 hours. > **Verify a sending domain before you launch:** Until your project has a verified email domain, your app's outbound mail is sent from Floot's shared domain, and any message addressed to someone other than you is redirected to you instead with a notice explaining why. That is useful while testing and wrong for a live app — verify your own domain in your project's Email settings on floot.com before real users sign up. See [Email](https://floot.com/docs/integrations/email). Custom domains need the app to be published to its `.floot.app` subdomain first. Ask your AI assistant to add one and it hands you a link: the DNS setup finishes in a wizard in your browser, not in chat, and the link is good for one hour. See [How to add a custom domain](https://floot.com/docs/custom-domains/how-to-add-custom-domain). ## Hosting allowance | Plan | Monthly hosting allowance | | --- | --- | | Free | None recurring — a one-time $3 credit at signup is all a free account has | | Pro — $25/mo | $10 of hosting per month | | Power — $100/mo | $25 of hosting per month | | Older Floot credit plans | $10 of hosting per month, whatever the credit tier | Usage past your allowance is billed pay-as-you-go. The baseline is about twice the underlying infrastructure cost; a few units carry more margin than that — realtime connections most of all — so read the hosting dashboard rather than multiplying an AWS price list. Every project also gets the first 100 MB per day of file storage and the first 50 MB per day of database storage at no charge before metering starts — see [Hosting](https://floot.com/docs/faqs/hosting). ### When your hosting allowance runs out If your hosting balance goes negative and stays there, Floot takes the app offline. How much warning you get depends on your plan: - **Active paid subscription, not cancelling** — a 3-day grace window, with warning emails during it - **Free accounts** — no grace period - **Cancelled or pending-cancellation subscriptions** — no grace period - **Cards that have been failing for more than 14 days** — no grace period; inside those 14 days you get the same 3-day window, so there is time to fix the card A takedown removes infrastructure rather than flipping a switch: custom domains are detached, the `.floot.app` subdomain is released, and the database is disabled. Your code and your data are kept, so bringing the app back is a re-publish once the balance is positive again, not a toggle. While the hosting is taken down, the database can't be opened, queried or downloaded, through the **Data** tab, your assistant, or **Download Database**. Support can't make a copy either, except where the law requires one. Paying the balance restores access. ## Monitoring your usage Track build actions and credits on the [plan and usage dashboard](https://floot.com/dashboard/plan-usage), and traffic on the [hosting dashboard](https://floot.com/dashboard/hosting). Plan changes are browser pages on floot.com — no tool can move you between plans. You can also just ask while you build. Your assistant can read your hosting and Lambda numbers through the connector and suggest ways to bring them down. --- # Security and data > How Floot handles your code, your data, and your users' data — including what your own AI assistant can see. Source: https://floot.com/docs/platform/security-and-data This page covers data ownership, the security measures behind the platform, who can see what, and — because your app is built by an AI assistant you bring yourself — what leaves Floot while you build. ## Data ownership **You own 100% of your app:** - **Code** — Complete code ownership. - **Data** — All app data belongs to you. - **IP** — Full intellectual property rights. You can download a full SQL dump of your database at any time on any plan, unless your hosting is taken down for an unpaid balance: open your project on floot.com, go to the **Services** tab → **Data**, open a table, then use the **cog icon** in the table header → **Database Settings → Export → Download Database**. Code download is included on every paid plan, from the project-name dropdown in your project's top bar → **Get Code**. Both are browser actions. Your assistant can read any file in the project and query the database for you through the connector, but the downloadable archive is built in your browser. Follow the preview link your assistant gives you, or find the project on floot.com, then use the menus above. See [Code, data, and exports](https://floot.com/docs/faqs/code-data-and-exports), or [Self-hosting](https://floot.com/docs/projects/self-hosting) if you want to run the app yourself. ## Security measures - **Encrypted in transit** — All traffic is served over HTTPS/TLS. - **Encrypted at rest** — Your database, your project source, and your files are stored on managed AWS and Neon infrastructure with provider-level disk encryption. - **Secret handling** — API keys and secrets are never typed into chat. Floot collects them through a dedicated form: your assistant hands you a one-time link, and you paste the key into a Floot page in your own browser. They are stored server-side, injected into your backend at runtime, and never returned to any client. At rest they carry the same provider-level disk encryption as the rest of the database; Floot does not add a second, application-level encryption layer on top of it. - **Secrets are not visible to the AI** — This is enforced by the shape of the data, not by instructions to the model: the integration list an assistant can see carries only a connection's name, type, description, and non-secret config values. The secret values are not part of that payload. - **Account protection** — Optional two-factor authentication with an authenticator app and single-use recovery codes, and one click to sign out every other device and connected assistant — see [Your account](https://floot.com/docs/faqs/your-account). - **Internal access** — Support access to a private project is limited to Floot staff, and is used to investigate an issue you have raised. ## Who builds your app, and what it can see The model writing your code is not Floot's. It is the assistant you connected — Claude, ChatGPT, Cursor, Codex or another MCP client — running under your own agreement with that provider. Floot's connector supplies the tools; the conversation, your prompts, and everything those tools return sit in that provider's context and are governed by their terms, not by Floot's. If you are reviewing Floot for procurement, this is the material point: your builder is a third party you chose and contract with directly. What an assistant can read through the connector: your project's files, rows from your app's database (`query_database`, `execute_sql`, `pull_database_schema`), your app's backend logs (`get_logs` for the preview, and your published app's logs through `run_code_in_vm`), and screenshots of the running preview. If your database holds real user data, that data reaches your assistant's context whenever you ask a question that requires it. What it cannot do: read your integration secrets, or spend your money. Plan changes and every purchase are browser pages a person clicks, deliberately never tools an agent can call. Your conversation is not stored on the project. What Floot keeps is two things: the files your assistant writes, and a running activity record of what it did — which files changed, which SQL ran, which images were generated — that the project's history and the Checkpoint panel are built from, and that stays for as long as the project does. Separately, a raw audit row per tool call — tool name, a capped summary of the arguments, the result — is kept for about three days and then deleted. The same capped argument summary also appears in the connector's server logs, which are kept for a month, and a usage record of each call — tool name, outcome, timing, and project, without the arguments or the result — is kept as usage history. The chat around those calls never reaches Floot; it stays with your AI provider. ## How long Floot keeps things | What | How long | | --- | --- | | Your code, data, and the project's activity record | For as long as the project exists | | Audit rows for your assistant's tool calls | About 3 days | | Connector server logs (tool name and capped arguments) | 1 month | | Usage records of tool calls (no arguments or results) | No set expiry | | Your published app's backend logs | 90 days | | Preview backend logs your assistant can read | The last hour | | Annotations you draw on the preview | About 1 day | | Preview links | Valid for 7 days | | Delivery status of email your app sent | 30 days after each send | | Visitor analytics page views | 12 months | | Database export download links | 24 hours | | Native app build downloads | Until the next app build finishes; download links last 7 days | ## Privacy and visibility ### Your projects | Setting | Who can see it | | --- | --- | | **Private** (default) | You, your collaborators, and Floot staff investigating an issue you raised | | **Anyone with a preview link** | Can view the project and use the running app, with no login — see below | | **Public** | Anyone — and other Floot users can duplicate it, as long as you and they are both on a paid plan | Preview links deserve their own line, because your AI assistant hands them out routinely. Every preview URL carries a token in its query string (`?ptoken=…`). That token is a view-scoped grant for exactly one project: it can read the project and interact with the running app, and it cannot write files, publish, or touch your account. It expires seven days after it was issued, and it cannot be revoked before then. The no-login part is deliberate. These links are usually opened on a phone, inside a chat app's in-app browser, which carries no Floot cookies — a sign-in wall there would be a dead end. The trade-off is that anyone the link is forwarded to can open it until it expires, so treat a preview link the way you would treat a shared document link. Opening one while signed in as the owner still gives you your normal rights; the token never downgrades you. Someone signed in to a different Floot account with no access to the project is sent to the Floot home page instead, and gets in from a private browser window. For a private project: - Your code and prompts are not visible to other Floot users - No one else can duplicate it - Access is limited to you, your collaborators, anyone holding a live preview link, and Floot staff as needed for support Opening a project that someone else owns and shared with you requires a paid plan on your own account — the connector runs on your assistant's tokens, so the seat is what the plan pays for. Reading a public project is never gated; writing to a project you do not own is. > **Project visibility is not app visibility:** Making a project public exposes its source, its project prompt, and the activity record of what your assistant did to it. It does not expose the conversation you had with your assistant — that stays with your AI provider, not on the project. Making a project public or private also does not change who can open your published app: that is decided when you publish — publicly, or privately for people you invite (see [Publish privately](https://floot.com/docs/projects/internal-publish)) — and by any sign-in your app requires. ### Your app's user data Data your app collects — accounts, form submissions, uploads — is: - Stored in your app's own Postgres database and file storage, on managed infrastructure with provider-level disk encryption - Readable by the AI assistant you build with whenever a prompt requires it, which means it reaches that provider's context - Your responsibility to handle in line with applicable law ## Handling sensitive data If your app handles healthcare, financial, or otherwise regulated data: 1. Consult legal counsel about your compliance requirements 2. Decide whether your assistant may query that data at all — a query you ask for sends real rows to your AI provider 3. Contact Floot to discuss your specific needs before you launch --- # Sharing your projects > Preview links, collaborators, development previews, private apps, handing a project to another account, and making a project public. Source: https://floot.com/docs/projects/sharing-your-projects There are six ways to share a Floot project: pass on the preview link your AI assistant gave you, add collaborators, send a development preview, publish the app privately for people you invite, send the whole project to another account, or make the project public. > **Most sharing controls live on floot.com:** Your AI assistant can hand out a preview link, but it has no tool for adding collaborators, inviting people to a private app, sending a project, or changing visibility. For those, open the project on floot.com. Private publishing is on the **Publish** screen; everything else is in the **project name dropdown in the top-left**, next to the Floot logo. > **Three of these need a paid plan:** Adding collaborators, sending a development preview, and sending a project all require a paid plan, and the last two are shown only to the project owner. Sharing a preview link, publishing privately for up to 5 people, and making a project public work on any plan. ## Share the preview link your AI gave you Every preview link the Floot connector returns already carries a view-only token in its query string. This is the normal way to show work in progress to someone who does not need an account. - It opens with no login, so it works in a phone browser or an in-app webview - It is scoped to one project, and expires after 7 days - The holder can look at the project and interact with the running app, but cannot change files or touch your account - It cannot be revoked before it expires, so share it only with people you would show the project to - Share it exactly as your assistant returned it — stripping the token turns the link into a sign-in prompt - Lost it, or the 7 days ran out? Ask your assistant for the preview link again and it mints a fresh one > **You are not downgraded by your own link:** Opening a tokenized preview link while signed in as the owner still gives you full edit and publish rights — the page prefers a real session when it finds one. That also means someone signed in to a different Floot account, with no access to the project, is sent to the Floot home page instead; a private browser window gets them in. ## Add collaborators Give other people edit access to your project while you keep ownership. Collaborators can always edit — there is no view-only level; to let someone use the app without touching the project, [publish it privately](https://floot.com/docs/projects/internal-publish) and invite them instead. This needs a paid plan, and only the project owner can add or remove people. There is no MCP tool for it — collaborators are managed on floot.com. 1. **Open the project menu** Click the **project name dropdown** in the top-left, next to the Floot logo, then **Collaborators**. 2. **Enter their email** They must already have a Floot account — Floot will not invite someone who has not signed up, and returns an error asking you to have them sign up first. 3. **They're in** Access is granted right away, and Floot emails them at that address. The subject line reads " added you to on Floot", and the message has an **Open Project** button. That link opens the project on floot.com under their own account. ### What to know A collaborator who wants to work on the project from their own MCP client needs their own paid Floot plan — opening a shared project over MCP is refused otherwise — and their **build actions** come out of their own daily allowance, not yours. Image generation is the exception: it always spends the project owner's credits. - You can remove a collaborator at any time in the same dialog, which revokes their access immediately. - Changes made by your assistants show up live for everyone who has the project open — no refresh needed. There is no edit lock, so agree on who is working on what. - A collaborator who opens the dialog sees "Only project owners can manage collaborators" — they can edit the project but not change who else has access. - Collaborators get full access to the project's data and integrations, so only invite people you trust with them. ## Send a development preview Show a client or a tester what you are building without giving them the project. Open the **project name dropdown** in the top-left, then **Send Development Preview**. This needs a paid plan and is shown only to the project owner. - Up to 20 recipients at a time, and 50 in any 24 hours - Each recipient gets their own link by email - To open it, they must enter their own email address to verify who they are - Links expire after 7 days - If an email fails to deliver, you can copy that person's link and send it yourself — they still have to verify their address ## Publish the app privately To let specific people use the published app — a team tool, a client preview, a beta — without making it public or giving them the project, publish it internally. Open **Publish**, choose the **Internal publish** tab, add people by email, and click **Publish internally**. They get an invite, sign in with a Floot account on the address you invited, and can use the app but not open the project. Free accounts can invite 5 people across all their apps. See [Publish privately](https://floot.com/docs/projects/internal-publish). ## Send project to another account Copy a project to a different Floot account. This needs a paid plan and is shown only to the project owner. You can send at most 5 projects in 30 minutes and 10 a day. ### When to use it - Handing a finished project off to a client - Moving a project to a team or company account - Consolidating projects under one account ### How it works 1. **Open Send project** Click the **project name dropdown** in the top-left, then **Send project**. 2. **Enter the destination email** The recipient does not need a Floot account until they accept. Optionally add a message, or charge them credits for the project — the smallest charge Floot accepts is **6,000 credits**. 3. **They accept or decline** Floot emails a link. If they accept, they receive a full copy — code, database, and integrations — but **not** your API keys, which they will set up themselves. 4. **What can block an accept** The recipient needs a free project slot — free accounts are capped at 5 projects — and, if you set a credit charge, enough credits to cover it. If either check fails the accept is refused and the invitation stays pending, so this is worth checking before you go looking for a bug. 5. **Credits change hands** If you set a credit charge, the recipient pays it and you receive that amount minus a 5,000-credit fee — so at the 6,000-credit minimum, 1,000 credits reach you. > **You keep your copy:** Sending a project copies it. Your original project stays in your account, untouched. ## Make a project public Let others view your project's source code and its activity record — the running log of the work done in the project, including everything your assistant did — and use it as a starting point for their own. Making a project public is free on any plan. 1. **Open Project Settings** Click the **project name dropdown** in the top-left, then **Project Settings**. 2. **Turn on Make project public** Under **Project Visibility**, turn on the **Make project public** switch. There is no list of visibility values to pick from — it is one toggle, and you can turn it back off at any time. ### What happens - Others can view your source code and that activity record, but they cannot edit your project - Other Floot users can duplicate it as a starting point — duplicating someone else's project requires a paid plan on both sides, so this only works while you are on a paid plan too - Your published app URL is unchanged — this affects the project, not the live app - You keep full ownership and can go private again whenever you want ### When to use it - Sharing a template or example with the community - Open-source work you want others to learn from - Showcasing a build in your portfolio ## Which option should I choose? | Scenario | Recommended option | | --- | --- | | Showing someone what you just built, right now | Share the preview link your AI gave you | | Working together on a project | Add collaborators | | Client needs to watch progress | Add collaborators | | Client or tester should look but not own or edit | Send a development preview | | Your team, a client, or beta testers should use the live app, and nobody else | Publish privately | | Handing a finished project to a client | Send project | | Moving a project to another account you own | Send project | | Sharing a template with the community | Make public | | Open-source or portfolio project | Make public | > **Private by default:** All projects — including free ones — are private until you change the setting. See [Security and data](https://floot.com/docs/platform/security-and-data). --- # Publish privately > Publish your app so only the people you invite can open it — for internal tools, client previews, and betas. Source: https://floot.com/docs/projects/internal-publish An internally published app is live at its usual address, but only the people you choose can open it. Everyone else is asked to sign in, and turned away if they are not on your list. ## Who can open it - **You and your collaborators** — Anyone with edit access to the project can open the app. - **Invited users** — People you add by email. They can use the app but cannot open the project. Each one signs in with a Floot account on the address you invited, creating one if they do not have it yet. It suits internal tools such as dashboards and admin panels, client previews before launch, and beta tests with a small group. Search engines are told not to index the app. > **A sign-in in front of your app, not instead of it:** The Floot sign-in decides who can reach the app at all. If your app has accounts of its own, people still sign in to the app as usual once they are through. ## Publish internally 1. **Open the Internal publish tab** Open your project on floot.com, click **Publish**, and choose the **Internal publish** tab next to **Web**. 2. **Add the people you want** Under **Invited users**, add their email addresses. You can include a personal note and choose whether to email them now. Floot writes the rest of the invite: a link to the app and how to sign in with the invited address. 3. **Click Publish internally** If the app is public right now, Floot asks you to confirm before making it private. Anyone still waiting for an invite gets it when the publish finishes. > **Your assistant keeps it private:** Your assistant can publish updates to a private app, and it stays private. Only you can switch an app between public and private, on the Publish screen. ## Private mobile apps Internal publish covers the iOS and Android app too. On the **Internal publish** tab, turn on **Publish mobile app** before you click **Publish internally**, and Floot builds the app along with the private website. Only the same people can use it. - **It opens on a Sign in with Floot screen.** On iPhone it uses Safari's sign-in: anyone already signed in to Floot in Safari taps **Continue** and is in. On Android it uses the phone's browser the same way. - **People stay signed in.** They sign in again only after 30 days without opening the app, and at the latest 90 days after they first signed in. - **Removing someone signs them out of the app too**, within about an hour. So does **Sign out everywhere** on their Floot account page. - **Share it through TestFlight and Google Play internal testing.** A public App Store or Google Play listing does not fit an app only invited people can use. Private mobile builds count toward your monthly app builds like any other build, and need the same store connections — see [Creating mobile apps](https://floot.com/docs/mobile-apps/creating-mobile-apps-in-floot). ## Keep it private for good To make sure the app is never published publicly by mistake, open **Project Settings**, expand **Advanced Settings**, and turn on **Private only**. You confirm by typing a short phrase, and the same goes for turning it off. The Web tab on the Publish screen is then unavailable, every publish (yours or your assistant's) stays private, and the project's preview links open only for people signed in to Floot who have access to the project. That is what lets an app use the Floot sign-in as its only login. Only the project owner can turn it on or off, and an app that is live in public has to be published internally first. Copies of the project stay private only. ## Webhooks and other services Services that call your app from their own servers, such as a Telegram bot's webhook, a calendar feed or a script with an API key, cannot sign in to Floot. Ask your assistant to make those endpoints reachable without the Floot sign-in. It marks each one in its code, and each one must check who is calling, for example with the webhook's secret or an API key. Everything else stays private. For the same reason, other services cannot open your app's stored files by their usual address. To send a file to one, such as an image for a Telegram message or an AI model, your assistant gives it a temporary signed link instead. ## Limits - Free accounts can invite 5 people in total, across all their apps. Someone already invited to another of your apps does not count twice, and collaborators never count. - Paid plans have no account-wide limit; each project takes up to 500 invited people, added 50 at a time. - Removing someone cuts off their access to the app's backend and data within about an hour. ## Making it public again Open **Publish**, stay on the **Web** tab, and click **Publish update**. Floot asks you to confirm, then republishes the app with your latest changes for anyone with the link. Switching between public and private, in either direction, leaves the site unreachable for a short while. Custom domains work the same on a private app as on a public one. Private publishing covers the published app. The preview link your assistant hands you works the way it always does — see [Sharing your projects](https://floot.com/docs/projects/sharing-your-projects). --- # Connected apps > Let one of your Floot apps use another's features and data — no API keys, no glue code. Source: https://floot.com/docs/projects/connected-apps Connected apps let one of your Floot apps use another's features and data directly. There are no API keys to manage and no code to write: you ask your assistant, approve the connection, and the apps work together. ## What to build with it - **An admin app that runs your public site:** add products, update orders and manage customers from a private back office. - **Several sites for one business:** separate sites for each brand or service, all sharing the same bookings, leads and calendar. - **One dashboard for everything:** a dashboard or AI assistant that pulls live numbers from every app you run. ## Connect two apps 1. **Ask your assistant** Open the app that needs the data and say what you want, for example "show orders from my shop app" or "let this admin app add products to my shop". Your assistant works out which features of the other app it needs. 2. **Approve the connection** Floot shows you the two apps and exactly which features will be shared. Nothing connects until you click **Connect**. 3. **Publish both apps** Publish the app being used first, then the app that uses it. An app only shares what it had at its last publish, so publish it again whenever your assistant adds a new feature to it. Your connections are listed in the **Apps** tab of the right pane, under **Apps this app uses** and **Apps that use this app**. ## Who can connect - **Only your own apps.** Both apps must be on your account, and you (or a collaborator who can edit both) approve every connection. - **Only what you choose.** An app shares only the features you approved, never its whole database. - **Your preview uses the live app.** While you build, the preview of the connected app talks to the published version of the other app. > **Private apps:** A [privately published](https://floot.com/docs/projects/internal-publish) app can be used by a public one. Floot warns you before you connect them: whatever the public app shows from the private one can be seen by anyone using the public app. ## Disconnecting In the **Apps** tab, click **Disconnect** (on the app that uses the other) or **Remove access** (on the app being used). It takes effect right away. Deleting a project disconnects it from every app. ## Cost Connecting apps is free on every plan. When one app uses another, the work runs on the other app and counts toward its hosting, like any other request it handles. --- # How to add a custom domain > Point your own domain at your Floot app, step by step, including the DNS gotchas. Source: https://floot.com/docs/custom-domains/how-to-add-custom-domain Connect a domain like `yourapp.com` to your Floot app so it is served from your own address instead of its `*.floot.app` subdomain. > **Your assistant cannot do this one for you:** Adding a custom domain is a handoff. Ask your assistant to add one and it opens a request and hands you a link, but it cannot finish the job — the DNS approval has to happen in your browser, signed in to your DNS provider. Opening the link brings you to the wizard described below. Only one request can be pending per project, and it expires after an hour, so ask again for a fresh one if you leave it too long. The steps below all happen in the Floot web app. Open your project on floot.com and start from the **Publish** button in the top-right. > **Before you start:** Your app must already be published to its free `*.floot.app` subdomain — a custom domain attaches to the live deployment, and on a project that has never been published Floot asks you to publish first. The project owner must also be on a paid plan: the check is against the **owner's** account, not yours, so a paid collaborator cannot add a domain to a free owner's project. 1. **Open Add Custom Domain** 1. Click the **Publish** button in the top-right of the project view 2. Click **Add Custom Domain** 2. **Choose where the domain comes from** The first screen offers two cards — there is no domain field until you pick one. - **I already have a domain** — points a domain you own at Floot. Choose it, type the domain (for example, `yourapp.com`), then click **Continue**. - **Buy a domain** — buys one through Floot. On a paid plan that has not used it yet, this card reads **Get a free domain**: a paid plan includes one free domain, claimable once per account. Floot connects a purchased domain for you. 3. **Approve the DNS records** Floot opens an automatic setup window that connects to your DNS provider. It is run by Floot's DNS partner, Entri, so the window is branded differently from the rest of Floot — that is expected. Sign in to your provider there and approve the records; Floot writes them for you. **What you will see while it runs:** - "Connecting to your DNS provider…" while the window is opening - "DNS records configured successfully. Verifying…" once the records are in - A **Start Setup** button if you closed the setup window before finishing — click it to reopen - A **Try again** button if the automatic setup failed > **Adding the records yourself:** If you would rather not sign in to your DNS provider through the setup window, or automatic setup fails, click **Add the DNS records myself instead**. The wizard shows the records to add at your DNS provider — it opens this table on its own when automatic setup fails. Add them, then click **I've added them — check again**; Floot also keeps checking on its own. 4. **Wait for verification** There is no **Continue** button on this step, and that is deliberate — Floot verifies the records on its own and moves you to the confirmation screen when they check out. Verification can take up to 15 minutes. Leave the wizard open while it runs: closing it discards the setup in progress, and if your AI assistant started the request, closing it cancels that request too. 5. **Your domain is live** - Your app is served from your custom domain - If you connected an apex domain, both `yourapp.com` and `www.yourapp.com` work — Floot adds the pair for you - Any other subdomain (for example `app.yourapp.com`) is connected on its own. Add the apex separately if you want it as well - HTTPS is set up automatically > **DNS propagation takes time:** It can take up to 24 hours for your domain to resolve everywhere, though it is usually much faster. That is normal and depends on your DNS provider. If it takes longer, contact support. ## If verification does not finish - **A certificate error.** Delete every `CAA` record on the domain — they can stop Floot's certificate authority from issuing a certificate, and the wizard names this case explicitly. - **"Blocked by another domain on this project."** An older domain already on this project is missing its verification record, so the shared certificate cannot be reissued. Add the record the wizard shows to that older domain's DNS, set it to **DNS only** if you use Cloudflare, then try again. - **Cloudflare in front of the records.** Turn the proxy **off** (grey cloud, not orange) for Floot's records. - **A domain already in use.** Floot refuses a domain that is already connected to another project, and refuses a small set of restricted names. - **The domain is suspended or expired at its registrar.** The wizard says so when the registry reports it, and no DNS change will help. IONOS, which provides the free domain, suspends a new domain if its contact email is not verified within 15 days of purchase: find IONOS's verification email, click its link, then check again. For an expired domain, renew it with the registrar. > **Custom domains need a paid plan — and stop working without one:** The free `*.floot.app` subdomain works on any plan; connecting your own domain requires a paid plan on the **project owner's** account. If that subscription is cancelled, goes unpaid, or lapses, a daily job removes the project's connected custom domains once it has been in that state for more than 3 days — every domain connected to the project, not just ones bought through Floot. The app stays live on its `*.floot.app` subdomain, and re-connecting means running this wizard again. --- # Self-hosting > Export your code and database and run your Floot app on your own infrastructure. Source: https://floot.com/docs/projects/self-hosting You own your Floot app's code and data. If you want to host it yourself, you can export the code and the database and deploy them wherever you like. > **Code download is checked against your own plan:** Choosing **Get Code** on a free account opens the upgrade dialog instead of the zip. The check is against the account you are signed in as, not the project owner's — so on a project someone shared with you, you need a paid plan of your own even when the owner has one. > **Exporting happens in your browser:** The zip is built in the browser, so there is no export tool over MCP — you cannot ask your AI assistant to produce it. Open the project on floot.com and use the **project name dropdown** in the top-left. From an MCP client the closest equivalents are `read_files` for source and `pull_database_schema` / `query_database` for the database. ## When to self-host - You need to meet specific compliance or data residency requirements - You want full control over your infrastructure - You are migrating away from Floot - You need to run the app in an air-gapped environment ## What you can export | Asset | How to export | | --- | --- | | **Code** | Project name dropdown → **Get Code** (paid plan required) | | **Database** | **Services** tab → Data → Floot database → cog icon → **Export → Download Database** (`pg_dump`, any plan, not while hosting is taken down) | > **Planning to leave?:** Download your database while your hosting balance is still positive. Once hosting is taken down for an unpaid balance, the database can't be downloaded until the balance is paid. That is the whole export. The code zip is your source, not a complete copy of the running app, so plan for four things that do not travel with it: - **Your API keys.** `env.json` lists the variables your app expects but leaves each secret as `... fill this up ...` — you supply the values. - **Images and files in Floot's storage.** Anything from `generate_image` or `upload_asset` lives in the project's hosted storage and is served from the app's own domain, so the exported code still points at URLs you no longer host. Re-upload those files to your own storage and update the paths. - **The built-in `@floot/*` services.** See the table below — these are a hard build break, not a missing extra. - **Example documents.** The `.example.tsx` and `.__example.tsx` files (and their stylesheets) that sit beside components and pages are development-only and are skipped by the zip. Nothing that ships depends on them. ## How to self-host 1. **Export your code** Open your project on floot.com, click the **project name dropdown**, choose **Get Code**, and download the zip. The zip is built in your browser, so give it a moment on a large project. 2. **Export your database** Open the **Services** tab, click **Data**, select **Floot database** and open a table, then click the **cog icon** in the table header and choose **Export → Download Database** to get the `pg_dump` file. 3. **Set up your own database** Restore the `pg_dump` into a PostgreSQL database you control, then note its connection string. Managed options like Supabase, Neon, AWS RDS, or Railway all work. 4. **Configure environment variables** The exported code includes an `env.json` file. For security it is not pre-populated — you supply the values. **JWT secrets** — generate one with: ```bash node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" ``` **Database connection** — fill in your own PostgreSQL connection string. Floot's database is not reachable from self-hosted environments. **External services** — paste in the API keys for any third-party services your app uses. 5. **Build and run** The export is a Node.js application: ```bash npm install -g pnpm pnpm install pnpm vite build pnpm tsx server.ts ``` Adjust freely to fit your own framework or deployment target. ## Floot-managed services Some built-in services are injected by Floot's build and are **not included in the export**. Any `@floot/*` import left in your code will fail to resolve, so the exported project does not build until you replace them — this is a hard build break, not a degraded feature. Migrate off these **before** you export: ask your AI assistant to do it while the project is still on Floot, then export. | Service | What to do instead | | --- | --- | | **Floot OAuth** | Configure your own auth provider | | **Floot Storage** | Migrate to an object storage provider like Cloudflare R2, S3, or Cloudinary | | **Floot AI** | Use your own API key with the AI provider of your choice | | **Floot Realtime** | Use a pub/sub service (Pusher, Ably, Redis pub/sub) or drop the feature | | **Floot Email** | Point the app at your own provider — Resend, SendGrid, Postmark, SES | | **Scheduled & background jobs** | Run them with your platform's scheduler (cron, EventBridge, a queue worker) | | **Floot Push** | Generate your own VAPID keypair and send notifications with a web-push library — Floot mints the keypair for you and it does not travel with the export | | **Floot runCode** | Run the code in your own sandbox or worker process | | **Google and Microsoft integrations** | Register your own OAuth app with each provider and manage the tokens yourself | | **Microsoft login** | Configure your own Entra ID app registration | ## Things to consider - **API keys** — You will need to set up your own keys for every third-party service. - **Updates** — Self-hosted apps do not receive updates from Floot. Maintaining the code is on you. - **Support** — Floot support covers the Floot platform, not self-hosted deployments. --- # Creating mobile apps from your website > Turn a Floot web app into real iOS and Android apps — installable on a phone, and submittable to the App Store and Google Play. Source: https://floot.com/docs/mobile-apps/creating-mobile-apps-in-floot Floot converts your project into native iOS and Android apps — the same app you built, wrapped so it can be installed from a device, submitted to the App Store, or published on Google Play. > **Your first app build happens in a browser:** Open your project on floot.com, click **Publish**, switch on **Publish mobile app** and publish. The project link your assistant hands you opens the project view at `/mcp-preview/`, and the **Publish** button there is the same screen. Your assistant can start an app build itself only once an Apple or Google Play account is connected to the project. Until then, asking it for a mobile build gets you a card that sends you to floot.com to connect one. The APK and the project zip are downloaded on floot.com either way. Once the app has been built, your assistant can edit the native iOS and Android config files for you. Ask it for the `ios-info-plist` or `android-manifest` guide. > **Every plan includes app builds:** Native app builds are metered per month: **2** on Free, **12** on Pro, unlimited on **Power** (legacy credit plans of 100k and above are unlimited too). See [pricing](https://floot.com/pricing). A build that fails does not count, and neither does one that every connected store turned away. Connecting Google Play needs a paid plan; Apple works on every plan. If you run out, publishing still succeeds — the web app ships as normal and only the app build is skipped, and the publish tells you so. ## How it works 1. **Build your app as usual** Everything you build for the web comes along. Floot adds the native permissions your app needs on its own: camera and photo access on iOS, location and microphone when your code uses them, and notifications when you use Floot's push. The default permission wording is generic and Apple rejects it, so before you submit, ask your assistant to write wording that says why your app needs each one — see [Native app features](https://floot.com/docs/mobile-apps/native-features). 2. **Publish with the mobile app switched on** Open your project on floot.com and click **Publish**. Switch on **Publish mobile app**, then publish: **Continue** the first time, when you also pick your subdomain, or **Publish update** once the app is live. An app build normally rides along with a publish, which also puts your latest changes on the web. To build only the app and leave the website alone, make a [test build](https://floot.com/docs/mobile-apps/creating-mobile-apps-in-floot#test-builds) instead. The switch shows how many app builds you have left this month. The build takes several minutes and appears under **Last build** when it finishes. On Free and Pro, every app build is opt-in: a publish with the switch off updates only the website, so switch it on each time you want a new app. On Power, once an app store is connected, the switch stays the way you last left it, so every publish rebuilds the app until you turn it off. 3. **Install or submit** Every build gives you an Android APK, which installs straight from a download link or QR code, and a project zip. Connect your Apple or Google Play account under **App stores**, and Floot uploads each build to TestFlight or Play internal testing for you — see [Publish to TestFlight and Google Play](https://floot.com/docs/mobile-apps/publishing-to-app-stores). You only need the developer accounts. You can also use the project zip to build in Xcode and Android Studio on your own machine instead. ## Test builds A test build lets you try your app on a real phone before your changes go live. It builds only the iOS and Android apps. Your website is not published or changed, and you can make one before the app has ever been published, with no subdomain. - **It runs on your preview.** The app talks to your project's preview server and preview data, not the published app, so it has your latest changes even if you have not published them. - **It works for 4 hours.** The clock starts when you click publish. After that the app shows a message asking you to build again. - **It goes everywhere a normal build goes.** You get the Android APK and the project zip, and connected stores get it on TestFlight and Play internal testing. - **It counts as an app build.** It uses one of your monthly app builds, like a live build. 1. **Switch on the mobile app** Open your project on floot.com, click **Publish**, and switch on **Publish mobile app**. 2. **Choose Test** Click **Advanced** next to the switch, choose **Test**, and confirm. The choice applies to this one build only. The next publish goes back to **Live** by itself. 3. **Build** Click the publish button. The build appears under **Last build** like any other, marked as a test build. > **Never submit a test build for review:** A test build stops working 4 hours after you make it, so a store reviewer would find a broken app. Your testers also receive it like any other build, so tell them it is temporary. When you are ready to release, publish again with **Live** selected and submit that build. > **Start test builds from the Publish screen:** Your assistant cannot start a test build. When it publishes with a mobile build, the build is always live. ## Private apps To give the app only to people you invite, such as your team or a client, publish it from the **Internal publish** tab with **Publish mobile app** on. The app asks people to sign in with Floot and opens only for the people on your list. See [Private mobile apps](https://floot.com/docs/projects/internal-publish#private-mobile-apps). ## Platform guides - [Publish to TestFlight and Google Play](https://floot.com/docs/mobile-apps/publishing-to-app-stores): Connect your Apple or Google Play account once, and every app build goes to the store's testing track for you. - [Native app features](https://floot.com/docs/mobile-apps/native-features): Push, permissions, the share sheet, background work, the status bar, and iPhone-only builds — what to ask your assistant for. - [Installing your iOS app](https://floot.com/docs/mobile-apps/installing-ios-app): Connect your Apple developer account and Floot builds and submits to TestFlight for you — or download the project and build it in Xcode yourself. - [Installing your Android app](https://floot.com/docs/mobile-apps/installing-android-app): Install the APK from a link or QR code, or build a signed release for Google Play. - [Add to the home screen](https://floot.com/docs/mobile-apps/add-project-to-home-screen): No app store needed — put your published project on a phone's home screen in three taps. > **The developer accounts are yours:** Floot builds and submits to TestFlight and Google Play, but the accounts it submits through are yours: you need your own Apple Developer and Google Play accounts, and store review and any publishing support come from Apple and Google. --- # Publish to TestFlight and Google Play > Connect your Apple or Google Play account once, and Floot uploads every app build to the store's testing track. Source: https://floot.com/docs/mobile-apps/publishing-to-app-stores Connect a store account to your project and Floot handles the store side of every app build: it signs the build, uploads it, and puts it in front of your testers — TestFlight on iOS, internal testing on Google Play. You need no Mac, no Xcode, and no Android Studio, only the developer accounts. | Store | What you need | Where builds go | | --- | --- | --- | | **Apple App Store** | An Apple Developer Program membership ($99 a year, paid to Apple). Works on every Floot plan. | TestFlight, in an internal testing group called Floot Internal | | **Google Play** | A Google Play developer account ($25 once, paid to Google) and a paid Floot plan. | Play Console internal testing | Start on the Publish screen: open your project on floot.com, click **Publish**, switch on **Publish mobile app**, and pick a store under **Connect App Stores** — or under **App stores** once the app is live. ## Connect Apple 1. **Sign in with your Apple ID** Enter your Apple ID and password, then the 6-digit code Apple sends to your trusted devices. Floot does not store your password. 2. **Let Floot check the account** Floot checks that the account is in the Apple Developer Program and has the access it needs to create apps and upload builds. If something is missing, it says what. 3. **Name your app** On the first publish, choose the App Store name testers and shoppers will see. It has to be unique across the App Store, and Floot checks that it is free. If your Apple account has never published an app, Apple also needs a company name — the seller name shown on the App Store, which cannot be changed later. 4. **Confirm** Floot creates the app in App Store Connect, checks the bundle ID and signing, and connects the account to the project. After that, each publish builds the iOS app in about 4 minutes. Apple takes another 5 to 30 minutes to process the build before it appears in TestFlight, and emails your testers an invite. ## Connect Google Play 1. **Say whether the app is already on Google Play** Choose **No, it's a new app** or **Yes, it's already on Play**. 2. **Pick the Google account that owns your Play Console** Sign in with Google, or reuse an account you connected before. 3. **For a new app, create it in Play Console** Click **Create app** in Play Console and paste the package name Floot shows you — paste it rather than typing it, since it has to match exactly. 4. **Invite Floot to the app** Open the app in Play Console, copy the URL from your browser's address bar, paste it into Floot, and click **Invite Floot**. That gives Floot's publishing account access to this one app, so it can upload builds. 5. **For an existing app, upload your signing key** Google only accepts updates signed with the key you used before, so upload that keystore (`.jks`, `.keystore`, or `.p12`) with its password. If it holds several keys, pick the one your app is signed with. After that, each publish builds the Android app in about 2 minutes and puts it on Play Console internal testing. ## Every publish after that - Connected stores get a build whenever you publish with **Publish mobile app** on. Switch a store off under **App stores** to skip it for one build. - Set the version in the **Version** row before a release (`1.0.0` until you change it). The build number is automatic, and Floot keeps it above anything already in the store. - Every build still comes with the Android APK and the project zip, the same as without a store. - With a store connected, your assistant can build the app itself when it publishes — just ask for an iOS or Android build. - A [test build](https://floot.com/docs/mobile-apps/creating-mobile-apps-in-floot#test-builds) goes to the same testing tracks but stops working after 4 hours. Never submit one for review. ## Submitting for review Floot stops at testing. When a build is ready, submit it for review yourself: screenshots, a description, and review notes in App Store Connect, or a store listing and a release in Play Console. Review and approval are between you and Apple or Google, and an app already live in a store keeps its current version until you submit an update. > **Before you submit to Apple:** Apple rejects generic permission wording. Ask your assistant to write purpose strings that say why your app needs the camera, photos, location, or microphone — see [Native app features](https://floot.com/docs/mobile-apps/native-features). --- # Native app features > Push, permissions, the share sheet, background work, the status bar, and iPhone-only builds — what to ask your assistant for. Source: https://floot.com/docs/mobile-apps/native-features Your iOS and Android apps are your web app in a native shell. A few things only make sense in the native app, and there is no settings screen for them: you ask your assistant, and they ship with your next app build. ## Push notifications Floot's built-in push reaches phones as well as browsers. Native push is set up for you when you publish with a store connected: the Apple account for iOS, and Google Play for Android, which needs a paid plan. A build made without the matching store ships without native push. Browser push does not work inside the native app, so the native app needs its own. ## Permissions Floot adds the permissions your app needs on its own: camera and photo access on every iOS build, location and microphone when your code uses them, and notifications when you use Floot's push. The default iOS wording is generic, and Apple rejects apps for it — ask your assistant to write purpose strings that say why your app needs each one, such as "Scan receipts to add them to your expenses." ## Things to ask for - **Share to your app** — Let people share photos, videos, audio, PDFs, text, or links from other apps into yours, from the iOS and Android share sheets. Your assistant also writes the code that receives what was shared. - **Work in the background** — Run a short piece of your app's code while it is not on screen — when your backend sends a silent push, on iOS and Android, or when iOS gives the app background time. Each wake gets about 25 seconds. The phone decides how often background time comes, and on Android a wake only runs while the app is still alive in the background: once the user swipes it away, wakes are missed. - **Status bar style** — By default the app sits between solid strips under the status bar and above the home indicator. Ask for a different strip color, light or dark status-bar icons, or edge-to-edge — content running under the bars, with the padding your assistant adds to keep controls clear of them. - **iPhone-only** — iOS builds support iPhone and iPad by default. Ask for iPhone-only if the iPad layout is not ready. This is one-way: once a version that supports iPad has been released, Apple will not accept an update that drops it, so your assistant asks whether the app is already live before it changes this. ## Handled for you - Apple's privacy manifest entries for the native plugins your app uses. - The Android status bar and keyboard insets, so nothing hides behind the system bars. - After your first app build, your project gains `static/__dev/native/ios-info.plist` and `static/__dev/native/android-manifest.xml`. Your assistant can edit them for anything else the stores ask for — ask it to read the `ios-info-plist` or `android-manifest` guide first. ## What counts toward your monthly app builds - A build counts once it finishes, and while it is still running. - A build that fails does not count, and neither does one that every connected store turned away. - A build that a newer one replaced while it was running still counts. - A test build counts the same as a live build. - At most 2 app builds run at the same time. - Builds started during an Action Boost never count — see [Build actions](https://floot.com/docs/integrations/build-actions). > **React Native and Expo do not apply:** Floot builds your web app into the native apps, so React Native and Expo packages cannot be installed. Your assistant uses the web or native-plugin equivalent instead. --- # Add your app to an iPhone or Android home screen > Install a Floot app on an iPhone or Android home screen straight from the browser — no App Store, no Play Store, no download. Source: https://floot.com/docs/mobile-apps/add-project-to-home-screen Once your project is published, you or your users can add it straight to a phone or tablet home screen. No app store download required. A **web app manifest** makes that shortcut look and feel like an app — it launches in its own window, with no browser toolbar in sight. It is optional, and the steps below work either way. How to add one is at the end of this page. ![A Floot project shortcut sitting on an iPhone home screen](https://floot.com/_cdn/static/63413225-794c-4088-aca7-5eda2161913b-docs-iphone-app-home-screen.png) ## iPhone and iPad On iOS the shortcut is created from the browser's share menu. Safari is the most reliable path and the one shown below, but Chrome and Edge for iOS also offer **Add to Home Screen** in their share menus, and the result is the same — every browser on iOS renders through WebKit. 1. **Tap the Share button in Safari** Open your published project URL in Safari, then tap the share icon — the square with an upward arrow — at the bottom of the screen. ![Tapping the share button in Safari](https://floot.com/_cdn/static/ff9276e7-a969-4984-8264-28aabdc59377-docs-ios-safari-share-button.png) *Tap the share button.* 2. **Choose "Add to Home Screen"** In the share sheet, scroll down and tap **Add to Home Screen**. If it is not there, scroll to the bottom and tap **Edit Actions** to enable it. ![The "Add to Home Screen" option in the iOS share sheet](https://floot.com/_cdn/static/c0adec5f-e2eb-4f76-bea4-10f513b1df93-docs-ios-add-to-home-screen.png) *Tap "Add to Home Screen."* 3. **Name the shortcut and confirm** Give it a name — or keep the default — then tap **Add** in the top-right corner. ![Editing the shortcut name before adding it](https://floot.com/_cdn/static/40fe2370-e022-49ca-97fb-d1f52b41e900-docs-ios-edit-name-and-add.png) *Edit the name and tap "Add."* Your project now sits on the home screen alongside regular apps. You can rearrange it or drop it into folders, though it will not show up in the App Library. > **With a web app manifest:** The shortcut launches in its own standalone window — no browser toolbar or address bar — instead of opening as a Safari tab. ## Android Android is more flexible: several browsers support home screen shortcuts. Here are Chrome and Firefox. ### Google Chrome 1. **Open the browser menu** Navigate to your published project URL in Chrome, then tap the three-dot icon in the top-right corner. ![Tapping the menu icon in Chrome for Android](https://floot.com/_cdn/static/83ff2b83-4a14-4fdd-9ea9-a758fda0a348-docs-android-chrome-menu.png) *Tap the menu icon.* 2. **Choose "Add to Home Screen"** ![Selecting "Add to Home Screen" in the Chrome menu](https://floot.com/_cdn/static/b3d86614-88c4-4b1a-887d-ac31c210b5ab-docs-android-chrome-add-to-home.png) *Select "Add to Home Screen."* 3. **Name the shortcut and tap "Add"** ![Editing the shortcut name in Chrome](https://floot.com/_cdn/static/f012f019-ddfb-434f-a9ea-cdfbe3ac8b6f-docs-android-chrome-edit-name.png) *Edit the name and tap "Add."* 4. **Place it on your home screen** Your launcher shows a confirmation. Either drag the icon where you want it, or tap **Add to Home Screen** to place it automatically. ![Confirming placement on the Android home screen](https://floot.com/_cdn/static/1ff58493-94c1-404b-a335-0d7f88c055fc-docs-android-chrome-add-confirm.png) *Tap "Add to Home Screen."* ### Mozilla Firefox In Firefox, tap the three-dot menu, open the **More** section, then choose **Add to Home Screen**. !["Add to Home Screen" in Firefox for Android](https://floot.com/_cdn/static/c978a4b8-1d21-4524-b479-7e48bf7e7808-docs-android-firefox-add-to-home.png) *Tap "Add to Home Screen" in Firefox.* Just like Chrome, you can rearrange the shortcut or put it in a folder. It will not appear in the app drawer — only on the home screen. > **Chrome may offer to install instead:** With a web app manifest, Chrome can prompt you to **Install** the app — it then runs in its own window and appears in the app drawer alongside your other apps. Firefox for Android can install it too, but without Chrome's WebAPK integration, so it stays a home screen shortcut rather than a proper app drawer entry. ## Make it open like an app This is not a hosting setting but a small change to your project, so ask your assistant: "Make this app installable." It adds a web app manifest — `static/manifest.json`, with the app's name, icons, and `display: standalone` — and links it from the page. Set a project icon too; it becomes the home-screen icon. Then have your assistant publish, and the change reaches your users. Floot apps do not use a custom service worker: Floot already runs its own for push notifications, and a second one would conflict with it. The manifest alone is enough. > **Want a real native app instead?:** This is the lightweight option. For an app you can ship to the App Store or Google Play, see [Creating mobile apps](https://floot.com/docs/mobile-apps/creating-mobile-apps-in-floot). --- # Installing your iOS app > Run your Floot app on the iOS Simulator or a real iPhone, and publish it to the App Store. Source: https://floot.com/docs/mobile-apps/installing-ios-app Floot can convert your project into a native iOS app. Here is how to get it running on your iPhone or the simulator. This page covers the do-it-yourself route: download the project zip from floot.com and build it in Xcode on your own Mac. Your assistant cannot download the zip for you. Publishing through Floot needs neither the zip nor Xcode: connect your Apple account under **App stores** on the Publish screen, and Floot uploads each build to TestFlight — see [Publish to TestFlight and Google Play](https://floot.com/docs/mobile-apps/publishing-to-app-stores). > **Rejected over a permission string?:** You do not need Xcode for that. Ask your AI assistant for the `ios-info-plist` guide — once your app has had one iOS publish, it can edit `static/__dev/native/ios-info.plist` in your project directly, and the change ships on your next publish. ## Prerequisites (for building it yourself) - A Mac running macOS - Xcode installed — free from the [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835) ## Getting your iOS app 1. **Build the mobile apps** 1. Open your project on floot.com and click the **Publish** button 2. Switch on **Publish mobile app** 3. Click **Publish**, or **Publish update** if the app is already live. Wait a few minutes for the build to finish 2. **Download the mobile project** 1. On the Publish screen, find the **Last build** card 2. Next to **Project zip**, click **Download**. The card only holds your latest build — the next app build replaces it, even if that build fails 3. Unzip it — a single archive holds both the `ios/` and the `android/` project 3. **Install Node.js dependencies** Install Node.js if you do not have it, then run this in the unzipped folder: ```bash npm install -g pnpm pnpm install ``` 4. **Install Homebrew** Skip this if you already have it. ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` 5. **Install CocoaPods** ```bash brew install cocoapods ``` 6. **Install the native dependencies** ```bash cd ios/App pod install --repo-update ``` 7. **Open the project in Xcode** 1. Navigate to the unzipped folder 2. Go to `ios/App` 3. Double-click `App.xcworkspace` to open it in Xcode > **Open the workspace, not the project:** `App.xcworkspace` is the one you want — `App.xcodeproj` will not have the CocoaPods dependencies. ## Running in the iOS Simulator 1. At the top of Xcode, find the device selector dropdown next to the app name 2. Select a simulator device (for example, "iPhone 17 Pro") 3. Click the **▶ Play** button, or press `Cmd + R`, to build and run 4. The simulator launches with your app running ## Installing on a real iPhone 1. Connect your iPhone to your Mac via USB 2. Select your iPhone from the device dropdown in Xcode 3. Configure code signing — this requires an Apple Developer account 4. Click **▶ Play** to install and run on your device After you change your app and publish again, download the project again and click **▶ Play** to refresh the installed app. ## Troubleshooting - **"No provisioning profiles found"** — This happens when running on a physical device. Set up code signing in Xcode under **Signing & Capabilities**. - **"Build failed" errors** — Clean the build folder — **Product → Clean Build Folder**, or `Cmd + Shift + K` — then build again. - **Simulator not appearing** — Make sure iOS simulators are installed. In Xcode, go to **Settings → Components** to download them. ## Publishing to the App Store 1. **Create an Apple Developer account** Enroll in the Apple Developer Program ($99 per year). 2. **Confirm the app installs on your iPhone** Follow the steps above first — if it will not install on your own device, it will not pass review either. 3. **Add push notification capability, if you use it** 1. Click the App target in the left pane 2. Click **App** under TARGETS 3. Open the **Signing & Capabilities** tab 4. Click **+ Capability** 5. Search for "Push Notifications" and add it 4. **Upload to App Store Connect** Go to **Product → Archive**, then click **Distribute app**. Head to [appstoreconnect.apple.com](https://appstoreconnect.apple.com) and fill in the required information to submit for review. For full detail, see [Apple's publishing guide](https://developer.apple.com/app-store/submitting/). ## Shipping an update 1. Make your changes 2. On the Publish screen, switch on **Publish mobile app**, raise **Version** for each release you submit (for example `1.0.0` → `1.1.0`), and publish 3. Download the updated project (same steps as the initial setup) 4. Open it in Xcode, then archive and submit as above > **Set the version on the Publish screen, not in Xcode:** Floot writes **Version** and **Build** into every build it makes. Version comes from the **Version** row, which appears on the Publish screen once **Publish mobile app** is on (`1.0.0` until you change it). Build is a counter that goes up by one with every app build — failed ones included — so it always rises. Changes made in Xcode are thrown away by the next download. > **Floot does not handle store submissions:** You need your own Apple Developer account to publish, and Apple handles any review or publishing support. --- # Installing your Android app > Install your Floot app on an Android device, and publish it to the Google Play Store. Source: https://floot.com/docs/mobile-apps/installing-android-app Floot can convert your project into a native Android app. You can install it directly on your device — no developer tools required. > **The APK comes from floot.com:** Build the app and download the APK on floot.com, from the **Publish** screen. The project link your assistant shares opens the project view at `/mcp-preview/`, and the **Publish** button there is the same screen. Your assistant can start an app build itself only once a store account is connected, and it cannot hand you the APK. Once the Android app has been built once, your assistant can edit `static/__dev/native/android-manifest.xml` for you — ask it for the `android-manifest` guide. That is the usual fix for a Play rejection, or for a permission you need to add after publishing. ## Getting your Android app 1. **Build the mobile apps** 1. Open your project on floot.com and click the **Publish** button 2. Switch on **Publish mobile app** 3. Click **Publish**, or **Publish update** if the app is already live The build takes several minutes. On Free and Pro, the switch starts off each time, so a publish without it updates only the website. Switch it on whenever you want a new APK. 2. **Get it onto a phone** On the Publish screen, find the **Android APK** row of the **Last build** card. There are three ways to get the app onto a device: - **Download** — downloads the APK through the browser you are in. Use this when you have Floot open on the Android phone itself. - **Get link** — copies a download link. Open or paste that link in the phone's browser. - **QR code** — shows a QR code for the same link. Point your Android camera at it. > **Unknown sources:** Android may ask you to allow installation from unknown sources. This is expected for an APK installed outside the Play Store. Note this APK is the debug build — right for trying the app yourself or handing it to testers, but Google Play will not accept it. Publishing to Play needs the signed release build covered below. 3. **Install it** 1. Once downloaded, open the APK file 2. If prompted, enable "Install from unknown sources" for your browser 3. Tap **Install** 4. Your app is ready to use ## Troubleshooting - **How do I install the APK after downloading?** — Android usually offers to install it right away. If not, open your Files app and tap the APK you downloaded. - **"Can't install from this source"** — Go to **Settings → Security → Install unknown apps** and enable it for your browser or file manager. - **QR code not working** — Click **Get link** instead and paste the copied link straight into the phone's browser. A copied link works for 7 days. If the **Last build** card shows no APK, the latest build has not finished yet or it failed — a newer build, even a failed one, replaces the previous downloads. Publish again with **Publish mobile app** switched on. ## Publishing to the Google Play Store > **Floot can do this for you:** On a paid plan, connect your Google Play account under **App stores** on the Publish screen, and Floot builds, signs, and uploads every app build to Play internal testing — see [Publish to TestFlight and Google Play](https://floot.com/docs/mobile-apps/publishing-to-app-stores). The steps below are the do-it-yourself route. 1. **Create a Google Play Developer account** Sign up at the [Google Play Console](https://play.google.com/console) — a $25 one-time fee. 2. **Download the Android project** 1. Open your project on floot.com and click **Publish** 2. On the **Last build** card, click **Download** next to **Project zip** 3. Unzip it — the `android/` project is inside This is the same **Download** button used for iOS: one archive holds both projects. If you already downloaded it for iOS, you have it. 3. **Install dependencies** Install Node.js, then run this in the unzipped folder: ```bash npm install -g pnpm pnpm install ``` 4. **Generate a signed release build** - Navigate to the `android` folder - Follow the [Android signing guide](https://developer.android.com/studio/publish/app-signing) to create a keystore and sign your app - Build a release AAB with `./gradlew bundleRelease` 5. **Upload to the Play Console** - Create a new app in the console - Complete the store listing — description, screenshots, icon - Upload your signed AAB from `android/app/build/outputs/bundle/release/` - Complete the content rating questionnaire - Set pricing and distribution 6. **Submit for review** Google typically reviews apps within 1–3 days. For more detail see [Google's publishing guide](https://developer.android.com/studio/publish) and [Capacitor's Android documentation](https://capacitorjs.com/docs/android) — Floot uses Capacitor to build the native app. ## Shipping an update 1. Make your changes and publish them 2. Download the updated Android project 3. Open `android/app/build.gradle` — the app-level file, not `android/build.gradle`, which only holds buildscript classpath entries 4. Update `versionName` (for example `"1.0"` → `"1.1"`) 5. Rebuild, sign, and submit as above > **Leave versionCode alone:** Floot already stamps `versionCode` for you. It is a counter that goes up by one with every app build, failed ones included, so it always rises; changing it by hand is thrown away by the next download. With Google Play connected, Floot sets `versionName` too, from the **Version** row on the Publish screen, and keeps `versionCode` above anything already in Play. > **Floot does not handle store submissions:** You need your own Google Play developer account to publish, and Google handles any review or publishing support. --- # Billing, credits, and plans > The two meters — build actions and credits — what rolls over, and what each plan includes. Source: https://floot.com/docs/faqs/billing-credits-and-plans Floot has two meters. Build actions meter the work your AI assistant does on your projects through the Floot connector. Credits pay for AI that Floot itself runs — image generation, and any AI features running inside your own published app. Where the difference matters, each answer below says which meter applies. ## Which one am I spending? - **Build actions** — Spent when your AI assistant works on a project through the Floot connector — one per tool call it makes. The assistant's own thinking runs on your Claude, ChatGPT, or Cursor subscription, so it costs no Floot credits. Calls that fail or are cancelled are never counted, and a handful of protective calls — checking job or publish status, listing your projects, fetching a preview URL, cancelling a request, unpublishing an app — never count either. - **Credits** — Spent when Floot runs the AI. Two things do that: generating images into a project, and any `@floot/ai` feature running inside your own published app — a chatbot, a summarizer, an embedding search. Everything else your assistant does is metered in build actions instead. > **On a shared project:** Credits always come out of the project owner's balance, not the balance of whoever is chatting. That includes images generated from a collaborator's AI assistant. ## Where do I see what I have left? On the [plan and usage page](https://floot.com/dashboard/plan-usage). It shows credits used this billing period and build actions used today. ## Do credits roll over? Yes — unused monthly credits roll over to the next month so you have more time to use them. - You have one month to use rolled-over credits. If your billing period was Oct 25 → Nov 25, those credits are usable until Dec 25. - Rollover credits are spent first, then your monthly quota, then your other credits — top-ups and bonuses, soonest-expiring first. - A paid plan is required to use rolled-over credits. Once your plan renews, rollover credits appear on your [plan and usage page](https://floot.com/dashboard/plan-usage). ## What does each plan include? | | Free | Pro — $25/mo | Power — $100/mo | | --- | --- | --- | --- | | Build actions | 100 per day | 1,000 per day | 5,000 per day | | Credits | 3,000 once, at signup | 5,000 per month | 15,000 per month | | Hosting included | $3 once, at signup | $10 per month | $25 per month | | Projects | 5 | Unlimited | Unlimited | | Published apps | Unlimited | Unlimited | Unlimited | | Floot Storage | 100 MB | Unlimited | Unlimited | | Custom domains | No | Yes | Yes | | Get Code export | No | Yes | Yes | | Native app builds | 2 per month | 12 per month | Unlimited | | Google Play publishing | No | Yes | Yes | | Scheduled jobs | No | Yes | Yes | | People invited to private apps | 5, across all apps | Up to 500 per project | Up to 500 per project | Both paid plans can also be billed yearly: Pro is $250 a year and Power $1,000 a year — two months free. Existing projects are never taken away if you end up over the project cap — you just cannot create more until you upgrade or delete one. > **Older credit-ladder plans:** Subscribers on one of the older credit-ladder plans keep that plan's credits, but their build actions are metered at the free limits — an old plan bought credits, not build actions. The [switch page](https://floot.com/dashboard/billing/switch) shows exactly what moving to Pro or Power would mean for your account. ## What happens if I run out and upgrade mid-month? Upgrading takes effect immediately and you only pay the prorated difference. Going from Pro to Power raises your monthly credits from 5,000 to 15,000 and your daily build actions from 1,000 to 5,000, both usable right away. ## Can I buy extra credits? Yes, from the [plan and usage page](https://floot.com/dashboard/plan-usage). One-time top-ups start at $20, convert at $1 = 1,000 credits, and are available the moment payment clears. They require an active paid plan, are non-refundable, and expire 60 days after purchase. ## Can I buy extra build actions? Top-ups add credits, not build actions. If you keep running out of build actions, move up a plan — Free to Pro, Pro to Power. On Pro and Power, the message you get at the daily limit also offers an Action Boost: $5 for 5,000 extra build actions, usable for the rest of that day and all of the next, with unlimited app builds for the same window. See [Build actions](https://floot.com/docs/integrations/build-actions). ## Do I need credits to build? No. Building through the [Floot connector](https://floot.com/docs/integrations/build-from-claude-and-chatgpt) runs on your own Claude, ChatGPT, or Cursor subscription, and Floot meters it in build actions — see [Build actions](https://floot.com/docs/integrations/build-actions). Generating images is the one exception, and it spends a small number of credits from the project owner's balance. ## What happens if I cancel? Your projects and data stay where they are. You keep building with your own AI assistant at the free plan's action limits and can spend any credits you already bought, but no new monthly credits arrive and rollover credits stop being usable. Your published app stays up while hosting credit lasts — after that a cancelled account is taken offline with no grace period, and its `*.floot.app` subdomain is released. ## Do you give free credits for referrals? Not any more — there is no referral page or reward for social posts. Referral links already shared keep earning: 2,000 credits when someone who signed up through yours publishes their first app, and 5,000 when they first subscribe. --- # Hosting > How hosting is billed, what happens when the credit runs out, and how to take a site down. Source: https://floot.com/docs/faqs/hosting ## How does hosting billing work? Hosting is billed pay-as-you-go based on usage. Every paid plan includes a monthly hosting allowance covered by your subscription — you are only charged for usage beyond it. Pro includes $10 a month and Power includes $25 a month, covering compute, database, CDN and storage. Free accounts have no recurring allowance. New accounts get a one-time $3 hosting credit, which is enough to put a first app live. Older credit-ladder plans all carry the same flat $10, whatever their credit tier. ## Where can I see my hosting usage? On the [hosting dashboard](https://floot.com/dashboard/hosting). You can also just ask your AI assistant — it can read your hosting and Lambda usage through the connector and suggest ways to bring costs down. ## What drives hosting costs up? - Large images and video served on every page load - Polling loops that hit your backend far more often than they need to - Runaway client-side effects that fire requests in a tight loop If something unusual shows up, Floot temporarily caps that app's concurrency to keep it and everything around it healthy, lifts the cap automatically once traffic settles, and the team follows up if it keeps happening — see [Reliability and limits](https://floot.com/docs/platform/reliability-and-limits). ## What happens if I run out of hosting credit? Your app is taken offline. Your data is kept, but the `*.floot.app` subdomain is released and can be claimed by someone else, so coming back is a fresh publish rather than a switch flip. Any custom domain attached to it is removed first. Until the balance is paid, the database can't be opened or downloaded. > **How much warning you get:** A paid plan in good standing gets a 3-day grace window with warning emails first. Free accounts, cancelled plans, plans already pending cancellation, and cards that have been failing for more than two weeks are taken down with no grace period at all. Top up from the [hosting dashboard](https://floot.com/dashboard/hosting) before you get there. ## How do I unpublish my site? Ask your assistant to unpublish the app. That call never counts against your daily build actions, so you can always take an app offline, even after hitting your limit. You can also do it yourself: open your project on floot.com, click **Publish**, then the **Unpublish** icon next to your live URL, and confirm **Delete subdomain**. If a custom domain is attached, remove it first from its **Domain settings** (the cog next to the domain) — until then, Delete subdomain stays disabled. Either way the subdomain is released and someone else can publish to it, so pick the name again quickly if you plan to come back. --- # Code, data, and exports > Getting your code and database out of Floot, and how to bring an existing project in. Source: https://floot.com/docs/faqs/code-data-and-exports ## Do I own the code? Completely — code, data, and IP. See [Security and data](https://floot.com/docs/platform/security-and-data). ## How do I download or export my code? There is no export tool on the connector, so your assistant cannot produce the download for you. It can read any file in the project, so it can copy specific code into your chat, but the runnable zip has to come from the browser. Open your project on floot.com, click the project name in the top bar, and choose **Get Code**, then **Download as ZIP**. The download includes instructions for running it, and comes with every paid plan. If you plan to host it yourself, read [Self-hosting](https://floot.com/docs/projects/self-hosting) first. ## Can I work on the project files on my computer? Yes, on a paid plan, in Chrome or Edge: **Get Code → Folder Sync** connects a folder on your computer to the project. Floot compares the two and lists what would move each way — changes to send to Floot, changes to bring into your folder, ones it merged on its own, and conflicts for you to decide — and nothing moves until you review the merge and apply it. It syncs the project's own files, so it is not a way to import an unrelated codebase. ## Can I import an existing codebase into Floot? Floot cannot run your existing codebase as-is — it rebuilds it. What you get is a Floot-native app that looks and behaves like the original, not a port, so third-party API keys and data migrations still have to be redone by hand. There is no import tool on the connector — nothing takes a repository or an archive and turns it into a Floot project. Handing your assistant a zip does not import anything. What works instead: if your assistant can already read your source — Claude Code, Codex, and Cursor all run on your machine — point it at the repository and ask it to rebuild the app in Floot page by page. It writes the pages, endpoints and schema with the same tools it would use on a new project. Give it the schema and one page at a time rather than the whole repo at once. ## Can I export my database? Yes, but it is a browser step — there is no connector tool that produces a database dump. 1. Open your project on floot.com and go to the **Services** tab, then **Data**. 2. Select your **Floot database** and open a table. 3. Click the **cog icon** in the table header and download the `pg_dump`. If the download fails, contact support with your project URL and we can generate one for you. This doesn't apply while your hosting is taken down for an unpaid balance. --- # APIs, scraping, and mobile > Connecting third-party APIs, scraping without getting blocked, and what it takes to ship a native app. Source: https://floot.com/docs/faqs/apis-scraping-and-mobile ## Do you support APIs? Yes — especially well-documented ones. For newer or niche APIs, point your assistant at the documentation URL and ask it to read the docs before it writes any code. > **Never paste an API key into chat:** Floot collects third-party keys through a one-time secure link instead, and only the environment variable names ever come back to the AI. If your assistant asks you to paste a secret into the conversation, ask it to request the credential properly instead. See [Connecting external services](https://floot.com/docs/integrations/overview). ## How should I do web scraping with Floot? Use a dedicated scraping service such as ScrapingBee and have your Floot app call it. Running scrapers directly from a serverless backend is fragile and gets blocked quickly. The service's key goes in through the same secure-link flow as any other credential, so your AI never sees it. ## Can Floot build native mobile apps? Yes. Floot wraps your project as real iOS and Android apps you can install on a device and submit to the App Store or Google Play. Every plan includes app builds — 2 a month on Free, 12 on Pro, unlimited on Power — and Floot does the building; you just need the developer accounts. See [Creating mobile apps](https://floot.com/docs/mobile-apps/creating-mobile-apps-in-floot). > **App builds start on floot.com:** Open your project on floot.com, click **Publish**, switch on **Publish mobile app** and publish. On Free and Pro, the switch starts off each time, so a publish without it updates only the website. Your assistant can start a build itself only once an Apple or Google Play account is connected to the project. If you are out of app builds for the month, the publish still goes out for the web and tells you the app build was skipped. Once mobile has been published once, your assistant can edit the native config — `Info.plist` keys and the Android manifest — on its own. To publish to the stores, see [Publish to TestFlight and Google Play](https://floot.com/docs/mobile-apps/publishing-to-app-stores). For things like a share-sheet target or code that runs in the background, see [Native app features](https://floot.com/docs/mobile-apps/native-features). If you just want one-tap access without an app store, [add the project to a home screen](https://floot.com/docs/mobile-apps/add-project-to-home-screen) instead. > **React Native and Expo are not supported:** A Floot project is a web app that Floot wraps for iOS and Android, so React Native and Expo packages cannot be installed. Ask for the web or native-plugin equivalent instead — your assistant knows them. ## Can my app run background work or realtime updates? Yes to both. Background jobs and WebSocket-based realtime are built in on every plan; scheduled cron jobs, and delayed or recurring jobs, run while the project owner is on a paid plan — see [What's built in](https://floot.com/docs/integrations/whats-built-in). You do not have to wire any of it up by hand. Your assistant can provision the database, email-and-password sign-in, Sign in with Google, Sign in with Microsoft, and push notifications for you in one step — the secrets are generated server-side, so there is nothing for you to copy. --- # Troubleshooting and support > What to try when the AI loops on the same error, and what to send support. Source: https://floot.com/docs/faqs/troubleshooting-and-support-flow Most issues resolve faster with a bit of context. Here is what helps. ## What if the AI keeps looping on the same error? Stop after three attempts and change the approach rather than trying a fourth time. 1. Go back to before the change went sideways. If one or two files broke, ask your assistant to put just those files back the way they were — it can step back through a file's history one change at a time. To undo everything, use **Restore** on a checkpoint in the **Checkpoint** panel in your project on floot.com. Next time, ask it to save a checkpoint before it tries something risky. 2. Ask it to diagnose before it edits anything else. It can read files, run a typecheck and run your tests without changing a line. 3. Ask it to read the backend logs first — the preview's from the last hour, and the published app's production logs from the last 90 days. 4. Contact support with your project URL. > **What a loop costs:** A loop spends build actions, not credits — and calls that fail or are cancelled never count at all. If a loop has eaten your daily actions, send us your project URL and we will look at what happened. ## What details do you need to investigate an issue? Share the full details of what you are seeing and your project link with live chat support. What you did, what you expected, and what actually happened covers most of it. ## Can I send a screenshot to help debug? Yes — and better still, use the **Annotate** tool in your project on floot.com to circle the problem area. That captures the screenshot and the context together. Share it with your assistant, which can open the annotation and see exactly what you circled. Screenshots in live chat are helpful too. ## My published app looks different from the preview Preview shows your latest changes; the published app shows the last version you published. Ask your assistant to publish again. On an app that is already live, `publish_app` publishes it again on the same URL. You can also push it live yourself with the **Publish** button in your project on floot.com — see [how preview and publishing work](https://floot.com/docs/getting-started/editor-and-preview). --- # Your account > Changing your email, two-factor authentication, paying on the right account, signing out other devices, disconnecting an assistant, and deleting your account. Source: https://floot.com/docs/faqs/your-account Account settings live on the [account page](https://floot.com/dashboard/account) on floot.com. ## How do I change my email address? Under **Profile**, click **Change** next to your email and enter the new address. Floot sends a confirmation link there, valid for 60 minutes; until you confirm it, you keep signing in with the old address. Open the link in a browser where you are signed in to this Floot account — otherwise it asks you to sign in first. After the change you sign in with the new email. Google, GitHub, or Microsoft sign-in linked to the old address stops working; signing in with the provider account that matches the new address links it again. Accounts are never merged. If the new address already has a Floot account with nothing on it, confirming the change closes that empty account, and the confirmation page says so first. If that account has anything on it — projects, a plan, domains — the page lists what has to be cleared before the change can go through. ## How do I turn on two-factor authentication? Under **Security**, click **Set up** next to **Two-factor authentication**. Scan the QR code with an authenticator app — Google Authenticator, 1Password, Authy, and the like — or type in the key shown under it, then enter the 6-digit code the app gives you. Floot then shows 10 recovery codes, once: copy or download them and keep them somewhere safe. From then on, every sign-in — email link, Google, GitHub, or Microsoft, including signing in from a preview link — also asks for the current code from your app. A recovery code works instead, once each. Enter the code within 10 minutes; after too many wrong codes the sign-in is cancelled and you start again. - Turning it on does not sign out devices that are already signed in, or disconnect AI assistants you connected before. To make them go through the new check, use **Sign out others** and choose **Also disconnect … agents**. - Turning it off, or generating new recovery codes, needs a code from your app or a recovery code, so someone with only your browser cannot do either. Floot emails you whenever either happens, and when it is turned on. - Lost your device and your recovery codes? Write to support@floot.com from the email on your account. Support will need more than an email from your address to confirm it is you — a mailbox is exactly what two-factor authentication guards against. ## I upgraded, but my AI assistant still says I am on Free Your assistant is connected to one Floot account, and its limits follow that account — not whichever account your browser happens to be signed in to. This usually comes from having two Google accounts, using two browsers, or a sign-in that created a second Floot account. - **Before you pay:** use the upgrade link in your assistant's limit message. It shows which account your assistant is connected to, and offers **Switch account** if your browser is signed in to a different one. - **Already paid on the other account?** Contact support with both email addresses. If the paid account is the one you want to keep using, you can also disconnect Floot in your assistant and connect it again while signed in to floot.com as the paid account; projects stay with the account that created them. ## How do I sign out other devices or disconnect an AI assistant? Under **Sessions**, **Sign out others** signs out every other browser, and **Also disconnect … agents** cuts off connected AI assistants and API keys at the same time — choose it if you think someone else has access. Under **Connected agents**, **Disconnect** removes one assistant's access on every device; you can connect it again later. ## How do I delete my account? Under **Delete account**. First cancel your subscription on Plan & usage and unpublish your published apps — the dialog lists anything left to do. Deleting signs you out everywhere, permanently deletes your projects and their databases, stops connected agents and API keys, and the email address cannot be used to sign up again. --- # Community and links > Where to find the Floot community, updates, and support. Source: https://floot.com/docs/community/links Come build with other people who are building on Floot. - [Discord](https://discord.gg/sUFNJ3FW8G): The fastest place to get an answer from other builders and the Floot team. - [LinkedIn](https://www.linkedin.com/company/floothq/): Company updates and what we are shipping. - [X / Twitter](https://x.com/floothq): Follow @floothq for releases and build highlights. - [Gallery](https://floot.com/showcase): Real apps built on Floot — on a paid plan, duplicate any of them and keep building with your own AI assistant. ## Getting support For anything account- or project-specific, live chat is the fastest route. Live chat needs you signed in — open [floot.com/support](https://floot.com/support), or use the headphones icon in the top bar of your project on floot.com. Signed out, email [hello@floot.com](mailto:hello@floot.com). Have your project URL ready either way. If you are stuck connecting an AI assistant to Floot rather than building something, the setup walkthrough at [floot.com/integrations/mcp](https://floot.com/integrations/mcp) is usually faster than support — pick your client and it gives you that client's exact steps.