Build an app. Keep 70%.
The Forge platform is open to third-party developers. Build apps for auto repair shops, dealerships, fleet operators, and racing teams. We handle tenant isolation, auth, billing, and hosting. You focus on the feature.
Four steps to publish.
Scaffold your app
Run `npm run forge:scaffold-app <slug>` to generate the manifest and directory structure. Every app lives at apps/<slug>/ and exports a manifest.ts.
Define your manifest
Export a manifest object from apps/<slug>/manifest.ts. Declare tables (Drizzle), procedures (tRPC), routes (Next.js App Router), migrations, and pricing.
Register your app
Import your manifest in src/lib/apps.ts. Add it to the `allManifests` array — the registry discovers it automatically at runtime.
Implement & deploy
Build your UI under src/app/admin/<slug>/, add Drizzle migrations to drizzle/, and deploy. The system handles tenant isolation, auth, and billing.
AppManifest interface
Every app in the Forge ecosystem is defined by a single manifest.ts file. This file declares the app's identity, dependencies, data model, API surface, and pricing.
Manifests live at apps/<slug>/manifest.ts and are dynamically loaded by the app registry. The type definition lives at src/types/app.ts.
Field reference
Real manifests from the repo.
Website Builder
The Website Builder app demonstrates a complete manifest with two database tables, two tRPC procedures, two admin routes, a migration, and Stripe billing at $19.99/mo.
Key patterns: Declares both schema tables and admin UI routes. Uses stripePriceId for connected billing. No app dependencies.
Inventory Manager
A free, open-manifest app. Shows how to build a zero-cost utility app with categories, items, stock adjustments, and reorder alerts. No Stripe integration needed.
Key patterns: Free app with monthlyCents: 0. Declares three admin routes. Two tRPC procedures for stock operations. No Stripe price ID.
API surface
All Forge APIs are exposed via tRPC at /api/trpc. The router is defined in src/lib/trpc/router.ts and uses Zod for input validation and SuperJSON for serialization.
App-specific procedures are registered via the manifest's exposes.procedures field. The platform router handles authentication, tenant resolution, and context injection automatically.
How apps are discovered
The app registry at src/lib/apps.ts dynamically loads all manifests from apps/*/manifest.ts. When you add a new app, import its manifest in the registry and it becomes available across the platform.
Build for the bay floor.
Ship in weeks.
Columbus-based developers preferred. Remote OK for the right fit. 20 hrs/week contract, $60–$100/hr.