{
  "schema": "leumas.docs.page/1",
  "id": "pkg:@leumas/workflows-web",
  "slug": "products/workflows-web",
  "kind": "capabilities",
  "bucket": "product",
  "title": "@leumas/workflows-web — Leumas Workflows at workflows.leumas.tech",
  "name": "@leumas/workflows-web",
  "eyebrow": "Leumas Workflows at workflows.leumas.tech",
  "chip": null,
  "summary": "Leumas Workflows at workflows.leumas.tech — triggers, actions and workflows: build them in the browser, dry-run them free, run them with a key.",
  "keywords": [
    "workflows",
    "workflow automation",
    "triggers and actions",
    "zapier alternative",
    "n8n alternative"
  ],
  "audience": "both",
  "funnel": {
    "product": null,
    "cta": null
  },
  "body": "# @leumas/workflows-web — Leumas Workflows at `workflows.leumas.tech`\n\nWhen this happens, do that. The workflow engine inside Leumas Studio, on the web: a member-grade\nbuilder over the same eight node types, the same validator and the same stepper, with a free dry run\nin front and a metered, owner-scoped run lane behind.\n\n**Status: built.** Blueprint: [`products/TODOS/workflows.leumas.tech.md`](../TODOS/workflows.leumas.tech.md)\n(§6a records the decisions made while building).\n\n## What is where\n\n| Piece | Lives in |\n|---|---|\n| The vocabulary, validator, stepper, templates | `@leumas/workflows` (`shared/packages/workflows`) — unchanged |\n| The dry run (echo runner, isomorphic) | `@leumas/workflows/dryrun` |\n| What a member's graph may reach (isomorphic) | `@leumas/workflows/member-policy` |\n| The builder, the trace, the gallery glyph | `@leumas/workflows/react` (`WorkflowBuilder`, `RunTrace`, `FlowGlyph`) |\n| The member lane | `products/leumas-api/src/{controllers,routes}/workflowsSite.js` → `/api/workflows/{status,catalogue,templates,dryrun,mine/*}` |\n| The money | `PLAN_CATALOG` `workflows` $15 · `policy.js` `workflows.*` (floor: build + dryrun; plan: saves, run, monthlySteps, arm, webhook, keys, runRetentionDays) |\n| The SDK | `@leumas/workflows-sdk` |\n| This site | `src/content/pages.js` (the prose as data) · `src/content/catalogue.generated.js` (from the registries at build) · `src/screens/*` |\n| Guards | `pnpm check:workflows-public` · `pnpm check:workflows-metered` · `pnpm smoke:workflows-site` |\n\n## The catalogue is generated\n\n`scripts/gen-catalogue.mjs` reads `createTriggerRegistry().listManifests()`,\n`createActionRegistry().listManifests()`, the connectors registry and every workflow catalogue, and\nwrites `src/content/catalogue.generated.js`. One page per trigger, action, app and template is\nderived from it; `check:workflows-public` holds the page table to the file both ways. Never type a\ncount.\n\n## Three doors, one meter\n\nA run from the browser, from a key (`POST /api/workflows/mine/:id/run`, `Authorization: Bearer lk_…`\nwith the `workflows` scope) and from an armed rule (`run-workflow`, bound in `app.js` to the site's\n`runForOwner`) all pass `walk()` in the controller: reserve against `workflows.monthlySteps`, step,\nrecord a `workflow_runs` row. `check:workflows-metered` asserts the connections. The dry run is the\none door that stays free, because it executes nothing.\n\n## Why this can read a visitor's session with no configuration\n\n`workflows.leumas.tech` is a platform-owned Imperium site row\n(`shared/services/index/src/workflowsSite.js`), served by the Imperium worker behind the IIS\n`*.leumas.tech` wildcard. That worker forwards `/api` and the auth prefixes to leumas-api preserving\nthe visitor's Host header and cookies, so every call is same-origin.\n\n[warning] **Never set `VITE_API_BASE`.** The session cookie is httpOnly and same-origin.\n\n## Running it\n\n```bash\npnpm dev:api                                  # :3000\npnpm dev:workflows                            # :5080\npnpm --filter @leumas/workflows-web build\npnpm check:workflows-public && pnpm check:workflows-metered && pnpm smoke:workflows-site\n```\n\n[warning] `pnpm deploy:workflows` copies files but carries **no release stamp**. Only `pnpm ship` applies.\n",
  "source": {
    "path": "products/leumas-workflows/README.md",
    "blobSha": "",
    "commit": "",
    "committedAt": "",
    "provenance": "no-git",
    "bytes": 3422,
    "hash": "2b39f59f7f0d8e6b33f1b8e37871fc9e14a4e84c"
  },
  "urls": {
    "html": "/p/products/workflows-web",
    "json": "/docs/products/workflows-web.json",
    "md": "/docs/products/workflows-web.md"
  },
  "links": {
    "composes": [
      "pkg:@leumas/actions",
      "pkg:@leumas/connectors",
      "pkg:@leumas/theme",
      "pkg:@leumas/ui"
    ],
    "usedBy": [],
    "product": [],
    "howTo": [],
    "skills": []
  },
  "exports": null
}
