VibeHost

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 ./dist

URL: 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-landing

When 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.

Step 3 — Custom domain (optional but expected)

vibehost domain add www.acmecorp.com --app acme-landing

The 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-landing

Status 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 deploy

Same 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 deploy

Step 5 — Wrap up

Project's done. The client signed off. Two patterns:

The client wants to own the deployment going forward. Transfer:

  1. Create a workspace in the client's name (have them sign up at vibehost.com).
  2. They invite you to it temporarily.
  3. You re-deploy under their workspace:
    vibehost --workspace acme app create acme-landing
    vibehost --workspace acme deploy ./dist
  4. They take over the custom domain (re-domain add under their workspace, re-verify).
  5. 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-landing

Pattern: 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 --force

Free tier supports 100 apps per workspace. For most agencies that's enough headroom.

See also

On this page