Self-hosted platform for standing up and running software factories on AWS: complete DevSecOps environments with secure delivery pipelines, supply-chain controls, compliance evidence and multi-tenant governance — in minutes, not months.
Setup, usage and reference for Pipeline Builder.
infra provision, which does far more than deploy.Pipeline Builder is a self-hosted platform for deploying and running software factories on AWS: complete DevSecOps environments where secure delivery pipelines, supply-chain controls, compliance evidence and multi-tenant governance arrive together. Pipelines are assembled from reusable, containerized plugins and deploy as native AWS CodePipeline and CodeBuild in your own account.
This page is the documentation index. It links every setup, usage and reference guide, grouped by task.
The shortest accurate description of the whole system:
Architecture Flow draws each of those steps in detail.
The path from nothing to a working pipeline:
infra provision.The path from zero to a working pipeline:
infra provision.| Guide | For |
|---|---|
| Onboarding a New Organization | First admin: login, org, members, access key, service-account keys (store-token), setup-events, first pipeline |
| AWS Deployment | Deploy to EC2 / EKS — modes, post-deploy setup, reporting, teardown |
| Pipeline Manager (CLI) | The pipeline-manager CLI — infra provision, build/deploy pipelines, audits |
| Deploy Operations | Ops runbook — preflight, secrets rotation, backups, teardown |
| Secret Rotation | Rotating every secret with zero downtime — JWT, refresh, at-rest key, alert relay, registry signing key |
| Access Keys and Machine Credentials | Issuing personal access keys and provisioning the three stored machine credentials |
| Ecosystem Moderation | For Ecosystem Managers: the publish-request queue, two-person approval, separation of duties, auto-approval rules, takedowns, re-sign jobs, the bootstrap exception |
build_image (build at upload), prebuilt (pre-built image.tar bundled in zip), or metadata_only (no image — runs on CodeBuild’s default).pipeline-builder/{orgId}/{secretName}. Injected at build time, never stored in images.Author and ship pipelines and plugins.
| Document | Description |
|---|---|
| Developer Guide | Five ways to create a pipeline + cut-and-paste plugin patterns for 7 languages |
| CDK Usage | PipelineBuilder construct, sources, stages, VPC, IAM, secrets |
| Template Syntax | `` synth-time interpolation for pipeline configs + plugin specs, and golden-path templates |
| Metadata Keys | Typed CodePipeline / CodeBuild / networking / IAM configuration keys |
| Plugin Catalog | 119 pre-built plugins across 10 categories, and how to author your own |
| Installing Plugins | Trust tiers, installs and version policies, the per-org consumption policy, reviews and reporting |
| Publishing Plugins | Publisher profiles, publish requests and moderation, catalog metadata, pausing a plugin |
| Developer Portal | Catalog ownership & My Services, golden-path templates, per-pipeline maturity scorecards |
| Samples | Ready-to-load pipeline templates for 7 languages + CDK patterns |
| Testing Conventions | Shared mock factories, real authz gates in tests, coverage ratchets, the permission contract, and the traps that cost people a day |
Organizations, access, policy, and billing.
| Document | Description |
|---|---|
| Organizations & Teams | Isolation boundary, org creation, the org → team hierarchy |
| Roles & Permissions | Permission catalog, built-in Roles, enforcement, session invalidation |
| Permission Contract | The hand-maintained route-to-permission table — a diff here is a permission change and is reviewed as one |
| Compliance | Per-org rule engine — 18 operators, computed fields, enforcement, audit trail |
| Authentication & SSO | OAuth social login + per-org enterprise SSO (OIDC or SAML 2.0), just-in-time membership and SCIM 2.0 directory provisioning |
| Audit Events | Tamper-evident hash-chained trail, /audit/verify, action catalog |
| Logs | Per-organization application logs: search syntax, entry detail, raw view, download, masking |
| Billing Providers | Setup walkthroughs for Stripe + AWS Marketplace (keys, webhooks, entitlements, metering) |
| Billing Add-on Bundles | Stackable add-ons that raise pooled caps (seats, pipelines, plugins, storage) |
| Billing Discounts | Coupon codes + usage credits — one-time/recurring/credit, grant or self-serve |
Run, secure, and observe the platform.
| Document | Description |
|---|---|
| AWS Deployment | EC2 / EKS deploy, post-deploy setup, reporting infra, drift detection |
| Deploy Operations | Runbook — preflight, secrets rotation, backups & DR, teardown |
| Secret Rotation | Per-secret rotation runbooks — overlap windows, restart order, verification, rollback, the lingering-rotation alert |
| Access Keys and Machine Credentials | Issuing personal keys, provisioning the platform-automation / registry-push / reporting-ingest service accounts, what to watch |
| Service Mesh | Istio ambient — STRICT mTLS + identity-based L4 authZ, plus per-internal-route L7 policies via a waypoint (local, EC2, EKS) |
| Environment Variables | Every configuration variable, by subsystem |
| DORA Metrics | Deploy frequency, change-failure rate, MTTR, measured lead time, build health (Enterprise / Advanced Reporting) |
| Stakeholder Reports | Scheduled manager-facing reports — frozen period snapshots, review and publish, recipients, share links (Pro+ add-on) |
| Incident Webhook | Point PagerDuty/Datadog/Alertmanager at the platform (native Alertmanager adapter, self-serve token, per-org window, admin UI) for automated post-deploy CFR + real MTTR |
| Notifications | Email, Slack, webhooks and the in-app inbox — the operator switches (EMAIL_ENABLED, SES, SLACK_*, the alert relay) and the per-org settings that ride on them |
Look things up.
| Document | Description |
|---|---|
| Content Index | A–Z keyword/topic index — find where any subject is documented |
| API Reference | REST endpoints for pipelines, plugins, compliance, reporting, AI |
| Template Syntax | Full `` grammar, scopes, filters, error catalog |
| Metadata Keys | The complete typed metadata-key reference |
| Error Handling | Error-to-HTTP convention — throw typed AppErrors |
| Architecture Flow | End-to-end flows: plugin build, pipeline create, synth, execution |
The web UI at https://localhost:8443 provides visual pipeline and plugin management. The AI builder analyzes a Git repository (or a natural-language prompt) and generates the right stages and plugins automatically, streaming results over SSE. It works across five providers — Anthropic, OpenAI, Google, xAI, and Amazon Bedrock — and can fall back to a secondary provider if the primary one is unavailable. The create dialogs default to Ask agent, which drafts the pipeline or plugin through the Ask assistant’s tools (with the chosen server-configured model) for you to review; pick a provider directly to call its generator instead.
Default credentials (created by init-platform.sh docker on a fresh install):
| Field | Value |
|---|---|
| Identifier | admin@internal |
| Password | Pipeline-Builder-Dev-2026! |
init-platform.sh is non-interactive: it reads PLATFORM_IDENTIFIER and PLATFORM_PASSWORD from the environment and falls back to the defaults above when unset — on every target. On any non-local or production target, export real PLATFORM_IDENTIFIER / PLATFORM_PASSWORD before running — otherwise the admin is created with this trivial dev password. Change the password from the dashboard immediately after first login on anything reachable beyond your laptop.
npm install -g @pipeline-builder/pipeline-manager
pipeline-manager auth login # browser sign-in; stores the session locally
# (in CI instead: export PLATFORM_TOKEN=<access key from "auth pat">)
pipeline-manager plugin upload --file ./node-build.zip # name + version come from plugin-spec.yaml
pipeline-manager pipeline create --file ./pipeline-props.json --project my-app --organization my-org
pipeline-manager pipeline deploy --id <pipeline-id> --profile production
# Create a pipeline
curl -X POST https://localhost:8443/api/pipelines \
-H "Authorization: Bearer $TOKEN" -H "x-org-id: $ORG_ID" \
-H "Content-Type: application/json" \
-d '{
"project": "my-app",
"organization": "my-org",
"pipelineName": "my-app-pipeline",
"visibility": "private",
"props": {
"project": "my-app",
"organization": "my-org",
"synth": {
"source": { "type": "github", "options": { "repo": "my-org/my-app", "branch": "main" } },
"plugin": { "name": "cdk-synth", "filter": { "version": "1.0.0" } }
}
}
}'
# AI-generate a pipeline
curl -X POST https://localhost:8443/api/pipelines/generate \
-H "Authorization: Bearer $TOKEN" -H "x-org-id: $ORG_ID" \
-H "Content-Type: application/json" \
-d '{"prompt": "Build a Node.js app from GitHub, run tests, and deploy with CDK", "provider": "anthropic", "model": "claude-sonnet-5"}'
See the API Reference for the full endpoint list.
import { App, Stack } from 'aws-cdk-lib';
import { PipelineBuilder } from '@pipeline-builder/pipeline-core/cdk';
const app = new App();
const stack = new Stack(app, 'MyPipelineStack', {
env: { account: '123456789012', region: 'us-east-1' },
});
new PipelineBuilder(stack, 'MyPipeline', {
project: 'my-app',
organization: 'my-org',
synth: {
source: {
type: 'github',
options: { repo: 'my-org/my-app', branch: 'main',
connectionArn: 'arn:aws:codestar-connections:us-east-1:...:connection/...' },
},
plugin: { name: 'cdk-synth', filter: { version: '1.0.0' } },
},
stages: [
{ stageName: 'Test', steps: [{ name: 'unit-tests', plugin: { name: 'jest', filter: { version: '1.0.0' } } }] },
{ stageName: 'Deploy', steps: [{ name: 'deploy-prod', plugin: { name: 'cdk-deploy', filter: { version: '1.0.0' } }, env: { ENVIRONMENT: 'production' } }] },
],
});
See Samples for more CDK patterns.
cd deploy/local/docker && ./bin/setup.sh # Start
cd deploy/local/docker && docker compose down # Stop
cd deploy/local/docker && docker compose down -v # Stop + remove volumes
bash deploy/local/minikube/bin/setup.sh # Start
bash deploy/local/minikube/bin/shutdown.sh # Stop
kubectl get pods -n pipeline-builder # Check
sudo bash /opt/pipeline/pipeline-builder/deploy/aws/ec2/bin/startup.sh # Start
sudo bash /opt/pipeline/pipeline-builder/deploy/aws/ec2/bin/shutdown.sh # Stop
sudo -u minikube kubectl get pods -n pipeline-builder # Check
cd deploy/aws/eks
bash bin/setup.sh --domain app.example.com --hosted-zone-id Z123 --region us-east-1 # Deploy
bash bin/shutdown.sh --cluster-name pipeline-builder --region us-east-1 --yes # Teardown
See AWS Deployment for full instructions and post-deploy setup.
init-platform.sh registers the admin user and loads plugins. The AWS deploys self-init by default (the infra provision default --init auto) — EC2 on first boot, EKS in setup.sh’s final phase (over a kubectl port-forward); on local/minikube infra provision runs it for you. You only run it by hand when you deployed with --init manual:
# Local / Minikube — interactive
./deploy/bin/init-platform.sh docker
./deploy/bin/init-platform.sh minikube
# EC2 (only if --init manual) — requires the minikube user context, on the box
sudo -u minikube PLATFORM_BASE_URL=https://your-ip BUILD_BOOTSTRAP=y LOAD_PLUGINS=y LOAD_COMPLIANCE=y LOAD_TEMPLATES=y bash /opt/pipeline/pipeline-builder/deploy/bin/init-platform.sh ec2
# EKS (only if --no-auto-init / --init manual) — run with kubectl access; it port-forwards to svc/nginx
env -u PLATFORM_BASE_URL BUILD_BOOTSTRAP=y LOAD_PLUGINS=y LOAD_COMPLIANCE=y LOAD_TEMPLATES=y ./deploy/bin/init-platform.sh eks
# Non-interactive with prebuilt images and controlled parallelism
PLUGIN_BUILD_STRATEGY=prebuilt PARALLEL_JOBS=2 ./deploy/bin/init-platform.sh docker
The
LOAD_*gates are not optional on a non-interactive run.LOAD_PLUGINS,LOAD_TEMPLATESandLOAD_COMPLIANCEeach default ton, andBUILD_BOOTSTRAPis skipped when there is no TTY. Without theminit-platform.shregisters the admin user and the two service accounts and then exits having loaded nothing — no plugins, no templates, no compliance rules. On a TTY they prompt (Load plugins? [y/N]), and the default is still no. This is whatsetup.sh’s own auto-init passes, so a hand re-run must pass it too.
Key env vars: PLUGIN_BUILD_STRATEGY (build_image/prebuilt), PLUGIN_CATEGORY (comma-separated filter), PARALLEL_JOBS (upload concurrency, auto-lowered to 1 for prebuilt), FORCE_REBUILD (rebuild existing image.tar files).
Flags: --cleanup (remove plugin.zip/image.tar after upload), --continue-on-build-failure (proceed past per-plugin build failures), --force (rebuild the base images and the CodeBuild bootstrap image from scratch, ignoring the docker-cache / registry-tag skips — use after changing a base Dockerfile or the bootstrap image).
Admin credentials — init-platform.sh is non-interactive and reads them from the environment, falling back to defaults when unset:
| Env var | Default (used if unset) |
|---|---|
PLATFORM_IDENTIFIER |
admin@internal |
PLATFORM_PASSWORD |
Pipeline-Builder-Dev-2026! |
PLATFORM_TOTP_CODE |
unset — only needed when re-running init for an admin who has an authenticator app (see Authentication) |
The defaults apply on every target, so export real values on minikube/ec2/eks (or any shared/production environment) before running — otherwise the admin is created with the trivial dev password.
Fresh-install super-admin bootstrap.
init-platform.shregisters the admin into the reservedsystemorganization, and that org can only be created by an email listed in the platform’sBOOTSTRAP_SUPERADMIN_EMAILS(the controlled first-super-admin path). So on a fresh install,PLATFORM_IDENTIFIERmust be listed inBOOTSTRAP_SUPERADMIN_EMAILS. The stock defaults align (bothadmin@internal); if you set a customPLATFORM_IDENTIFIER, add it toBOOTSTRAP_SUPERADMIN_EMAILSand restart the platform before running init — otherwise thesystemregistration is rejected (403) and no super-admin is bootstrapped.
Organizations are the isolation boundary — each one is a self-contained workspace. Every resource — pipelines, plugins, compliance rules, quotas, secrets, and billing — is scoped to an organization. Organizations can optionally nest teams (see Teams below). This section covers admin tasks; new evaluators can skip ahead to Architecture.
Register an account, then create one or more organizations. The creator becomes the owner.
From the dashboard — open the Organizations page and click Create Organization. (Teams — organizations nested under a parent — are created from the Members page with Create Team; see Teams.)
From the API:
curl -X POST https://localhost:8443/api/organization \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"name":"acme-platform","displayName":"Acme Platform Team"}'
| Built-in Role (seeded permission bundle) | What its permissions cover |
|---|---|
| Owner | Full control — manage members, transfer ownership, delete org |
| Admin | Manage plugins, pipelines, compliance rules, quotas, and invite members |
| Member | Create and manage their own pipelines and plugins |
The coarse owner/admin/member label on a membership is for display and ownership transfer only — it grants nothing. Permissions come only from the Roles assigned to a user; see Permissions.
Invite members via email from the dashboard or API. A user can belong to multiple organizations.
Access is granted through Roles — a Role is a named set of fine-grained resource:action permissions (e.g. pipelines:write, plugins:publish, members:manage, roles:manage, compliance:write, billing:manage, reports:rollup, org:settings). A user’s effective permissions are the union of the Roles assigned to them — there is no separate role-based baseline. Every org seeds built-in Roles (Admin, Member; the system org also gets Super Admin), and admins with roles:manage can add custom Roles (e.g. “Billing Manager”); Super Admins hold all. Endpoints enforce writes via requirePermission(...), and :read permissions are enforced too (withholding e.g. reports:read blocks that read). registry:read/write are Super-Admin-only and never grantable to a custom Role.
Full catalog, built-in bundles, enforcement, and session-invalidation: see Roles & Permissions.
Manage Roles from the dashboard, or via the API:
GET|POST /api/organization/:id/roles # list / create Roles
PUT|DELETE /api/organization/:id/roles/:roleId # update / delete a Role
POST|DELETE /api/organization/:id/roles/:roleId/members/:uid # add / remove a Role member
A team is an organization nested one level under a parent (root) organization. Nesting is opt-in — every organization is a flat root until you create a team under it, and teams can’t have their own sub-teams (the hierarchy is one level deep). A team is a full organization: it has its own members, roles, quotas, secrets, and billing.
What the parent ↔ team relationship adds on top of plain organizations:
A user can belong to several organizations and teams at once and acts within one at a time (switch with the org switcher). A parent-org admin can also open any of its teams from the switcher without being on the team — the session runs as admin there on the authority inherited from the parent, with no roster entry and no seat (see Authentication). A parent admin can delete one of its teams (restorable during the retention window from the parent’s recently-deleted list); a sysadmin can move a team to another eligible root, split it out as a standalone org, or bring a team-less root in as a team.
Creating / managing teams — on the dashboard Members page, an admin of a root org uses Create Team to nest a new team and Manage teams (per member) to add or remove a member across the org’s teams in one step. Via the API, POST /api/organization accepts a parentOrgId, and POST /api/organization/:id/members/bulk-add adds a user to several teams at once. Team-only UI (the Teams list, Manage teams, the “Include child teams” rollup toggles on Reports and Executions, and the per-team usage and cost-by-team breakdowns on Billing) appears only once an org actually has a team. GET /api/user/organizations reports each membership’s childOrgCount for this purpose; Create Team itself is always shown on an eligible root org.
| Feature | Developer | Pro | Team | Enterprise |
|---|---|---|---|---|
| Pipeline / plugin CRUD | yes | yes | yes | yes |
| AI pipeline generation | - | yes | yes | yes |
| AI plugin generation | - | yes | yes | yes |
| Bulk operations | - | yes | yes | yes |
| Audit log | - | - | yes | yes |
| Advanced Reporting (DORA) | add-on | add-on | add-on | yes |
| Team Usage Analytics | - | add-on | add-on | yes |
| Custom integrations | - | - | - | yes |
| Priority support | - | yes | yes | yes |
| Plugins | 25 | 50 | 75 | 150 |
| Pipelines | 2 | 5 | 6 | 30 |
| Seats (members) | 1 | 1 | 3 | 15 |
| Price / month | $0 | $39 | $79 | $599 |
Unlimited — a fifth tier with every quota uncapped and all features on. It is the default tier when billing is disabled (BILLING_ENABLED=false), so a self-hosted install with no billing runs everything uncapped out of the box. When billing is enabled it is never shown, selectable, or purchasable — it is filtered out of the plans list and tier pickers.
System org users always have access to all features. Base limits are raised by add-on bundles and are env-overridable (QUOTA_TIER_<TIER>_<LIMIT>, BILLING_PLAN_<TIER>_MONTHLY).
Add-on bundles — an account can stack purchasable add-ons on top of its tier to raise pooled caps (extra seats, pipelines, plugins, API/AI calls, storage) or unlock features (Advanced Reporting, Team Usage Analytics, curated compliance libraries — SSO is a Team-tier feature, not an add-on). Effective limits = tier base + add-ons, shared across the account’s teams. See Billing Add-on Bundles.
flowchart TB
UI[Dashboard / CLI] --> NGINX[Nginx<br/>TLS + Routing]
NGINX --> PIPE[Pipeline Service]
NGINX --> PLUG[Plugin Service]
NGINX --> PLAT[Platform Service]
PIPE --> COMP[Compliance]
PLUG --> REP[Reporting]
PLAT --> QB[Quota / Billing]
COMP & REP & QB --> DB[(PostgreSQL / MongoDB / Redis)]
| Service | Purpose |
|---|---|
| Platform | Auth, orgs, users, JWT, RBAC |
| Pipeline | Pipeline CRUD, AI generation, CDK synthesis |
| Plugin | Plugin CRUD, Docker image builds, AI generation |
| Compliance | Per-org rule enforcement, policy management, audit trail |
| Reporting | Execution analytics via EventBridge ingestion |
| Quota | Resource limits per organization |
| Billing | Subscriptions and usage billing |
| Message | Org announcements and conversations |
For end-to-end request → build → deploy flow diagrams, see Architecture Flow. For the case for adopting Pipeline Builder org-wide, see Organization Benefits.
119 plugins across 10 categories. See the Plugin Catalog for the full list.
| Category | Count | Details |
|---|---|---|
| Language | 11 | Java, Python, Node.js, Go, Rust, .NET |
| Security | 34 | Snyk, SonarCloud, Trivy, Veracode, Semgrep |
| Quality | 17 | ESLint, Prettier, Checkstyle, Clippy, Ruff |
| Testing | 14 | Jest, Pytest, Cypress, Playwright, k6 |
| Artifact | 16 | Docker, ECR, GHCR, npm, PyPI, Maven |
| Deploy | 13 | Terraform, CloudFormation, Kubernetes, Helm, CDK |
| Infrastructure | 5 | CDK synth, manual approval, S3 cache, shell |
| Monitoring | 3 | Datadog, New Relic, Sentry |
| Notification | 5 | Slack, Teams, PagerDuty, email |
| AI | 1 | Dockerfile generation (multi-provider) |