forge
Clone forge-starter
FORGE · DOCKER-FIRST · API-FIRST · MIT

Software is built,
not written.

Forge is the AI-native software creation platform for Builders. Ask an agent, or type the command: the same stable Capabilities, durable Resources and replaceable Implementations, through the same door.

claude · hello
youRelease hello to production.
claudeforge → release running forge release --app hello --host hello.example.com
00:00.4assessclean tree · origin found · host recovered from productionize block
00:41.2publishghcr.io/…/hello@sha256:9f3c… pushed (publish_mode=ci)
00:41.9repincompose.prod.yaml → web image pinned by digest · ProductionArtifactsGenerated
01:12.0deploystart-first roll · health-wait ok · drain 3s · DeploymentCompleted
01:15.3verifyhealth 200 ✓ · page → 302 ✓ · api → 401 ✓ · cron → 403 ✓
 ReleaseCompletedRelease res_01J… · 5 phases · re-run resumes from the first unsatisfied phase
claudeReleased. hello.example.com is serving the new build; all five verify assertions passed. Resource Release res_01J….

Build an AI-native app without leaving the conversation.

hello — Visual Studio Code
EXPLORER
▾ HELLO
▸ .claude/skills
▾ app
▾ projects
page.tsx
layout.tsx
page.tsx
compose.yaml
forge.app.json
.env
forge
new-app
page.tsxprojects.tsprojects.test.ts
1import { listProjects } from '@/lib/projects';
2
3export default async function ProjectsPage() {
4  const projects = await listProjects({ order: 'newest' });
5  return (
6    <main>
7      <h1>Projects</h1>
8      {projects.map(p => <ProjectCard key={p.id} project={p} />)}
9    </main>
10  );
11}
CLAUDE CODE
/add-a-feature Add a projects page that lists the projects in the database, newest first.
✓ Plan · 4 steps
✓ Designed /projects first
✓ app/projects/page.tsx · lib/projects.ts · tests/projects.test.ts
✓ build · test 3 passed · lint 0 problems
✓ dev restarted · health ok
/projects is up. Want it on the home nav?
Ask Claude Code…
⎇ main✓ forge · hello · :3000Ln 4, Col 9

One sentence in your editor. A plan, a designed screen, the code, a passing build, tests, lint and a health check out — every step a forge capability you can inspect.

9:41●●● ᯤ ▮
Claude Code · hello···
Why did the nightly-digest job in hello fail this morning?
◆ triage skill · ./forge events · ./forge jobs
JobRunFailed · nightly-digest · 06:00
response 403 · fail_count 1
The app refused the sidecar's service token: AUTH_SERVICE_TOKEN differs between the two tiers, so every callback is rejected before it runs.
Fix: one value in both .env.prod entries, then the next tick runs. Want me to open it in the playground?
Yes — and set it up so I don't hit this again.
Message Claude…

Triage from your phone. Claude Code runs the forge CLI where the project lives via Remote Control; forge's own log answers, with the fix.

24
Capabilities

Each one a stable contract: validate → permission → policy → execute → audit. Invoked identically over POST /capabilities/:slug by people, agents and the CLI.

23
Resource types

Application, Build, Release, Deployment, AgentTask… durable state you can list, inspect and explain. One store, filesystem or Postgres.

2
Planes

A control plane that builds, tests and releases your app, and a slim data-plane sidecar that runs beside it in production. Your app imports no forge package.

Two kinds of Builder. One contract.

Engineers build. Designers build. Product managers build. Agents build. Different expertise, one identity — and one door into the platform.

Ask your agent forge

you
Make a forge app called hello with a Postgres database, and run it.
claude
forge → initialize-app forge → provision-environment forge → run-dev-server
Done. hello is running at localhost:3000 with Postgres. I created 3 resources and recorded 4 events; say “show me the events” any time.

You never see a flag. The skill chooses the capability, fills the schema, and reports Resources and Events back in plain language.

From the terminal

$ ./new-app hello --with-postgres --dev
# = forge init app · provision --with-postgres · install · build · test · lint · dev

Every verb is a thin client for one capability. --json gives you the same Resources the agent reads.

Both lanes end in the same request: POST /capabilities/initialize-app, validated, permission-checked, policy-checked, executed, audited.

What your app gets on day one

Identity & sessionshosted login, signup, 2FA, GoogleC10 · /auth/*
Remote MCP hostingyour tools, served to Claude & ChatGPT, OAuth 2.1 AS includedC23 · /mcp · /oauth/*
Connector vaultGoogle, Microsoft, CalDAV — act as the userC24 · /connect/*
Billingplans, trials, entitlements, Stripe webhooksC33 · /billing/*
Policy engineallow · needs-approval · deny, deterministicC29 · POST /authorize
Membershipgroups, roles, invitationsC31 · /groups/*
Schedulerdurable jobs that call your app backC2 · schedule-job
Event logyour domain facts, owner-scoped, queryableC3 · /app-events
SearchBM25, ACL-aware, in-index scopingC19 · /search
Blob storageowner-scoped files, S3 or diskC20 · /blobs
Notificationsin-app, web push, SMSC4 · C21
Model runtimestructured output, forced-tool schemaC1 · agent-run
Status pageuptime + incidents, themedC15 · /status
Themingone token file themes all platform UIC16 · /theme.css
Transactional emailverify, reset, or your ownC12 · send-email
Releaseassess → publish → repin → deploy → verifyC18 · forge release
In production today
one consumer, honestly counted
33
MCP tools served to Claude and ChatGPT
3
connector providers (Google · Microsoft · Apple CalDAV)
by digest
every Cloud Run roll pinned, never by tag
“The factory should disappear. When it does, you notice you are only thinking about the software.”A Builder — placeholder, needs a real quote before shipping