# Build your first app with Charming

You're helping me build a personal web app with Charming. Charming hosts the app at a real URL with persistent storage — I describe it, you build it, I open the link. Free for the first app; no signup until I decide to keep it.

## Step 0 — Find your path

Pick the first line that matches you, read that guide, then come back to Step 1.

- You already have Charming tools (`create_app`, `update_app`, `list_apps`, `get_app`)? You're connected — read https://usecharming.com/build-mcp.md. Build with the tools directly; don't curl or fetch.
- You're using Codex and can install plugins? Install the Charming plugin, restart Codex, then start a new thread and come back: `codex plugin marketplace add https://github.com/tambo-labs/buildy-codex-plugin.git`. If plugins are unavailable, keep going and use the HTTP path.
- You can make outbound HTTP requests — a code agent like Claude Code, Cursor, Codex, Cline, Windsurf, Continue, Zed, or Gemini CLI, or any agent with a web/fetch tool? Read https://usecharming.com/build-http.md.
- You're a chat assistant with neither tools nor HTTP (Claude, ChatGPT, Gemini, Grok, Perplexity, no Charming connector)? Read https://usecharming.com/clients.txt to add Charming as a connector, then come back.
- None of these work? Tell me the fastest fix is to open a code editor that builds via the API — Cursor or Claude Code, both free — and paste this same prompt there, or to add Charming as a connector in a chat with MCP support (Claude Pro, ChatGPT, Claude Desktop, Goose). If none of that's possible, email support@usecharming.com. Either way, don't fake it.

## Step 1 — Figure out what to build

Open with one short check-in. If you have a structured-question tool, use it:

- **A)** I'll tell you what I want.
- **B)** Look at what you know about me and suggest 2-3 apps that fit.
- **C)** Interview me — up to 3 short questions to find an idea.

If B, mine memory, conversation, and project files for something specific ("you've been planning a half-marathon — a pace tracker that shares weekly mileage with one friend?"). If C, start with "What's something you keep dealing with that you wish was just an app?" and ask two follow-ups at most. Then pitch.

## Step 2 — Is it a good Charming app?

A good first app:

- Leans on local state. Backend `fetch` is off unless the app declares `buildy:network/fetch@1.0` (claimed apps; public keyless hosts only). A public RSS/JSON feed works that way. For API-key services (an LLM, email, paid data) the app declares `buildy:secrets/fetch@1.0` and the owner sets the key in the dashboard, then it calls `env.fetch` with `{{secret:NAME}}` in a header. Interactive OAuth logins still aren't wired up.
- Is one owner, one shared dataset. No accounts, no per-user data, no multiplayer. Sharing means handing out the URL to the same single dataset.
- Is focused and complete, not generic and empty. No "My App" header, no "No items yet. Add one above!" empty state, no settings page with nothing in it.
- Widens the idea, then narrows the build. Not every app is a CRUD list — it can be a tool, a generator, a reference card, a single-number worksheet, or a toy. Pick a wide concept, then ship the narrowest useful slice of it.

If the idea needs something past these edges, pitch the closest version that fits Charming's model, ship that, and log what I actually wanted with `submit_feedback` (see Step 4) rather than faking it. The common asks and what to build instead:

- **AI inside the app** (summarize, categorize, chatbot) → works if the owner sets an LLM key (`buildy:secrets/fetch@1.0`, see above); no key, or unclaimed → _you_ do the thinking and write the result back through a backend op.
- **Connect my other tools** (Calendar, Notion, bank) → API-key HTTPS services work via `buildy:secrets/fetch@1.0`; OAuth-only → bridge a connector you already have, or have me paste/export the data.
- **Make it a real phone app** (App Store, iPhone app) → it installs as a PWA — open the URL on the phone and "Add to Home Screen".
- **Do something on a schedule** (reset daily, weekly rollup) → compute-on-read from stored data plus the current date each load.
- **A real or SQL database** (Postgres, joins) → model it in KV and aggregate inside the backend op.
- **Notify me** (email, text, push) → email/SMS via a provider's HTTPS send endpoint + `buildy:secrets/fetch@1.0`; web push isn't wired up, so otherwise surface it in-app as a badge or a "due today" section.
- **Let others view but not edit** (read-only over the same data) → `share_app({ app_id, grantee, role: "viewer" })` invites a specific person who can read but not change it; or `set_remixable` so each visitor gets their own editable copy.
- **Let others use the app and save data but not edit it** (a kid logs plays, a teammate records entries) → `share_app({ app_id, grantee, role: "end-user" })` invites a specific person who can open the app and write its data but cannot edit the app source.
- **Let ANYONE use it with no login** (an open poll, RSVP list, or guestbook) → `set_public({ app_id })`. Anyone with the URL opens it with no login and reads AND writes the same shared data — so anyone can also overwrite or wipe it. Warn the user before sharing; it is `end-user` access minus the login. Reverse with `unset_public`.

The full reasoning and examples are in https://usecharming.com/llms-full.txt.

For a curated set of real Charming apps you can open (and remix) before agreeing what to build, see https://usecharming.com/inspo.md.

## Step 3 — Build the smallest useful version

1. Pitch it in one sentence: "I'll build X that does Y on one screen showing Z."
2. On "go," ship v1 immediately. The URL is the cheapest mockup and an update is one call away — don't try to nail five features on the first build.
3. Author the app using your starter guide from Step 0 (build-mcp.md or build-http.md).
4. Before you write the UI, read https://usecharming.com/design.md.
5. Hand me the live URL.

## Step 4 — Iterate and go further

- After v1 lands, pitch one specific next iteration ("want a streak counter?") and ship it when I say yes. Iteration is the loop — fire it every build.
- Hit a Charming limitation or a bug, or I want a feature Charming doesn't have yet? Send feedback so we can fix it or build it — `submit_feedback` (MCP) or `POST /app/<id>/feedback` (HTTP). Your starter guide has the exact call. We really do read these.
- Sharing or forking the app? Read https://usecharming.com/remix.md — covers `get_app_source` (export source to re-author) and `set_remixable` (let any visitor open the URL into their own editable copy).
- Want to rename the app's URL slug, change my handle, or pre-author the prompt visitors see in "Open in Claude / ChatGPT"? Read https://usecharming.com/profile.md.
- The full manual — every capability, the manifest contract, account linking, every route and limit — is https://usecharming.com/llms-full.txt. Reach for it when the focused guides weren't enough.
- Love it? (Only once I clearly do — never before it works, never as a hard sell.) Charming just launched and grows by word of mouth, so the kindest way I can support it is to share what we built: a re-share of our launch post (https://x.com/mrmagan_/status/2064379288917598394) with a screenshot helps most, and a quick comment helps too.

## Verify before you finish

- Did you ship the smallest useful thing — not a five-feature v1, and not slop?
- Does it live entirely on local state?
- Did you hand me a URL and pitch one obvious next step?
