Envora
Inspiration
Sales and QA teams waste time building one-off demo databases or reusing stale data. We wanted a way to describe a scenario in plain English and get a live, isolated environment in minutes—no engineering tickets, no manual SQL.
What it does
Envora spins up sandboxed demo environments on demand. You pick a project (e.g. demo CRM), write a scenario prompt ("CRM with $26M pipeline and 8 organizations"), and launch. The platform:
- Creates a dedicated Postgres database for that sandbox
- Uses Claude to generate realistic, scenario-matched seed data (INSERTs)
- Seeds the DB (with AI-powered retry if the SQL fails)
- Starts a Docker container running your demo app against that DB
- Gives you a URL to a running instance with the right data
Sales get fresh, on-brand demos; QA get repeatable, realistic data. Describe the scenario → get a live sandbox.
How we built it
- Platform backend: Express (Node/TypeScript), Prisma (SQLite) for projects, scenarios, and sandbox metadata; Postgres (one DB per sandbox) for sandbox data.
- AI layer: Anthropic SDK — we send schema + scenario prompt to Claude; it returns SQL INSERTs. On seed failure we send the Postgres error back and retry (up to 3x).
- Orchestration: provision.ts runs the 7-step pipeline (create DB → apply schema → generate data → seed → launch container → wait for ready → mark running).
- Containers: Docker + dockerode to run the demo app image with a sandbox-specific
DATABASE_URL. - Frontend: Next.js 14 (App Router), React, Blueprint.js; shared types in
platform/shared/types.tsfor type-safe API usage. - Demo app: Standalone demo-crm (Next.js, Prisma, Postgres) as the first "project" we support.
Challenges we ran into
- Seed failures not failing the sandbox: Provisioning continued to "launch container" even when seeding failed. We now check
seedResult.successand throw so the sandbox is marked failed with the real error. - Admin DB mismatch: Reset/delete used a hardcoded Postgres URL; if sandbox Postgres was on another port, we targeted the wrong server. We now derive the admin URL from the same
SANDBOX_POSTGRES_*env vars as provisioning.
Accomplishments that we're proud of
- End-to-end flow: From "create scenario + launch" to a running demo app with AI-generated data in one pipeline.
- AI + DB correctness: Prompting Claude for dependency-ordered INSERTs and using seed-with-retry so bad SQL gets fixed by the model instead of manual debugging.
- Pipeline-value targeting: Supporting prompts like "$26M pipeline" and instructing the model to use a scratchpad so generated deal amounts sum to the target.
- Clean separation: Platform DB (SQLite) vs one Postgres DB per sandbox; shared TypeScript types; single orchestration module for the 7 steps.
What we learned
- Fire-and-forget + polling: Returning 201 immediately and updating sandbox status in the DB lets the UI poll for "running" or "failed" without blocking the API.
- Model quirks: Small prompt details (trailing "...", wording like "26mil") change behavior; normalizing and being explicit in the system prompt matters.
- One source of truth: Keeping API shapes in
shared/types.tsand using them in both frontend and backend avoids drift and speeds up iteration.
What's next for Envora
- Shareable links: Public or time-limited URLs so prospects can open a sandbox without logging into the platform.
- Auth and quotas: Per-user or per-team limits on active sandboxes and usage.
- More demo apps: Support additional project types (e.g. other schemas and Docker images) beyond the demo CRM.
Built With
- anthropic
- docker
- node.js
- react
- sql
- typescript


Log in or sign up for Devpost to join the conversation.