---
title: How Charming works
description: What Charming is, how an agent builds an app on it, and what every app supports.
sidebar:
  label: How Charming works
  order: 2
---

## What is Charming?

Charming is a runtime that hosts apps your AI writes. You describe what you want, in your own words, to an agent; the agent turns that into working code and sends it to Charming. Charming returns a real, stable URL and runs the app from there: it's still there tomorrow and next week.

## How to build an app on Charming

1. **You describe what you want.** No install, no setup, just tell an agent what the app should do.
2. **Your agent writes the app** as a small program (a manifest and a module, plus optional UI) and calls `create_app` (MCP) or `POST /app` (HTTP).
3. **Charming returns a stable URL.** The app is live immediately; there's no separate deploy step.
4. **You iterate from there.** Ask the same agent, or a different one later, to change it. It calls `update_app` / `PUT /app/<id>` with the same request body as create, and whatever the app has stored survives the update.

## What features do Charming apps support?

- **Storage.** Every app gets its own key-value storage, plus file storage for images, PDFs, and other assets it reads back. See [Data storage](../capabilities/data-storage).
- **A real name and URL.** Every app is live at a stable URL the moment it's created, and gets a short `charm.ing/<handle>/<app-name>` link once you claim it. See [App names and URLs](../capabilities/app-names-and-urls).
- **Sharing and roles.** Apps are private by default: one owner, one dataset, no one else can open it. Invite people in as a collaborator, an end-user, or a read-only viewer. Sign in at charm.ing and open [Account Home](https://charm.ing/) to see every app you own or have been given access to. See [Privacy and sharing](../capabilities/privacy-and-sharing).
- **Secrets.** A claimed app can call external APIs with a secret; Charming fills the secret in on its servers, and the app's code never sees the plaintext value. See [Secrets](../capabilities/secrets).
- **Connect to any AI agent.** [Every app is accessible over MCP](every-app-is-accessible-over-mcp) the moment it's created, with nothing to set up. The same MCP tools and HTTP API work from any agent: list your apps, read the current source, call an operation, or ship an update, all against the same app. See [Connect to any AI agent](../capabilities/connect-any-agent).
- **Own your source.** Export an app's full source at any time and reuse it anywhere. See [Code export](../capabilities/code-export).
- **Feedback.** A built-in button lets anyone using the app send a bug report or a suggestion; your agent reads it back and ships a fix. See [Feedback](../capabilities/feedback).
- **Custom domains.** Put an app at a domain you own, and give every anonymous visitor their own private data instead of one shared pool. See [Custom domains](../capabilities/custom-domains).
- **External files.** Store app-owned files, show remote images from exact allowed origins, and call public APIs from backend routes. See [External images](../capabilities/external-images) and [External files and CSP](../technical-reference/external-files-and-csp).

## The model

```mermaid
flowchart TD
  A[Tell your agent what to build] --> B[Your agent creates the app]
  B --> C[Charming hosts it]
  C --> D["Your app gets a URL, storage,<br/>identity, and an API/MCP surface"]
  D -->|ask for changes| A
  D --> E["Share it with a friend<br/>and their agent"]
```

## Related

- [Docs home](..)
- [Where your apps live](where-your-apps-live)
- [Data storage](../capabilities/data-storage)
- [llms-full.txt](https://charm.ing/docs/llms-full.txt)

Found a bug or need a feature? [Tell us](/docs/capabilities/feedback) with `submit_feedback` or `POST /app/{id}/feedback`. Your feedback shapes what we build next.
