# Owner access after a browser deploy

When you deploy from Quickback Start's **Deploy to Cloudflare** card, the very
first deploy seeds your app's first administrator (`user.role === "sysadmin"`),
a first organization they own, and a password. The card shows the **email**, a
**click-to-reveal password**, and a normal link to your app's Account login:

```
https://<your-app>.<subdomain>.workers.dev/account/login
```

Sign in with that email and password. That's the whole setup. After sign-in,
`/cms/` opens because the seeded role is `sysadmin` — the CMS data-plane tier,
one above `appmanager`.

## What you get

- **Shown once.** The plaintext password is returned to Start on the deploy
  that created the admin, and again only if you explicitly reset it. Quickback
  stores the hash in your app's auth database, never the password.
- **A first organization.** The deploy also inserts an organization named after
  your Worker and seats the admin as `owner`, so org-scoped tables and the CMS
  tenant picker have somewhere to land. A routine redeploy does not create a
  second one. If the compiled config sets `features.pinnedOrganizationId`, that
  string **is** the organization id — the pin and the AUTH_DB row match, the
  CMS skips the tenant picker, and the seeded sysadmin is `owner` of that org
  (so create/update/delete in the CMS actually work). Without a pin the id is
  a random hex.
- **Your app's login.** After that reveal you sign in through **your app's
  own auth** — the same email + password login every other user of your app
  gets. If your app has the Account UI enabled, that's `/account/login`.
- **A public URL, not a secret.** The login link is an ordinary
  `<a href="…/account/login">`. It does not carry a token. Anyone can open
  the page; only the password signs you in.

The synthetic email looks like `owner@<your-app>.invalid`. Type it exactly as
shown next to the password.

## Signing up yourself doesn't make you an admin

`/account/signup` creates an ordinary user. It never sets
`role === "sysadmin"`, so that account can't open `/cms/`. The seeded
admin is the only path to the first administrator.

No confirmation email is sent, either — apps built from Start default to email
and password with verification off, because a `workers.dev` deploy has no
verified sending domain. If you're waiting on a signup email, nothing is
coming; use the credentials on the deploy card.

**Quickback is not your app's identity provider.** The password reveal is a
bootstrap window, not a login method: once you've signed in (or reset), your
app has no runtime dependency on Quickback or the deploy broker for
authentication.

## Lost access? Reset from Start

Deployed apps on `workers.dev` can't send password-reset email, so your
Cloudflare account is the recovery root: in the deploy card (or the chip above
the composer), **Reset admin password** writes a new hash and shows a fresh
password once — authorized by the same Cloudflare connection that deployed
the app.

A routine redeploy does **not** re-surface credentials. Only an explicit
reset does.

## For CLI deploys

Browser deploys seed the admin automatically. Apps deployed with
`quickback deploy` don't; create your admin through your own flow, or deploy
once through Start to bootstrap. The generated `/__quickback/claim` route
still exists for older apps and answers 404 unless a leftover
`QUICKBACK_CLAIM_KEY` Worker secret is set — new deploys do not set it.
