Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,7 @@ Your CI/CD ──► Ctrlplane ──► Your Infrastructure

## :zap: Quick Start

The fastest way to get started is with [Ctrlplane Cloud](https://app.ctrlplane.dev).

For self-hosted options, see our [installation guide](https://docs.ctrlplane.dev/installation).
See our [installation guide](https://docs.ctrlplane.dev/installation) to get started.

| Method | Link |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
Expand Down
10 changes: 6 additions & 4 deletions apps/api/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ import type { paths } from "./types/openapi.js";
export type { operations as Operations } from "./types/openapi.js";
export type { paths } from "./types/openapi.js";

export default function createClient(
options: ClientOptions & { apiKey?: string },
) {
export interface CreateClientOptions extends ClientOptions {
baseUrl: string;
apiKey?: string;
}

export default function createClient(options: CreateClientOptions) {
return createOClient<paths>({
baseUrl: options.baseUrl ?? "https://app.ctrlplane.dev",
...options,
headers: {
...(options.apiKey ? { "x-api-key": options.apiKey } : {}),
Expand Down
4 changes: 2 additions & 2 deletions docs/cli/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Set your API key and workspace as environment variables or pass them as flags:
# Environment variables (recommended)
export CTRLPLANE_API_KEY="your-api-key"
export CTRLPLANE_WORKSPACE="your-workspace-id"
export CTRLPLANE_URL="https://app.ctrlplane.dev"
export CTRLPLANE_URL="https://your-ctrlplane-instance.com"

# Or pass as flags
ctrlc --api-key "your-api-key" --workspace "your-workspace-id" <command>
Expand Down Expand Up @@ -83,7 +83,7 @@ ctrlc apply -f resource.yaml
| ------------- | --------------------- | -------------------------------------------------------- |
| `--api-key` | `CTRLPLANE_API_KEY` | API key for authentication |
| `--workspace` | `CTRLPLANE_WORKSPACE` | Workspace name or ID |
| `--url` | `CTRLPLANE_URL` | Ctrlplane API URL (default: `https://app.ctrlplane.dev`) |
| `--url` | `CTRLPLANE_URL` | Ctrlplane API URL |

## Next Steps

Expand Down
4 changes: 2 additions & 2 deletions docs/concepts/resources.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ Resource Providers continuously sync resources from external sources:
import { createClient } from "@ctrlplane/node-sdk";

const client = createClient({
baseUrl: "https://app.ctrlplane.dev",
baseUrl: "https://your-ctrlplane-instance.com",
apiKey: process.env.CTRLPLANE_API_KEY,
});

Expand Down Expand Up @@ -366,7 +366,7 @@ ctrlc api get resource {resourceId}
import { createClient } from "@ctrlplane/node-sdk";

const client = createClient({
baseUrl: "https://app.ctrlplane.dev",
baseUrl: "https://your-ctrlplane-instance.com",
apiKey: process.env.CTRLPLANE_API_KEY,
});

Expand Down
7 changes: 1 addition & 6 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -182,12 +182,7 @@
"dark": "/logo/dark.svg"
},
"navbar": {
"links": [],
"primary": {
"type": "button",
"label": "Dashboard",
"href": "https://app.ctrlplane.dev"
}
"links": []
},
"contextual": {
"options": [
Expand Down
34 changes: 8 additions & 26 deletions docs/installation.mdx
Original file line number Diff line number Diff line change
@@ -1,40 +1,22 @@
---
title: "Installation"
description:
"Deploy Ctrlplane to your infrastructure or use the managed cloud offering."
"Deploy Ctrlplane to your infrastructure."
---

Ctrlplane can be deployed as a managed service or self-hosted in your
infrastructure. This guide covers production-ready deployment options for
platform teams.
Ctrlplane is self-hosted and can be deployed on your infrastructure. This guide
covers production-ready deployment options for platform teams.

## Deployment Options

| Option | Best For | Maintenance |
| --------------- | ---------------------------------- | ------------ |
| Ctrlplane Cloud | Teams wanting zero ops overhead | Managed |
| Kubernetes | Production self-hosted deployments | Self-managed |
| Docker Compose | Development and evaluation | Self-managed |

## Ctrlplane Cloud (Recommended)

The easiest way to get started is with Ctrlplane Cloud:

1. Go to [app.ctrlplane.dev](https://app.ctrlplane.dev)
2. Sign up for a free account
3. Create a workspace
4. Start deploying!

**Benefits**:

- No infrastructure to manage
- Automatic updates
- Built-in high availability
- Free tier available
| Option | Best For | Maintenance |
| -------------- | ---------------------------------- | ------------ |
| Kubernetes | Production self-hosted deployments | Self-managed |
| Docker Compose | Development and evaluation | Self-managed |

## Self-Hosted Options

If you prefer to self-host Ctrlplane, you have several options:
Choose the deployment method that best fits your infrastructure:

### Docker Compose (Development & Testing)

Expand Down
2 changes: 1 addition & 1 deletion docs/integrations/cicd.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ For environments where the CLI isn't available, use the REST API:
POST /api/v1/deployments/{deploymentId}/versions

curl -X POST \
"https://app.ctrlplane.dev/api/v1/deployments/{deploymentId}/versions" \
"https://your-ctrlplane-instance.com/api/v1/deployments/{deploymentId}/versions" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Expand Down
5 changes: 3 additions & 2 deletions docs/integrations/job-agents/ansible.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ jobs:
uses: ctrlplanedev/get-job-inputs@v1
id: job
with:
base_url: ${{ secrets.CTRLPLANE_BASE_URL }}
job_id: ${{ inputs.job_id }}
api_key: ${{ secrets.CTRLPLANE_API_KEY }}

Expand Down Expand Up @@ -159,15 +160,15 @@ The workflow should update job status. You can use the Ctrlplane API:
- name: Mark job successful
if: success()
run: |
curl -X PATCH "https://app.ctrlplane.dev/api/v1/jobs/${{ inputs.job_id }}" \
curl -X PATCH "https://your-ctrlplane-instance.com/api/v1/jobs/${{ inputs.job_id }}" \
-H "Authorization: Bearer ${{ secrets.CTRLPLANE_API_KEY }}" \
Comment on lines 160 to 164
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The workflow example in this guide uses ctrlplanedev/get-job-inputs@v1 without base_url, but the action now requires it. Please update the example to include base_url so the documented workflow works as-is.

Copilot uses AI. Check for mistakes.
-H "Content-Type: application/json" \
-d '{"status": "successful"}'

- name: Mark job failed
if: failure()
run: |
curl -X PATCH "https://app.ctrlplane.dev/api/v1/jobs/${{ inputs.job_id }}" \
curl -X PATCH "https://your-ctrlplane-instance.com/api/v1/jobs/${{ inputs.job_id }}" \
-H "Authorization: Bearer ${{ secrets.CTRLPLANE_API_KEY }}" \
-H "Content-Type: application/json" \
-d '{"status": "failure"}'
Expand Down
6 changes: 4 additions & 2 deletions docs/integrations/job-agents/github.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ jobs:
uses: ctrlplanedev/get-job-inputs@v1
id: job
with:
base_url: ${{ secrets.CTRLPLANE_BASE_URL }}
job_id: ${{ inputs.job_id }}
api_key: ${{ secrets.CTRLPLANE_API_KEY }}

Expand Down Expand Up @@ -350,15 +351,15 @@ using the Ctrlplane API:
- name: Mark job successful
if: success()
run: |
curl -X PATCH "https://app.ctrlplane.dev/api/v1/jobs/${{ inputs.job_id }}" \
curl -X PATCH "https://your-ctrlplane-instance.com/api/v1/jobs/${{ inputs.job_id }}" \
-H "Authorization: Bearer ${{ secrets.CTRLPLANE_API_KEY }}" \
Comment on lines 351 to 355
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doc shows ctrlplanedev/get-job-inputs@v1 usage without base_url, but the action now requires that input. Please update the workflow examples in this page to include base_url (e.g., your Ctrlplane instance URL) so the instructions remain valid.

Copilot uses AI. Check for mistakes.
-H "Content-Type: application/json" \
-d '{"status": "successful"}'

- name: Mark job failed
if: failure()
run: |
curl -X PATCH "https://app.ctrlplane.dev/api/v1/jobs/${{ inputs.job_id }}" \
curl -X PATCH "https://your-ctrlplane-instance.com/api/v1/jobs/${{ inputs.job_id }}" \
-H "Authorization: Bearer ${{ secrets.CTRLPLANE_API_KEY }}" \
-H "Content-Type: application/json" \
-d '{"status": "failure"}'
Expand All @@ -385,6 +386,7 @@ jobs:
uses: ctrlplanedev/get-job-inputs@v1
id: job
with:
base_url: ${{ secrets.CTRLPLANE_BASE_URL }}
job_id: ${{ inputs.job_id }}
api_key: ${{ secrets.CTRLPLANE_API_KEY }}

Expand Down
6 changes: 3 additions & 3 deletions docs/integrations/resource-providers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Create custom providers using the Ctrlplane API or SDK.

```bash
# Create or update a resource
curl -X PUT "https://app.ctrlplane.dev/api/v1/workspaces/{workspaceId}/resources" \
curl -X PUT "https://your-ctrlplane-instance.com/api/v1/workspaces/{workspaceId}/resources" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Expand Down Expand Up @@ -151,7 +151,7 @@ echo "$INSTANCES" | jq -c '.[]' | while read instance; do
ENV=$(echo "$instance" | jq -r '.Tags[] | select(.Key=="Environment") | .Value')
REGION=$(echo "$instance" | jq -r '.Placement.AvailabilityZone' | sed 's/.$//')

curl -X PUT "https://app.ctrlplane.dev/api/v1/workspaces/${WORKSPACE_ID}/resources" \
curl -X PUT "https://your-ctrlplane-instance.com/api/v1/workspaces/${WORKSPACE_ID}/resources" \
-H "Authorization: Bearer ${CTRLPLANE_API_KEY}" \
-H "Content-Type: application/json" \
-d "{
Expand Down Expand Up @@ -231,7 +231,7 @@ When resource metadata or config changes, Ctrlplane:

```bash
curl -X DELETE \
"https://app.ctrlplane.dev/api/v1/resources/{resourceId}" \
"https://your-ctrlplane-instance.com/api/v1/resources/{resourceId}" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY"
```

Expand Down
10 changes: 5 additions & 5 deletions docs/integrations/resource-providers/custom.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Use custom providers when you need to sync:
### Create or Update a Resource

```bash
curl -X PUT "https://app.ctrlplane.dev/api/v1/workspaces/{workspaceId}/resources" \
curl -X PUT "https://your-ctrlplane-instance.com/api/v1/workspaces/{workspaceId}/resources" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Expand All @@ -45,14 +45,14 @@ curl -X PUT "https://app.ctrlplane.dev/api/v1/workspaces/{workspaceId}/resources

```bash
curl -X DELETE \
"https://app.ctrlplane.dev/api/v1/resources/{resourceId}" \
"https://your-ctrlplane-instance.com/api/v1/resources/{resourceId}" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY"
```

### List Resources

```bash
curl "https://app.ctrlplane.dev/api/v1/workspaces/{workspaceId}/resources" \
curl "https://your-ctrlplane-instance.com/api/v1/workspaces/{workspaceId}/resources" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY"
```

Expand Down Expand Up @@ -98,7 +98,7 @@ setInterval(syncResources, 5 * 60 * 1000); // Every 5 minutes
# sync-resources.sh

WORKSPACE_ID="your-workspace-id"
API_URL="https://app.ctrlplane.dev/api/v1"
API_URL="https://your-ctrlplane-instance.com/api/v1"

# Discover resources (example: from cloud provider)
INSTANCES=$(aws ec2 describe-instances --query 'Reservations[].Instances[]')
Expand Down Expand Up @@ -135,7 +135,7 @@ import time

API_KEY = os.environ["CTRLPLANE_API_KEY"]
WORKSPACE_ID = os.environ["CTRLPLANE_WORKSPACE"]
API_URL = "https://app.ctrlplane.dev/api/v1"
API_URL = "https://your-ctrlplane-instance.com/api/v1"

def sync_resource(resource):
"""Upsert a resource to Ctrlplane."""
Expand Down
6 changes: 3 additions & 3 deletions docs/inventory/relationships.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ fromSelector:
### Create a Rule

```bash
curl -X POST "https://app.ctrlplane.dev/api/v1/workspaces/{workspaceId}/relationship-rules" \
curl -X POST "https://your-ctrlplane-instance.com/api/v1/workspaces/{workspaceId}/relationship-rules" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Expand Down Expand Up @@ -290,7 +290,7 @@ curl -X POST "https://app.ctrlplane.dev/api/v1/workspaces/{workspaceId}/relation
### Update a Rule

```bash
curl -X PUT "https://app.ctrlplane.dev/api/v1/relationship-rules/{ruleId}" \
curl -X PUT "https://your-ctrlplane-instance.com/api/v1/relationship-rules/{ruleId}" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Expand All @@ -302,7 +302,7 @@ curl -X PUT "https://app.ctrlplane.dev/api/v1/relationship-rules/{ruleId}" \
### Delete a Rule

```bash
curl -X DELETE "https://app.ctrlplane.dev/api/v1/relationship-rules/{ruleId}" \
curl -X DELETE "https://your-ctrlplane-instance.com/api/v1/relationship-rules/{ruleId}" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY"
```

Expand Down
4 changes: 2 additions & 2 deletions docs/policies/verification/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -330,15 +330,15 @@ For sensitive values like API keys, use deployment variables:
1. **Create a deployment variable**:

```bash
curl -X POST https://app.ctrlplane.dev/api/v1/deployments/{deploymentId}/variables \
curl -X POST https://your-ctrlplane-instance.com/api/v1/deployments/{deploymentId}/variables \
-H "Authorization: Bearer $CTRLPLANE_API_KEY" \
-d '{"key": "dd_api_key", "description": "Datadog API key"}'
```

2. **Set the value**:

```bash
curl -X POST https://app.ctrlplane.dev/api/v1/deployments/{deploymentId}/variables/{variableId}/values \
curl -X POST https://your-ctrlplane-instance.com/api/v1/deployments/{deploymentId}/variables/{variableId}/values \
-H "Authorization: Bearer $CTRLPLANE_API_KEY" \
-d '{"value": "your-actual-api-key"}'
```
Expand Down
3 changes: 1 addition & 2 deletions docs/quickstart.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@ flowchart LR

## Prerequisites

- Ctrlplane account ([app.ctrlplane.dev](https://app.ctrlplane.dev) or
[self-hosted](./installation))
- Ctrlplane account ([self-hosted](./installation))
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Quickstart workflow example later in this doc uses ctrlplanedev/get-job-inputs@v1, but the action now requires base_url (see github/get-job-inputs/action.yml). Update the example to pass base_url so readers can copy/paste successfully.

Copilot uses AI. Check for mistakes.
- API key (Settings → API Keys)
- GitHub repository with CI workflow

Expand Down
2 changes: 1 addition & 1 deletion docs/reference/cel.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ resource.kind == "KubernetesCluster"
Use the API to test your CEL expressions:

```bash
curl -X POST "https://app.ctrlplane.dev/api/v1/workspaces/{workspaceId}/resources/query" \
curl -X POST "https://your-ctrlplane-instance.com/api/v1/workspaces/{workspaceId}/resources/query" \
-H "Authorization: Bearer $CTRLPLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
Expand Down
2 changes: 1 addition & 1 deletion docs/rfc/0007-manual-action-job-agent.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ configured channel with an interactive Block Kit layout:
"type": "plain_text",
"text": "View in Ctrlplane"
},
"url": "https://app.ctrlplane.dev/workspaces/.../jobs/<job-id>"
"url": "https://your-ctrlplane-instance.com/workspaces/.../jobs/<job-id>"
}
]
}
Expand Down
3 changes: 1 addition & 2 deletions github/get-job-inputs/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ author: "Ctrlplane"
inputs:
base_url:
description: "The ctrlplane base url to get job inputs from"
required: false
default: "https://app.ctrlplane.dev"
required: true
api_key:
description: "API key for authentication"
required: true
Expand Down
5 changes: 2 additions & 3 deletions github/get-job-inputs/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion integrations/github-get-job-inputs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ const getJob = async (jobId: string): Promise<JobWithWorkspace | null> => {

async function run() {
const jobId: string = core.getInput("job_id", { required: true });
const baseUrl = core.getInput("base_url") || "https://app.ctrlplane.dev";
const baseUrl = core.getInput("base_url", { required: true });

const job = await getJob(jobId);
if (job == null) {
Expand Down
2 changes: 1 addition & 1 deletion integrations/github-get-job-inputs/src/sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const maybeAppendApiToBaseUrl = (baseUrl: string) => {

export const api = createClient({
baseUrl: maybeAppendApiToBaseUrl(
core.getInput("base_url") || "https://app.ctrlplane.dev",
core.getInput("base_url", { required: true }),
),
headers: { "X-API-Key": core.getInput("api_key", { required: true }) },
});
Loading