Every link you share lands someone on a decision: do they get in, or do they see a door? This is the full reference — every access state, every control, Clone vs Remix, the pill, all of it.
When someone follows your link, the platform resolves one state. Here's all of them.
| state | what it means | what they see |
|---|---|---|
owner | It's their thing | Full controls — Edit, Share, Update |
granted-access.editor | Approved as editor | App loads, can comment |
granted-access.viewer | Approved as viewer | App loads, read-only |
granted-access.submitter | Approved as submitter | App loads, submitter-level interaction |
public-access | Public sharing is on; no personal grant | App loads as anonymous viewer |
accepted-email-invite | Redeemed an email invite link | App loads, treated as editor |
req-login.request | Private; visitor is logged out | Landing card: Fresh Install + Request access |
req-login.invite | Has a pending invite; not logged in | Landing card: Fresh Install + Join collab |
req-login.auto-join | Auto-approve is on; visitor not logged in | Landing card: Fresh Install + Join collab |
pending-request | Request submitted; owner hasn't approved yet | Landing card: button disabled → "Requested" |
revoked-access | Had access; it was revoked | Landing card: button disabled → "Revoked" |
not-found | Doesn't exist, or no grant on a private thing | "App not available" |
not-grant | Exists but this visitor has no grant | Same as not-found |
A centered card over a grid background. App title, screenshot if one exists, two buttons side by side.
They don't have access. Instead of the app, they see a card: the thing's title, a screenshot if one's been generated, and two buttons. No blank error page. Always the card.
Fresh Install — makes their own copy, running with their own data. They never touch yours.
Request access / Join collab — asks to join yours. Label changes by state. "Requested" or "Revoked" means it's disabled.
Fresh Install Request access
If they're not signed in and click either button, the URL gets
?intent=install or ?intent=join,
a login screen appears, and the action fires automatically after sign-in.
No lost clicks.
These live in the Share panel (bottom-right pill → Community button) and in App Settings → Sharing. Same data, both places.
On: anyone gets in as an anonymous viewer. No account, no request, no door at all.
Off (default): visitors without a grant need either an invite or Requests to be enabled. Otherwise they get "App not available" — no landing card, no door.
Off (default): visitors with no grant see "App not available" — the landing card with Request access only exists when this is on.
On: visitors can knock. A live badge count appears on your Share button as requests come in. Auto-approve option: pick a role (viewer or editor) and every incoming request gets approved automatically — no individual approvals needed.
Type an email, click Editor or Viewer. They get a one-time token link by email.
Logged in when they open it → app loads immediately. Logged out → sign in, app opens. Invite list shows pending / accepted / revoked with per-invite role toggle and revoke action.
"Only collaborators can comment" — off by default. Off means members (editors, viewers, owner) can post and delete. Public visitors on a public app are not members and cannot comment even with this off. On means editors and owner only.
Enforced server-side. The composer is also hidden client-side for viewers and anonymous users as a prefetch UX.
Both create a new copy under your account. One flag changes where you land.
Skips the editor entirely. Your copy goes straight to production. You land at /vibe/yourname/appname — the live app, running with your data.
This is also what Fresh Install does from the landing card.
Opens the builder with ?view=code. Your copy starts in dev mode. You land in the editor, ready to change the source.
Same fork under the hood — one flag (skipChat) decides where you land.
Editor and Viewer are what you assign. Submitter exists in the code but no current control exposes it.
Can interact with the app and write to its databases. The thing responds to them the way it responds to you.
Can see and use the app. Writes to the app's databases may be restricted depending on how the app's database access rules are configured.
Present in the type system and grant enum. Intended for form-submit or write-limited workflows — add data, can't read existing records. No control exposes it currently.
Bottom-right of any /vibe/ page, after the app loads. Expands to three buttons.
Home opens vibes.diy. Community opens the Share panel. Vibe opens a vertical submenu. Badge on Community (owner only): live count of pending access requests. Dot to the left of the pill (owner only): you have unpublished changes.
| option | who sees it | what it does |
|---|---|---|
| Edit | Owner only | Opens the builder at /chat/ |
| Clone | Everyone | Copies the thing, skips the editor — lands you in the live app |
| Remix | Everyone | Copies the thing, opens the editor ready to change things |
The sharing system is how your thing becomes their thing — or stays yours. Build it on Vibes DIY.