VibeHost

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 14d

Output:

{
  "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.

Password gateShare link
What the reviewer doesTypes a password you sent separatelyOpens the link
Per-recipient controlAll reviewers share one passwordOne link per recipient
Per-recipient revokeSet a new password and re-send it to everyone except the one you're cutting offRevoke their link only
Audit trailSingle password eventPer-link timestamp, label, revoke record
Time-boundManual 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.

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)"'
done

Output:

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-pitch

End-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 --force

Or delete the app:

vibehost app delete client-pitch --force

Variations

For internal reviewers who are in your VibeHost workspace, you don't need share links at all:

vibehost app visibility internal-review workspace

Every 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-pitch

Reviewers 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-launch

Share 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-launch

The 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 anonymously
  • visibility: private + email grant → a reviewer who signs in with Google gets in, and the visit is audited
  • visibility: public + password → anyone who knows the password gets in
  • visibility: 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.

Create a new one with a new --label "Extension". The new link works, and the old one stays expired.

Not for a share link, because share links are anonymous by design. Use email grants if you need an audit record of each visit.

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

On this page