Skip to main content

Render Deployment

Deploy ProjectAchilles to Render using the included Blueprint (render.yaml) or manual setup.

Architecture​

ServiceRoot DirectoryPlanPublic Domain
achilles-backendbackend/Starter ($7/mo)Yes
achilles-frontendfrontend/Starter ($7/mo)Yes

The frontend calls the backend directly via CORS (using VITE_API_URL).

Starter Plan Networking

Render's private network DNS is only available on Standard plan and above. On Starter plan, services cannot resolve each other by name, so the frontend uses VITE_API_URL to call the backend's public URL directly.

  1. Go to render.com/deploy and connect your GitHub repo

  2. Render detects render.yaml and shows the Blueprint preview

  3. Click Apply

  4. Set the sync: false variables on each service:

    Backend:

    CLERK_PUBLISHABLE_KEY=pk_live_...
    CLERK_SECRET_KEY=sk_live_...
    CORS_ORIGIN=https://<frontend>.onrender.com
    AGENT_SERVER_URL=https://<backend>.onrender.com
    TESTS_REPO_URL=https://github.com/ubercylon8/f0_library.git
    GITHUB_TOKEN=ghp_...
    ELASTICSEARCH_CLOUD_ID=...
    ELASTICSEARCH_API_KEY=...

    Frontend:

    CLERK_PUBLISHABLE_KEY=pk_live_...
    VITE_API_URL=https://<backend>.onrender.com

SESSION_SECRET and ENCRYPTION_SECRET are auto-generated by the Blueprint.

Option B: Manual Setup​

Backend Service​

  1. New → Web Service → connect GitHub repo
  2. Root Directory: backend, Runtime: Docker, Plan: Starter
  3. Add a Disk: mount at /root/.projectachilles, 1 GB
  4. Set environment variables (see Environment Variables)

Frontend Service​

  1. New → Web Service → same repo
  2. Root Directory: frontend, Runtime: Docker, Plan: Starter
  3. Set CLERK_PUBLISHABLE_KEY and VITE_API_URL

Persistent Disk​

The backend uses a 1 GB persistent disk at /root/.projectachilles:

PathPurpose
agents.dbSQLite database
analytics.jsonEncrypted ES credentials
certs/Code signing certificates
binaries/Built agent binaries
go-cache/Go module cache (the compiler cache stays in /tmp to keep the 1 GB disk free)
Disk Disables Zero-Downtime Deploys

Persistent disks disable Render's zero-downtime deploys. There will be brief downtime during deploys while the new container starts.

Agent Build from Source​

The backend Docker image includes Go 1.24.3. Set AGENT_REPO_URL to enable agent cross-compilation:

AGENT_REPO_URL=https://github.com/projectachilles/ProjectAchilles.git
AGENT_REPO_BRANCH=main
GITHUB_TOKEN=ghp_... # if repo is private

Before every build, the backend fetches the latest commit of AGENT_REPO_BRANCH (git fetch --depth 1 + hard reset), so a build always compiles the current branch, even when an agent-only merge didn't trigger a redeploy. The commit is recorded in the version's release notes (Built from source (windows/amd64) at 1bbe749). If the fetch fails, the build fails rather than compiling stale code. This matters on Render because buildFilter doesn't redeploy the backend for agent-only merges.

Custom Domains​

Add CNAME records in your DNS provider:

RecordTypeTarget
<prefix>.yourdomain.comCNAME<frontend>.onrender.com
<prefix>.agent.yourdomain.comCNAME<backend>.onrender.com

Then update CORS_ORIGIN, AGENT_SERVER_URL, and VITE_API_URL to use the custom domains.

Cost Estimate​

ServiceEst. Monthly Cost
Backend (Starter plan)~$7
Frontend (Starter plan)~$7
Persistent disk (1 GB)~$0.25
Total~$14

Helper Scripts​

# Generate all secrets at once
./scripts/generate-secrets.sh --target render

# Interactive setup wizard — collects Clerk/ES config, outputs Render-ready env vars
./scripts/setup.sh # Select: PaaS → Render

# Initialize Elasticsearch indices on Elastic Cloud
./scripts/init-elasticsearch.sh --cloud-id "deploy:..." --api-key "..."

Troubleshooting​

Frontend shows CORS errors​

Verify CORS_ORIGIN is set to the frontend's full URL with https:// prefix.

GitHub/Google login returns 404​

You're using a Clerk production instance without custom OAuth credentials. Follow the Prerequisites Clerk OAuth setup.

Agent builds fail with "Agent source not found"​

AGENT_REPO_URL is not set, or the Git clone failed at startup. Check container logs for errors.