envforge.yml approvalA repo owner reviews the generated service command, port, inputs, dev routes, runtime default, and smoke check before the setup PR merges.
The workspace contract should be owned by the team that owns the code.Docs / Getting started
The first-time flow is concrete: connect GitHub, prepare each repo with a reviewable envforge.yml PR, create the project services and bindings, install the CLI, run envforge login, then run envforge up.
GitHub App connected for acme/scheduler
PR opened: add envforge.yml
Project: Scheduler; services: Web, Backend
Bindings: web -> Web, /api -> Backend
$npm install -g envforge
$envforge login
$envforge up
First workspace preflight
A successful first run depends on more than the CLI command. Before envforge up, make sure repo setup, access policy, resource modes, and runtime cost posture have named owners.
envforge.yml approvalA repo owner reviews the generated service command, port, inputs, dev routes, runtime default, and smoke check before the setup PR merges.
The workspace contract should be owned by the team that owns the code.Auth0 + rolesAn organization admin confirms Auth0 login, EnvForge roles, GitHub App installation scope, and who can issue signed dev links.
Identity is not enough; product roles decide workspace actions.resource modesEach database, cache, bucket, mail sink, queue, or disabled integration has an owner, mode, readiness expectation, and cleanup policy.
Resource decisions should not be discovered during reviewer handoff.size + sleep + capThe first workspace names its runtime size, idle sleep behavior, cap posture, and separate customer-cloud costs before the runtime wakes.
Awake-only billing is useful only when the boundary is visible.Hosted MVP milestone
The milestone is the hosted path a first customer or reviewer can follow: run envforge up, land in a shell immediately, let runtime services wake in the background, share a signed dev.envforge.ai URL, and explain that runtime billing applies only while the runtime is awake.
CLI entry pointAfter GitHub, repo setup, project services, and CLI login are ready, envforge up selects the hosted project and branch workspace instead of asking users to rebuild local setup.
shell firstThe shell attaches first with Git, tmux, Claude, Codex, repo checkout, and logs ready while service processes report readiness separately.
wake as neededWeb, /api, workers, resources, or checks wake in the background when runtime work needs CPU, memory, ports, or declared service dependencies.
review linkThe reviewer opens a signed dev.envforge.ai URL for the service/workspace/org host, and the signed session gates web, /api, assets, and realtime traffic.
meter boundaryOpening a signed dev URL can wake the runtime; idle sleep stops the runtime meter while the hosted shell, repo state, and workspace metadata remain available.
first milestoneThe hosted path is the first milestone: envforge up, instant shell attach, background runtime wake, signed dev.envforge.ai handoff, and awake-only runtime billing.
contract examplesLocal envforge.yml examples and setup PRs describe the contract that the hosted workspace will run; they are not the hosted shell, gateway, runtime meter, or billing system by themselves.
do not overclaimKeep GA onboarding, expanded fleet controls, automated caps, invoices, and production operations language clearly planned until those controls are live; this is not a production-GA availability claim.
Workspace access contract
Getting started should leave one clear handoff: envforge upopens the workspace shell, the dev URL follows the service/workspace/org shape, and a signed session gates app traffic before the runtime wakes.
$envforge up signed-links
shell: ready with Git, tmux, Claude, Codex
runtime: asleep until web, /api, workers, or checks need it
handoff: signed dev.envforge.ai URL -> browser session
dev: https://web--signed-links--acme.dev.envforge.ai
session: signed service/workspace/org, expires 2h
billing: shell baseline included; runtime meter awake-only
envforge upDevelopers and agents enter through the CLI, select the organization, project, repo workspace, and branch, then attach to the shared shell without passing around raw VM hostnames.
One command is the handoff handle for Git, tmux, Claude, Codex, logs, and readiness.<service>--<workspace>--<org>.dev.envforge.aiEnvForge calls this a signed dev.envforge.ai URL in product handoffs; the dev.envforge.ai host keeps the service, workspace, and organization visible for review while DNS stays behind one EnvForge wildcard.
Use a signed dev link for the actual browser handoff, not a raw runtime address.service + workspace + org + expirationSigned links cover the app surface for web, same-origin /api, assets, and realtime routes, while SSH, logs, secrets, private consoles, and runtime admin remain closed.
The host shape is not the permission; the signed session is.shell included / runtime awake-onlyThe shell baseline stays ready for repo work. Web, API, workers, tests, and resources wake the runtime meter only when service work needs them.
Auto-sleep stops runtime billing without deleting the workspace.Connect GitHub
Install GitHub AppStart by installing the EnvForge GitHub App for the organization and choosing the repositories EnvForge is allowed to prepare.
Use selected repositories; setup does not require broad personal access tokens.Prepare repos
envforge.yml PR per repoEnvForge reads each repo and opens a small setup PR with service commands, ports, inputs, resources, dev routes, runtime defaults, and smoke checks.
Repo owners review the contract before branch workspaces depend on it.Create project
Project -> services -> bindingsAdd the prepared repos as project services, then bind product routes and resources: Web owns the browser surface, Backend owns /api, and declared resources attach to the services that consume them.
Bindings turn repo services into a product-shaped workspace.Install CLI
npm install -g envforgeThe CLI is the normal workspace handoff for developers and agents. Install it in the terminal environment that should attach to EnvForge workspaces.
Verify the install with envforge --version before first login.envforge login
envforge loginenvforge login opens the product sign-in flow and returns a local CLI session tied to the same organization and GitHub installation.
The CLI should show the expected organization before opening a workspace.envforge up
envforge upRun envforge up, choose the prepared project and branch, then land in the shell while web, API, resources, checks, and signed dev readiness start in the background.
Shell first; service runtime wakes only when workspace work needs it.First workspace trust receipt
The first workspace handoff should make access, isolation, and cost plain in product language before anyone opens the app dev URL.
*.dev.envforge.aiThe dev URL follows the product host shape <service>--<workspace>--<org>.dev.envforge.ai through one EnvForge wildcard, not raw VM hosts or per-branch DNS.
Use the signed dev link for the browser handoff.service + workspace + org + expirationReviewer access starts as one signed browser session for one service, workspace, organization, and expiration before app traffic reaches the runtime.
Web, /api, assets, and realtime paths share the session.one-org-per-VMShell and runtime VMs stay inside one customer organization, so cross-customer code, dev traffic, and logs never co-tenant.
Branch workspaces can share only their owning org boundary.runtime-awake onlyOpening the signed link may wake web, /api, workers, or checks on the runtime meter; idle sleep stops billing while the shell baseline remains ready.
Cost follows awake service work, not the existence of a workspace.Resource readiness
After envforge up, run envforge workspace resourcesto check declared resources by reference, readiness, and consumer service. The handoff should explain what is ready, waking, or blocked without exposing credentials or provider internals.
$envforge workspace resources signed-links
resource.postgres.url ready for api
resource.cache.url waking for api
resource.storage.bucket blocked for web: disabled by workspace policy
masked: postgres://***@resource.postgres/app
resource.postgres.urlReady means the workspace mode resolved and the consuming service can receive the masked reference during runtime wake.
resource.cache.urlWaking is a reason to wait before handing a reviewer the link, then run the command again after provisioning or service wake completes.
resource.storage.bucketBlocked output should name the resource and consumer service without printing credentials, provider IDs, internal hosts, or private console URLs.
First workspace handoff
A launch-ready first workspace should be easy to paste into a pull request or support thread: the workspace shell, the signed dev URL, what is ready, and which operational surfaces remain private.
<service>--<workspace>--<org>.dev.envforge.aienvforge up signed-linksThe handoff names the workspace, Git branch, tmux session, logs, and shell status before service runtime work starts blocking review.
web--signed-links--acme.dev.envforge.aiThe public host follows <service>--<workspace>--<org>.dev.envforge.ai, with one browser session for web, /api, assets, and realtime routes.
web ready; api wakingThe first workspace handoff should say which services, resources, and checks are ready, still waking, or blocked before a reviewer opens the app.
ssh / logs / secrets blockedSigned dev URLs stay app-scoped. SSH, raw logs, secrets, root policy, private consoles, and runtime admin remain behind authenticated workspace access.
Setup contract
The per-repo PR says how a service runs. The project binding says where that service belongs in the product workspace, such as routing web to Web and /api to Backend.
version: 1
service:
name: Backend
command: npm run api
port: 3000
inputs:
DATABASE_URL: resource.postgres.url
resources:
postgres:
mode: branch_scoped
preview:
routes:
- /api
checks:
smoke: npm testProject bindings
web + /apiWeb + BackendFirst-run checks
A first workspace should be runnable from product concepts and reviewed repo contracts, without passing around raw VM hostnames, cloud credentials, or shared secrets.