Short answer: You cannot deploy the entire Edward stack at $0 and have it be fast, reliable, and production-grade for multiple users. You can ship a single-user demo on free tiers with real compromises. Full product parity needs paid infra.
This document captures an end-to-end audit of the monorepo — architecture, env contracts, Docker coupling, storage, queues, preview routing, build output, and current free-tier options (2026).
What Edward Actually Is
Edward is not a simple Next.js app. It is a multi-process platform:
Build verified: pnpm turbo build succeeds with stub env vars (~17s).
Hard Blockers for "$0 + Fast + Best"
1. Docker is non-negotiable today
The API exits on boot if Docker is unavailable (apps/api/services/sandbox/lifecycle/control.ts):
TypeScript
This rules out Vercel, Cloudflare Workers/Pages, Netlify Functions, and any pure serverless host for the API.
Each sandbox container is heavy (apps/api/services/sandbox/docker.service.ts):
TypeScript
With defaults (AGENT_RUN_WORKER_CONCURRENCY=2, BUILD_WORKER_CONCURRENCY=3), one host can need 5+ GB just for containers.
2. Two long-running Node processes — worker has no prod script
apps/api/package.json has "start": "node dist/server.http.js" but nostart:worker. In dev you run both via concurrently. Production needs a process manager (systemd, PM2, Docker Compose) you must write yourself — no deploy manifests exist in the repo.
3. AWS credentials are mandatory at startup
apps/api/app.config.ts uses validateEnvVar on:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_BUCKET_NAME
AWS_CDN_BUCKET_NAME
Empty strings in .env.examplewill crash the API. The README's "stub locally" story contradicts the code.
storage.config.ts uses a plain S3Client with no R2/custom endpoint — Cloudflare R2 needs a small code change.
4. Redis churn kills managed free tiers
The worker runs a 250ms flush interval plus BullMQ, pub/sub, rate limits, and sandbox state (apps/api/queue.worker.ts):
TypeScript
Upstash Redis free (~10K commands/day) would be exhausted in hours. Self-hosted Redis on the same VM is the only viable $0 path.
5. Long-lived SSE streams
Agent runs stream for up to 20 minutes (configurable via STREAM_GUARD_TIMEOUT_MS in .env.example). Serverless timeouts (10–60s on most free tiers) are incompatible.
6. No deployment infrastructure in repo
What exists:
wrangler.toml — CF Worker for *.edwardd.app subdomain previews (hardcoded domain)
.github/workflows/ci.yml — quality gates only
.github/workflows/build-sandbox-images.yml — pushes to GHCR
docker/templates/* — sandbox images, not app deployment
What's missing: docker-compose.yml for prod, Fly/Render/Railway configs, worker start script, systemd units, health checks.
Built-in rate limits already cap abuse (helpful on free infra):
10 chats/min, 10 successful chats/day
6 image uploads/min
2 concurrent runs per user
Docker Alternatives (E2B, etc.)
E2B has a Hobby tier: $100 one-time usage credits, no credit card, up to 20 concurrent sandboxes. But Edward is tightly coupled to dockerode across 10+ files (docker.service.ts, provisioning, backup, build pipeline). Swapping to E2B is a multi-week refactor, not a config flip. After credits run out, usage is metered per second.
Other options (Modal, Daytona, Fly Machines) are similarly not integrated and mostly paid.
Honest take: For $0, self-hosted Docker on a free VM beats E2B for sustained use. E2B is better for a short demo before credits expire.
Best Realistic $0 Stack
Plain text
Per-component free-tier fit
Component
Best $0 option
Fast at scale?
Web
Vercel Hobby
✅ UI is fast (edge, static pages, optimizePackageImports)