Hopp til innhold

Fra idé til SaaS klar for produksjon.

Arbeidsområder, autentisering, API-er og observabilitet, bygget på Cloudflare. Strukturerte logger og sporing av forespørsler følger med; ekstern overvåking er valgfri.

Følg en forespørsel gjennom koden.

Start med arbeidsområdeoversikten. Se API-kontrakten og den delte funksjonen, deretter infrastrukturen bak appen.

Vis arkitekturen
Forespørselstopologi for B2B SaaS StarternettleserHTTP clientMCP-klientkøjobberwebTanStack StartapiREST + MCPbackgroundqueue consumerpackages/capabilitiesD1Durable ObjectsQueuesEmail

Se hva API-et returnerer.

Arbeidsområdeoversikten leverer dataene på denne siden.

REST · GET /workspaces/:slug/overview
curl -H "Authorization: Bearer $API_TOKEN" \
  https://api.example.com/workspaces/starter-lab/overview

{
  "workspace": {
    "id": "wrk_starter",
    "slug": "starter-lab",
    "name": "Starter Lab",
    "planId": "team"
  },
  "notifications": []
}

Denne installasjonen har ikke et eksempelarbeidsområde. Vertsnavnet og svaret viser et eksempel med seed-data.

Sjekk inndata og feil.

Hver rute beskriver parametere, svar og feil. Gruppen krever bearer-autentisering.

HttpApiEndpoint · arbeidsområdegruppenpackages/api/src/index.ts (åpnes i ny fane)
export const WorkspaceApi = HttpApiGroup.make('workspace')
  .add(
    HttpApiEndpoint.get('overview', '/workspaces/:slug/overview', {
      params: SlugParams,
      success: WorkspaceOverviewDto,
      error: WORKSPACE_ERRORS
    })
  )
  .middleware(BearerAuth)

Bruk samme funksjon overalt.

Webappen, REST og MCP kaller den samme kapabiliteten.

Effect · oversiktsprojeksjonenpackages/capabilities/src/workspace-projections.ts (åpnes i ny fane)
export const workspaceOverview: Effect.Effect<
  WorkspaceOverviewProjection,
  CapabilityUnavailable,
  WorkspaceContext | NotificationFeed
> = Effect.gen(function* () {
  const ctx = yield* WorkspaceContext
  const feed = yield* NotificationFeed
  const notifications = yield* feed.list
  return {
    workspace: ctx.workspace,
    notifications
  }
})
Sammenlign kallene fra web, REST og MCP
server fnapps/web/src/lib/server/demo-showcase.effects.ts (åpnes i ny fane)
return runWorkspaceCapabilities(
  DEMO_WORKSPACE_SLUG,
  Effect.all(
    {
      overview: workspaceOverview,
      …
    },
    { concurrency: 'unbounded' }
  )
)
REST handlerapps/api/src/handlers.ts (åpnes i ny fane)
.handle('overview', ({ params, request }) =>
  workspaceRead(READ_OPERATIONS.overview, params, undefined, request)
)
MCP toolapps/api/src/mcp.ts (åpnes i ny fane)
const caller = yield* requireCaller()
const invoke = yield* decodeOperationInput(operation, payload)
…
const guarded = Effect.gen(function* () {
  yield* authorizeMcpOperation(caller, operation.permission, MCP_READ_SCOPE)
  return yield* invoke
}).pipe(Effect.scoped)

Deploy til Cloudflare.

Cloudflare Workers kjører appen og API-et. D1 lagrer forretningsdata, Durable Objects lagrer private assistentsamtaler, og Queues og Email håndterer levering.

Workers

Webapp, REST- og MCP-API og bakgrunnsjobber

apps/web · apps/api · apps/background

D1

Arbeidsområdedata, skjema og migrasjoner

packages/db

Durable Objects

Privat assistenthistorikk, ett aktivt svar og gjenopptakelse etter frakobling

apps/web · WorkspaceAssistantConversation

Queues

Levering av webhooks med nye forsøk og økende ventetid

apps/background

Email

Transaksjonsbasert e-post, aktivert når den er konfigurert

packages/email

pnpm run deploy

Legg til leverandører ved behov.

Disse integrasjonene er av til du konfigurerer dem. Du kan kjøre appen uten dem.

Legg til leverandører ved behov.
LeverandørRolle
StripeFakturering
Cloudflare Web AnalyticsNettstedsanalyse
Cloudflare EmailTransaksjonell e-post
TurnstileBot-beskyttelse

Les hvordan det fungerer.

Oppsettsveiledningen og arkitekturdokumentasjonen ligger sammen med koden.

docs/

Før du starter

Oppsett, arkitektur, utrulling og lisens.

Webappen kjører på en Cloudflare Worker. TanStack Start gir filbasert ruting, typede lastere og serverfunksjoner som kaller de samme kapabilitetene som REST-API-et.

Kjør den på din egen maskin.

Klon repoet og kjør kommandoene nedenfor. Eksempelarbeidsområdet kjører lokalt uten Stripe-konto, OAuth-app eller e-postleverandør.

Klon og kjør

$ git clone
https://github.com/brandhaug/b2b-saas-starter.git
$ cd
b2b-saas-starter
$ vp install
vp install
$ cp .env.example .env
cp .env.example .env
$ pnpm run db:migrate:local
pnpm run db:migrate:local
$ pnpm run db:seed
pnpm run db:seed
$ pnpm run dev
pnpm run dev
web
http://localhost:3071
api
pnpm -C apps/api dev
background
pnpm -C apps/background dev
providers
env-gated: nothing to configure