Deploy client sites
Give each client a private URL, a custom domain, and access that expires on its own.
You're delivering a landing page, or any small site, to a client. The site is built, and you need it live under a clean URL by tomorrow morning without sharing your dev environment.
Prerequisites
- A built static site in a directory (
./dist,./build, ...). - The CLI installed and signed in.
- Optionally, a custom domain and access to its DNS. The free tier works for review-only URLs, and the Business plan adds custom domains.
1. Create an app per client
One app per client keeps URLs clean and keeps each client's access separate:
vibehost app create acme-landing
vibehost link --app acme-landing
vibehost deploy ./distThe URL is https://acme-landing-yourws.vibehost.space. That's clean enough for an internal review. For the final delivery, add a custom domain in step 3.
2. Lock down access
Don't make work in progress public. There are two ways to share it:
This suits repeated review cycles, because you can see who opened the URL and when.
vibehost app visibility acme-landing private
vibehost app grants add-email sarah@acmecorp.com viewer --app acme-landing
vibehost app grants add-email tom@acmecorp.com viewer --app acme-landingA visitor who opens the URL is sent to vibehost.com/login to sign in with Google or email, and then sees the site. Later visits skip the sign-in because of the session cookie.
This suits one-off pitches. The client opens a link and doesn't have to sign in.
vibehost app visibility acme-landing private
vibehost app share-link create --app acme-landing \
--label "Acme Q2 pitch" \
--expires-in 30dThe printed ?__vh_share=... URL is what you send to the client. The first click sets a cookie and redirects to the same URL without the token; the cookie satisfies the gate for that browser until you revoke or 30 days pass.
Mint a separate share link per recipient if you want per-person revoke control.
3. Add a custom domain
This step is optional, but most clients expect it.
vibehost domain add www.acmecorp.com --app acme-landingThe CLI prints the DNS record to add. Set it at the client's DNS provider, or at yours if you're hosting. After DNS propagates, which takes about 5 to 15 minutes for a first record, verify the domain:
vibehost domain verify www.acmecorp.com --app acme-landingvibehost domain list shows the hostname as pending until it verifies, then verified. Once DNS is in place, that usually takes under 5 minutes.
For apex domains (acmecorp.com without www), see the apex domain section.
4. Iterate
The client asks, "can you make the headline bigger and the CTA red?" You make the change locally and deploy:
vibehost deployThe URL stays the same, so the client refreshes and sees the new version. The previous deployment isn't deleted, which helps when the client wants to go back.
Or roll back to the previous deploy:
vibehost rollback --app acme-landing5. Wrap up
Once the client signs off, you can hand the site over or keep hosting it:
If the client wants to own the deployment from now on, move it to their workspace:
- Create a workspace in the client's name (have them sign up at
vibehost.com). - They invite you to it temporarily.
- You re-deploy under their workspace:
vibehost --workspace acme app create acme-landing vibehost --workspace acme deploy ./dist - They take over the custom domain by running
domain addagain under their workspace and verifying it again. - You remove yourself from their workspace.
There's no in-place "transfer app" yet. It's planned, and until then this manual flow works.
Keep the app in your workspace and bill the client a hosting retainer.
One workspace covers all your client projects, so you don't pay $20 per client. The Business plan price is per workspace, not per app.
Auto-revoke the client's share link after the post-launch review period:
vibehost app share-link ls --app acme-landing
vibehost app share-link revoke <id> --app acme-landingPattern: many small client sites
A sales team might run dozens of proposal apps (acme-proposal-site, globex-pitch-v2, initech-proposal, ...). Each one is a page branded for one client and one meeting.
For each pitch, run:
vibehost app create acme-pitch
vibehost deploy ./dist --app acme-pitch
vibehost app share-link create --app acme-pitch --expires-in 14d --label "Acme pitch — Mar 2026"After the pitch, revoke the share link:
vibehost app share-link revoke <id> --app acme-pitchOptionally keep the app for portfolio reference, or delete it outright with vibehost app delete acme-pitch --force.
The free tier allows 100 apps per workspace, which is enough for most agencies.
See also
- Custom domains covers apex domains, DNS providers, and troubleshooting.
- Share links walks through three more scenarios.
- Grants and visibility explains the access model.