Client delivery
Meeting tomorrow, deploy tonight. Per-client URL, time-bound, professional.
The scenario: you're delivering a landing page (or any small site) for a client. The site is built. You need it live under a clean URL by tomorrow morning, ideally without sharing your dev environment.
This recipe gets you there in 3–5 minutes per client.
Prerequisites
- A built static site in a directory (
./dist,./build, ...). - CLI installed + signed in.
- (Optional) Custom domain ready, DNS access. Free tier works for review-only URLs; Business plan unlocks custom domains.
Step 1 — Per-client app
One app per client keeps URLs clean and access boundaries tight:
vibehost app create acme-landing
vibehost link --app acme-landing
vibehost deploy ./distURL: https://acme-landing-yourws.vibehost.space. Clean enough for an internal review; for the final delivery, add a custom domain (Step 3).
Step 2 — Lock down access
Don't make the work-in-progress public. Two patterns:
Best for repeated review cycles — you can audit who opened the URL 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-landingWhen the URL is opened, the visitor is bounced to vibehost.com/login to sign in with Google or email. After auth, they see the site. Subsequent visits skip the gate via the session cookie.
Best for one-off pitches — zero friction for the client.
vibehost app visibility acme-landing private
vibehost app share-link create --app acme-landing \
--label "Acme Q2 pitch" \
--expires 30dThe printed _share/... URL is what you send to the client. First click sets a cookie; 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.
Step 3 — Custom domain (optional but expected)
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 yours, if you're hosting). After DNS propagates (~5–15 min for first record):
vibehost domain verify www.acmecorp.com --app acme-landingStatus moves through pending_verification → dns_verified → cert_provisioning → active. Total time: usually under 5 minutes after DNS is in place.
For apex domains (acmecorp.com without www), see the apex domain section.
Step 4 — Iterate
The client says "can you make the headline bigger and the CTA red?" You change locally:
vibehost deploySame URL. Client refreshes; sees the new version. The previous deployment is still reachable at its immutableUrl — useful for "before / after" comparison if the client wants to revert.
vibehost rollback --app acme-landing # back to the previous deployStep 5 — Wrap up
Project's done. The client signed off. Two patterns:
The client wants to own the deployment going forward. Transfer:
- 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 (re-
domain addunder their workspace, re-verify). - You remove yourself from their workspace.
(There's no in-place "transfer app" yet — coming, but this manual flow works.)
Keep the app in your workspace. Bill the client a hosting retainer.
One workspace covers all your client projects — not $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
Dcard's sales team runs ~40+ proposal apps (innisfree-proposal-site, lacoste-dcard-pitch-v2, settour-dcard-proposal, ...) — each a per-client custom-branded page for one meeting.
The pattern:
# Per pitch
vibehost app create acme-pitch
vibehost deploy ./dist --app acme-pitch
vibehost app share-link create --app acme-pitch --expires 14d --label "Acme pitch — Mar 2026"
# Cleanup after pitch
vibehost app share-link revoke <id> --app acme-pitch
# Optional: keep the app for portfolio reference
# vibehost app delete acme-pitch --forceFree tier supports 100 apps per workspace. For most agencies that's enough headroom.
See also
- Custom domains — apex, DNS providers, troubleshooting
- Share links — three more scenarios
- Grants and visibility — access model