# Local loop (Draft first; Hosting later)

Atrium app developer spec, section 10: Local loop (Draft first; Hosting later).

This is the default local path from **Default builder workflow**. Stay here until the app works in COHO. Only then convert to Hosted (§5.5) or a lasting self-host Base URL.

**Preferred (Draft key first):**

1. In a feature-flagged Store org, register a **Draft** app (name only). Copy the one-time API key, signing secret, API base URL, connection reference, and setup secret.
2. Build your app against that Public API key (no temporary org key).
3. Serve `/health` and the lifecycle paths locally with `ATRIUM_SETUP_SECRET` set to the copied setup secret; expose HTTPS if the API cannot reach localhost (tunnel).
4. On **My apps**, set the Base URL to activate — COHO POSTs `lifecycle.setup` (signed with your setup secret) with the same credentials; persist the signing secret if your process did not already hold it.
5. Confirm health, a test event or a real `tenancy.started`, logs in the Store, then disconnect when done.
6. Before you ask for a public listing, take a screenshot of your main screen (see "Your Store card" in section 6).
7. When ready for Atrium Hosting: pick public GitHub, private GitHub (Connect + Selected repos + paste the repo URL), or zip (§5.5), and follow the Dockerfile contract (§5.6).

**Classic (URL first):**

1. Serve your app on localhost with `/health` and the lifecycle paths.
2. Expose HTTPS if the API cannot reach localhost (tunnel).
3. Register a **private** external app: name + base URL + manifest. Copy the one-time setup secret and restart your app with it as `ATRIUM_SETUP_SECRET`.
4. Connect — you must receive `lifecycle.setup` and persist secrets.
5. Confirm health, a test event or a real `tenancy.started`, logs in the Store, then disconnect.
