Deploy Local Projects
Deploy any local project to your server with a single click.
Quick Deploy
- Open the Projects tab
- Find your project
- Click Deploy to Cloud
- Configure the deployment
- Click Deploy
Deployment Configuration
Subdomain
Choose a subdomain for your deployment:
- Must be unique among your deployments
- Same rules as tunnel subdomains
- Example:
myapp→myapp.hosted.yourdomain.com
Dockerfile
Expose can:
Use Existing Dockerfile If your project has a Dockerfile, Expose uses it as-is.
Generate Dockerfile If no Dockerfile exists, Expose generates one based on your framework:
# Generated for FastAPIFROM python:3.12-slimWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . .EXPOSE 8000CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]You can edit the generated Dockerfile before deploying.
Environment Variables
Add configuration:
| Variable | Value |
|---|---|
| DATABASE_URL | postgres://... |
| SECRET_KEY | your-secret |
Variables are:
- Encrypted in the database
- Available during build (ARG)
- Available at runtime (ENV)
Supported Frameworks
Node.js
| Framework | Dockerfile Strategy |
|---|---|
| Next.js | Multi-stage build, standalone output |
| Nuxt | Multi-stage build |
| Vite/React/Vue | Build to static, nginx serve |
| Express | Node runtime, npm start |
| NestJS | Multi-stage, dist output |
Python
| Framework | Dockerfile Strategy |
|---|---|
| FastAPI | Python slim, uvicorn |
| Django | Python, gunicorn, collectstatic |
| Flask | Python, gunicorn |
| Streamlit | Python, streamlit run |
Go
All Go frameworks use multi-stage builds:
- Build with
golang:1.22 - Run on
scratchoralpine
Rust
Multi-stage build:
- Build with
rust:1.77 - Run on
debian:bookworm-slim
Source Packaging
When you deploy, Expose:
- Creates a tar.gz of your project
- Respects
.dockerignore(or uses sensible defaults) - Uploads to the server
- Extracts and builds
Default Ignores
If no .dockerignore exists:
node_modules/.next/dist/.env*
# Python__pycache__/.venv/venv/.env*
# General.git/.DS_Store*.swpCustom .dockerignore
Create a .dockerignore for fine-grained control:
# Ignore test filestests/*.test.js
# Ignore dev configs.eslintrc.prettierrc
# Keep .env.example!.env.exampleDeployment Progress
Watch the deployment process:
- Packaging — Creating archive
- Uploading — Sending to server
- Building — Docker build running
- Pushing — Storing image in registry
- Starting — Running container
- Running — Deployment complete
After Deployment
Once deployed:
- View at
https://subdomain.hosted.yourdomain.com - Check logs in the macOS app
- Monitor in the dashboard
Updating
To deploy changes:
- Make changes locally
- Go to the deployment
- Click Redeploy
- New build starts
Or use Git deployment with webhooks for automatic updates.
Tips
Test Locally First
# Build the Dockerfile locallydocker build -t myapp .
# Run and testdocker run -p 3000:3000 myappUse .dockerignore
Smaller archives = faster uploads and builds.
Set PORT Environment Variable
Many frameworks read PORT. Expose sets it automatically, but you can override it in environment variables.