All posts
exporeact-nativetutorialquickstart

Expo Web Preview URL in 2 Minutes (No Docker, No CI)

PreviewDrop Team·May 20, 2026·6 min read

Expo is the standard React Native framework in 2026. It handles iOS, Android, and web from a single codebase — but the web target has always been the odd one out when it comes to deployment. Vercel doesn't run Expo web. Netlify doesn't understand Metro bundler. And your team is stuck sharing screenshots in Slack while the Next.js squad across the room gets live preview URLs on every PR.

PreviewDrop fixes this. Two minutes from repo connection to a live, shareable URL for your Expo web build. No CI scripts. No Dockerfile. No manual npx expo export:web in a GitHub Action you have to maintain.

Why Expo web breaks most preview platforms

Expo web builds aren't standard static exports. The pipeline looks like this:

npx expo export:web
# Output: web-build/ directory with bundled JS, assets, and index.html

Most preview platforms expect one of two things: a static site generator output (Next.js, Gatsby, Astro) or a Dockerfile. Expo web gives you neither by default — it produces a web-build/ directory that needs a basic HTTP server to serve, not a full Node.js runtime.

You can wrap it in a Dockerfile:

FROM nginx:alpine
COPY web-build /usr/share/nginx/html
EXPOSE 80

But that's already more Docker than most React Native engineers want to think about. And it doesn't solve the problem of rebuilding on every push, routing traffic to the right container, posting a PR comment, or auto-expiring the preview when the branch merges.

Connect your Expo repo in 3 steps

Step 1 — Install the GitHub App. Authorize PreviewDrop on your Expo repo. No CLI required — the app handles webhook delivery and commit-status updates automatically.

Step 2 — Push a branch (or open a PR). That's it. PreviewDrop detects the Expo project from your app.json or app.config.js, determines the build plan automatically, and starts the deploy.

Step 3 — Share the URL. Within 60 seconds (warm redeploy), you get a live URL like https://abc123.previewdrop.dev. A PR comment lands automatically when you open a pull request. Your designer clicks it and sees the real web build — not a screenshot, not a localhost tunnel, not a staging server someone else is also using.

What PreviewDrop detects in your Expo project

When PreviewDrop scans your repo, it looks for these signals to identify an Expo web project:

  • app.json with expo key or expo in package.json dependencies
  • web property in app.json or app.config.js
  • expo-cli or expo in devDependencies

The build process installs Node.js, runs npm install, executes npx expo export:web, and serves the output automatically. The entire thing is automatic — you never write a line of infra configuration.

The Expo CLI integration

If you're iterating locally and want to push a preview without a Git commit, use the CLI:

# Install (one-time)
npm install -g previewdrop

# Deploy the current branch
previewdrop deploy --repo . --branch $(git branch --show-current)

# Watch live build logs
previewdrop logs --follow

The CLI is especially useful during design reviews. Your designer asks for a tweak, you make it locally, run previewdrop deploy, and 45 seconds later they have a fresh URL. No commit, no push, no CI waiting.

Performance on Expo web

Expo web builds benefit from the same build-cache optimization that speeds up every other framework on PreviewDrop. Here's what a typical warm redeploy looks like:

dependency install (cached)  ..  8s
expo export:web  ............. 24s
container start  .............  3s
stability poll  .............  12s
─────────────────────────────────
Total: ~47 seconds

Dependencies are cached across builds. Only the source code layer changes between pushes. For a large Expo project with heavy dependencies, consider adding a .dockerignore that excludes node_modules and .expo — the build cache handles the rest.

Password-protected client previews

One feature that matters specifically for Expo teams building client work: password-protected preview URLs. When you're showing an in-progress app to a client, you don't want the URL indexed or stumbled upon. PreviewDrop lets you set a per-preview password, and the URL auto-expires on a TTL you choose (1 hour to 7 days).

This replaces the "ngrok tunnel from my laptop with a prayer" workflow that most Expo agencies use today. Set the password, share the link, and it dies on schedule.

Start your first Expo preview

PreviewDrop is framework-agnostic by design, but Expo web is the stack we're most excited about — it's the most underserved by existing platforms, and the developer experience gap between Expo and Next.js teams should not exist in 2026.

Connect your Expo repo now — free tier includes 2 concurrent previews, no credit card, and your first live URL in under two minutes.

See also: How we deploy any framework in under 60 seconds · Pricing — flat, no usage billing · Expo docs — export:web

Ready to give every branch a live URL?

Free tier — 2 concurrent previews, no credit card required.

Start free