create_app
ChatGPTCreate a new interactive web app and render it inline. Use this to build a new app from a request. If module reuses a manifest.id the caller already owns, the new app replaces the existing app module, UI, and styles in place; use update_app to edit a known app ID by UUID. Apps persist state through a backend env.storage (Workers KV) binding and call backend operations from the frontend via window.buildy.api. The module, ui, and description parameter docs carry the authoring rules; the buildy:app-guide prompt has the full guide and a canonical example.
delete_app
ChatGPTPermanently delete a Buildy app the caller owns, optionally also purging its stored data. Use this to remove an app the caller no longer wants. Deletion is irreversible and requires confirmation: the host is asked to show a confirmation prompt, and when it cannot, the call fails closed until re-invoked with confirm: true.
get_app
ChatGPTFetch an existing app by ID and render it inline. Use this to open, re-render, or continue working with an app the caller already has. Returns the live embedded UI plus its callable API operations, which another agent can invoke with query_app (read-only) or mutate_app (writes) to query or update saved app data. Unlike list_apps, which returns only names and URLs, get_app renders the app; call list_apps first to find the ID.
get_app_source
ChatGPTReturn an app's raw persisted source (module, frontend ui script, and styles) plus its current version for optimistic-concurrency edits. Use this when you need the source to inspect, debug, or edit an app the caller owns.
list_apps
ChatGPTList the caller's Buildy apps. Use this to find an app's id before fetching, editing, or calling it. Returns per app: id, displayName, description (a search-friendly summary), url, lastUpdatedAt (ISO-8601 of the last write), claimed (always true for now — exposed for forward-compat), and capabilities (imports + exports). The description disambiguates apps with similar display names; capabilities.exports lists each app's callable operations, exposing the cross-app integration surface without N+1 get_app_source calls. Paginate with cursor from a prior call's nextCursor line. Apps with description: null predate descriptions and have not yet been backfilled.
list_feedback
ChatGPTList feedback rows for the caller's apps. Use this to review feedback previously recorded for an app. When app_id is set, returns rows for that one app (owner-checked); when omitted, returns rows across every app the caller owns. Paginate with cursor from a prior call's cursor field. Newest rows come first.
mutate_app
ChatGPTRun a mutating backend operation on a Buildy app and return its result, without editing code. Use this for operations that change state — including operations whose read/write safety can't be determined. For read-only operations, use query_app. If you don't know an operation's name or which tool it needs, call get_app — each operation lists its tool.
query_app
ChatGPTRun a read-only backend operation on a Buildy app and return its result, without editing code. Use this for operations that only read state. For operations that change state, use mutate_app. If you don't know an operation's name or which tool it needs, call get_app — each operation lists its tool.
rename_app
ChatGPTChange a Buildy app's URL slug — the human-readable, URL-safe name, distinct from its title/displayName and from its machine manifest id. Use this to give an app a different public URL. Titles and slugs are independent: editing the title with update_app does not change the slug; this tool does. Renaming changes the public URL, and the old URL keeps working by redirecting to the new one. Slug rules: lowercase letters, digits, and hyphens; 2-48 chars; may start with a letter or digit; no leading, trailing, or consecutive hyphens.
set_handle
ChatGPTChange the signed-in user's handle (their username) — the first segment of their friendly app URLs (https://app.buildy.so/<handle>/<app-name>), so changing it changes the prefix of every app URL they share. Use this to give the current user a different handle. The old handle keeps working by redirecting to the new one, so links already shared stay valid. Acts on the current signed-in user only and takes no user id. Handle rules: lowercase letters, digits, and hyphens; 3-32 chars; must start with a letter; no leading, trailing, or consecutive hyphens; some words are reserved. Rate-limited to 3 changes per rolling 30 days.
set_remixable
ChatGPTMark a Buildy app as remixable. Use this to let anyone who opens the app's URL get their own brand-new editable copy, while the original is never mutated by visitors. Each remix is an independent app the visitor can keep and later claim by signing up. Idempotent: calling on an already-remixable app returns the same URL without re-firing analytics. Anonymous apps cannot be made remixable; the app must be claimed first.
set_starter_prompt
ChatGPTSet or clear an app's authored starter prompt — the text prefilled in the chat host when a visitor clicks "Open in Claude" or "Open in ChatGPT" on the app, replacing the generic "I'm using a Buildy app at <url>" body. Use this to frame a shared/remixable app's intended use for visitors. Pass starter_prompt: null (or an empty string) to clear and revert to the generic default. Owner-only; anonymous apps must be claimed first. Idempotent (re-setting the same value is a no-op). Length cap: 2000 characters.
submit_feedback
ChatGPTRecord agent-authored feedback about a Buildy app. Use this to log observed bugs, suggested enhancements, caught crash reports, or qualitative notes. Source is server-enforced to "agent" — agents cannot impersonate user or auto-crash sources. The caller must own the app.
unset_remixable
ChatGPTStop allowing remixes of a Buildy app. Use this to turn off auto-forking for new visitors; existing remixes survive untouched. Idempotent: calling on an already-non-remixable app is a no-op.
update_app
ChatGPTUpdate an existing Buildy app and render the fresh version inline. Use this to edit an app the caller already owns, identified by UUID. Two mutually exclusive input shapes: (A) full-source — pass module/ui/styles to replace those buckets, following the same authoring rules as create_app (documented on those parameters and in the buildy:app-guide prompt); (B) edits[] — exact-string find/replace operations plus the expected_version from your last read, much cheaper for small changes. If the app's behavior changed materially (new operation, new data tracked, new use-case), also pass an updated description so list_apps stays accurate; backfill one if an older app has none.
upload_asset
ChatGPTUPLOAD A STATIC ASSET TO AN APP so app code stays small and the app reads it back same-origin. Use this when an app needs a large or static file — an image, PDF, audio clip, or a dataset bigger than a few KB — that would otherwise be inlined into module/ui and blow the 256 KiB source cap. Provide EXACTLY ONE of: text (UTF-8 dataset/JSON/CSV — no encoding needed), sourceUrl (a remote image/PDF the SERVER fetches; never paste binary), or dataBase64 (tiny inline binary only, <64 KiB). The app reads the asset via window.buildy.assets.getUrl(key) (for <img>/<a>) or env.assets.get(key) in its backend (the app must declare buildy:storage/blob@1.0 in manifest.capabilities.imports to use env.assets). Caps: 10 MiB/asset, 50 assets/app, 100 MiB/app.