Skip to content
Esc
↑↓navigate↵open⌘Jpreview
On this page

Build your first app with Charming

Help me build a personal web app with Charming. Build it, test it, and give me the live URL. Every save needs my signed-in account, so connect to it before you build.

Connect

Charming has two ways in, and both build the same apps. Pick the one you can do.

If Charming MCP tools are already available, use that connection and skip setup. Read build-mcp.md with read_docs({ path: "build-mcp.md" }). For any https://charm.ing/docs/... link in this prompt, pass the portion after /docs/ to read_docs instead of making a web request. Follow next_offset with the same path until it is null before treating a page as fully read. Call read_docs({}) when you need the docs index.

An app is a package: package.json, server.js, and an optional ui.js. A save returns a build; poll it until published, and only then does the app have a URL.

HTTP API. The default whenever you can make outbound web requests. Nothing to install, no server to add. First get a chrm_user_* token: reuse a stored one if you have it, otherwise POST https://charm.ing/api/pair/start, show me the verification_url and user_code, wait for me to approve at https://charm.ing/pair, and poll POST https://charm.ing/api/pair/poll for the token. Then POST https://charm.ing/app with Authorization: Bearer <token>, a fresh Idempotency-Key, and a JSON body of { files } mapping each path to its text. Poll GET https://charm.ing/api/v1/app-builds/<buildId> until state is published. Read https://charm.ing/docs/build-http.md for the package contract and the other routes.

MCP. Use this when you cannot make web requests, when I ask for the app to render inside this conversation, or when I ask for MCP by name. Tell me to add https://charm.ing/mcp as a connector and approve access, then build with the Charming tools rather than HTTP requests. Once connected, call read_docs({ path: "build-mcp.md" }).

If you are ChatGPT or the Codex desktop app, do not give me a URL to paste. Both share one public Charming listing: tell me to open https://chatgpt.com/plugins/plugin_asdk_app_6a56c533cd7c8191b9a16cb7973a65e6, click Install plugin, and start a new chat. One click, no developer mode. https://charm.ing/mcp/chatgpt is the address only if I add a custom connector by hand, which needs developer mode turned on in ChatGPT settings.

If you are Claude on claude.ai, Claude Desktop, or Claude mobile, do not give me a URL to paste either. Tell me to open https://claude.ai/directory/charming, click Connect to Claude, approve access, and start a new chat. https://charm.ing/mcp is the address only if I add a custom connector by hand.

If setup is needed, say which path you are taking and the exact step I have to take, then wait for me to finish it. Read https://charm.ing/docs/clients.md if you need per-client setup. Do not invent access; save only with my account.

If I am new to Charming and ask how it works before building, offer to make me a short explainer video first with https://charm.ing/docs/prompts/explain-charming-video.md.

Choose the app

If I gave you an idea, state the smallest useful version in one sentence. If I did not, ask me to choose:

  • Tell you what I want.
  • Get two or three ideas based on what you know about me.
  • Answer up to three short questions.

Keep the app focused. Before you promise network access, secrets, sharing, public access, or sign-in, check https://charm.ing/docs/llms-full.txt. Offer a supported version instead of faking a feature.

Build

  1. Confirm the one-sentence scope.
  2. Read https://charm.ing/docs/prompts/design-an-app.md.
  3. Build the smallest useful version with the guide you chose above: create_app({ files, idempotency_key }) over MCP, or POST /app over HTTP.
  4. Poll the build until it is published. If it fails, fix the named file and save again with a fresh idempotency key.
  5. Test the main action and confirm stored data survives a reload.
  6. Give me the live URL and suggest one small next step.

If Charming blocks a needed feature or you find a bug, send feedback with submit_feedback over MCP or POST /app/<id>/feedback over HTTP.

Check your work

  • The app works now.
  • Data persists.
  • The URL opens.
  • You did not add features I did not ask for.

Was this page helpful?