Deploy Fireproof Connect to exe.dev as your personal sync backend. Your Studio VM runs the full Fireproof sync stack and can be used by multiple apps.
Prerequisites
- SSH key in
~/.ssh/ (id_ed25519, id_rsa, or id_ecdsa) - exe.dev account - run
ssh exe.dev once to create your account - Clerk credentials from [clerk.com](https://clerk.com):
- Publishable Key (pk_test_... or pk_live_...)
- Secret Key (sk_test_... or sk_live_...)
Gather Config
Use AskUserQuestion to collect deployment config before running the deploy script.
```
Question 1: "What codename for your Studio? (becomes .exe.xyz)"
Header: "Studio"
Options: Suggest "${username}-studio" + user enters via "Other"
Question 2: "Do you have your Clerk keys ready?"
Header: "Clerk"
Options: ["Yes, I have them", "No, I need to get them first"]
```
If user needs Clerk keys, provide these instructions:
- Go to [clerk.com](https://clerk.com) and sign in
- Select your application (or create one)
- Go to API Keys in the sidebar
- Copy both the Publishable Key and Secret Key
After receiving the codename, ask for the keys:
```
Question: "Paste your Clerk Publishable Key (starts with pk_test_ or pk_live_)"
Header: "Publishable"
Options: [User enters via "Other"]
Question: "Paste your Clerk Secret Key (starts with sk_test_ or sk_live_)"
Header: "Secret"
Options: [User enters via "Other"]
```
Deploy Command
```bash
cd "${CLAUDE_PLUGIN_ROOT}/scripts" && [ -d node_modules ] || npm install
node "${CLAUDE_PLUGIN_ROOT}/scripts/deploy-connect.js" \
--studio \
--clerk-publishable-key "pk_test_..." \
--clerk-secret-key "sk_test_..."
```
What It Does
- SSH to
.exe.xyz - Creates VM if needed - Clone fireproof repo -
selem/docker-for-all branch to /opt/fireproof - Generate security tokens - Session tokens and device CA keys
- Create
.env - All credentials for Docker services - Run
./docker/start.sh - Starts the full Fireproof stack - Wait for services - Confirms port 8080 is responding
- Write local
.connect - Saves studio info for future reference
Architecture
```
Studio VM (.exe.xyz)
βββ /opt/fireproof/
β βββ docker-compose.yaml (from repo)
β βββ docker/
β β βββ nginx.conf (routes all traffic)
β β βββ start.sh (orchestrates services)
β βββ .env (generated credentials)
βββ Docker services (port 8080 exposed)
βββ nginx proxy
βββ dashboard (internal 7370)
βββ cloud-backend (internal 8909)
```
Public URLs
After deployment, your Studio exposes:
| Endpoint | URL | Purpose |
|----------|-----|---------|
| Token API | https://.exe.xyz/api | Token issuance for auth |
| Cloud Sync | fpcloud://.exe.xyz?protocol=wss | Real-time sync |
Local `.connect` File
The deploy script creates a .connect file in your project:
```
studio:
api_url: https://.exe.xyz/api
cloud_url: fpcloud://.exe.xyz?protocol=wss
clerk_publishable_key: pk_test_...
```
This file is gitignored and used to auto-configure app deployments.
Update Your App's Environment
After deploying Connect, update your app's .env:
```bash
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
VITE_API_URL=https://.exe.xyz/api
VITE_CLOUD_URL=fpcloud://.exe.xyz?protocol=wss
```
Troubleshooting
Check Docker status:
```bash
ssh .exe.xyz "cd /opt/fireproof && sudo docker compose ps"
```
View logs:
```bash
ssh .exe.xyz "cd /opt/fireproof && sudo docker compose logs -f"
```
Restart services:
```bash
ssh .exe.xyz "cd /opt/fireproof && sudo docker compose restart"
```
CLI Options
| Option | Description |
|--------|-------------|
| --studio | Studio VM name (required) |
| --clerk-publishable-key | Clerk publishable key (required) |
| --clerk-secret-key | Clerk secret key (required) |
| --dry-run | Show what would be done without executing |
---
What's Next?
After successful deployment, present these options using AskUserQuestion:
```
Question: "Your Connect Studio is live at https://${studio}.exe.xyz! What's next?"
Header: "Next"
Options:
- Label: "Deploy an app that uses this Studio"
Description: "Generate and deploy a Vibes app configured to sync through your Studio. I'll set up the environment automatically."
- Label: "Update an existing app to use Connect"
Description: "Configure an existing app's .env to point to your new Studio for cloud sync."
- Label: "I'm done for now"
Description: "Your Studio is running 24/7 on exe.dev. Any app configured with these URLs will sync through it."
```