Share private deploys with expiring links
Keep the app private and send a share link that expires on its own. Reviewers don't need to sign up.
You want non-technical reviewers to see an app. They might be clients, prospects, journalists, or colleagues outside your VibeHost workspace. You don't want to create accounts for them, and you don't want the URL to stay open forever.
Make the app private and send a share link with --expires.
The recipe
First lock the app down, then create a share link that expires:
vibehost app visibility client-pitch private
vibehost app share-link create --app client-pitch \
--label "Acme review — Q2 2026" \
--expires-in 14dOutput:
{
"ok": true,
"data": {
"id": "qk8m2n4p6r0s3t7u9v1w5x2y",
"url": "https://client-pitch-yourws.vibehost.space/?__vh_share=vhs_Kx8pQ3nR7tKvL9mX4wZ6yB1cD5fH0jN8",
"token": "vhs_Kx8pQ3nR7tKvL9mX4wZ6yB1cD5fH0jN8",
"tokenPrefix": "vhs_Kx8pQ3nR",
"label": "Acme review — Q2 2026",
"expiresAt": "2026-06-06T08:00:00Z"
}
}Send data.url to the reviewer. The first click sets a cookie and redirects to the same URL with the __vh_share token stripped off; the cookie satisfies the gate for that browser. After 14 days the token and the cookie both stop working, and the reviewer sees the private app's request-access page.
Share links compared with a password gate
| Password gate | Share link | |
|---|---|---|
| What the reviewer does | Types a password you sent separately | Opens the link |
| Per-recipient control | All reviewers share one password | One link per recipient |
| Per-recipient revoke | Set a new password and re-send it to everyone except the one you're cutting off | Revoke their link only |
| Audit trail | Single password event | Per-link timestamp, label, revoke record |
| Time-bound | Manual password clear | --expires-in auto-revokes |
Use a password gate for a broad soft launch, with the password in the announcement. Use share links for previews sent to specific people.
One link per recipient
We recommend a separate link for each reviewer:
for LABEL in "Acme review" "BetaCorp review" "Gamma Inc review"; do
vibehost app share-link create \
--app client-pitch \
--label "$LABEL" \
--expires-in 14d \
--json | jq -r '.data | "\(.label): \(.url)"'
doneOutput:
Acme review: https://client-pitch-yourws.vibehost.space/?__vh_share=vhs_Kx8p...
BetaCorp review: https://client-pitch-yourws.vibehost.space/?__vh_share=vhs_9tRm...
Gamma Inc review: https://client-pitch-yourws.vibehost.space/?__vh_share=vhs_2wZy...Email each link to the right recipient. If Acme forwards their link to someone else, revoke Acme's link only, and BetaCorp and Gamma keep working.
revoke matches on the token prefix, so the prefix is enough:
vibehost app share-link revoke vhs_abc --app client-pitchEnd-of-project cleanup
After the project ends, revoke every link at once:
vibehost app share-link ls --app client-pitch --json | \
jq -r '.data[] | select(.revokedAt == null) | .id' | \
xargs -I{} vibehost app share-link revoke {} --app client-pitch --forceOr delete the app:
vibehost app delete client-pitch --forceVariations
For internal reviewers who are in your VibeHost workspace, you don't need share links at all:
vibehost app visibility internal-review workspaceEvery workspace member can view it without an invite, a link, or a password.
When you want an audit trail of who opened the app and when, rather than anonymous access for anyone with the link:
vibehost app visibility client-pitch private
vibehost app grants add-email sarah@acme.com viewer --app client-pitch
vibehost app grants add-email tom@acme.com viewer --app client-pitchReviewers open the regular URL, sign in with Google, and see the app. Each visit logs actor=sarah@acme.com in the audit log.
The reviewer needs a Google account, or has to sign up with email. That's more work for them, and in return you know who looked.
For a public launch behind a soft password gate, where anyone can find the URL but only people with the password can view it:
vibehost app visibility soft-launch public
vibehost app password set "shipmate-2026" --app soft-launchShare the URL and password in your launch email, on Twitter, or on Discord.
When you're ready to remove the gate:
vibehost app password clear --app soft-launchThe app is then public, with no password and no sign-in.
Combining gates
Active gates AND-compose. Each one adds to the others instead of replacing them. You can combine:
visibility: private+ share link → a reviewer with the link gets in anonymouslyvisibility: private+ email grant → a reviewer who signs in with Google gets in, and the visit is auditedvisibility: public+ password → anyone who knows the password gets invisibility: public+ password + share link → either correct password OR valid share link
Disabling one gate doesn't bypass the others. See grants and visibility for the full matrix.
Common questions
Can the reviewer leave comments on the page?
Yes, with comment mode. Turn it on with vibehost comments enable --app <name>, and signed-in reviewers can pin comments on the live page. Commenting needs an email grant or workspace membership: someone who got in through a share link or public visibility can view the page but not comment. vibehost comments pull fetches open feedback for you or your agent to work through.
What if the reviewer needs the link after it expires?
Create a new one with a new --label "Extension". The new link works, and the old one stays expired.
Can I see whether and when the reviewer opened the link?
Not for a share link, because share links are anonymous by design. Use email grants if you need an audit record of each visit.
Are share links searchable?
Not really, since they're long random tokens. In practice a link is as secret as the email or Slack channel you sent it in. Don't post share links publicly.
See also
- Share links is the full reference, including cookie behavior.
- Grants and visibility explains when to use which gate.
- Client delivery covers the whole process of delivering a site to a client.
- Does a reviewer need an account? answers the same question for Vercel, Netlify, Cloudflare Pages and GitHub Pages, quoted from their docs.
Build, deploy, and share with an agent
Your coding agent builds, deploys, and shares the app, with no person needed in between.
How to choose a static host by who reviews your work
Seven comparisons sorted by situation: who has to open the preview, whether a git repo exists, what a shared password costs, and which default you inherit.