Remote operator

The AI agent for BYOC operations.

One container. Zero open ports. Customer-approved.

  • ext-customer-1
    Dana K.

    ingestion has been slow since this morning

    33 repliesLast reply 2 hours ago
  • ext-customer-2
    Noor H.

    queries time out after the upgrade

    33 repliesLast reply 2 hours ago
  • ext-customer-3
    Ravi M.

    we upgraded Postgres to 16 and it won't start

    33 repliesLast reply 2 hours ago
  • ext-customer-4
    Ben L.

    any update? this is blocking our launch

    33 repliesLast reply 2 hours ago
  • ext-customer-5
    Mia T.

    getting 503s on the internal endpoint

    11 repliesLast reply 2 hours ago
  • ext-customer-6
    Alex P.

    disk is at 92% on the data node

    11 repliesLast reply 2 hours ago

A lightweight container in each customer deployment,
connected over outbound HTTPS to your control plane.

your-chart/1 file added
β”œβ”€β”€ Chart.yaml
β”œβ”€β”€ values.yaml
└── templates/
    β”œβ”€β”€ deployment.yaml
    β”œβ”€β”€ service.yaml
    └── operator.yaml

# values.yaml Β· one block per installation
operator:
  registrationToken: <shown once>

Add it to the Helm chart, Terraform, Pulumi, or ECS task your customers already install. Enable it one customer at a time.

Not broad access and not credentials,
but a list of predefined operations each customer can review.

Built-in operations.

Ready to use on the stack your product runs on.

See all operations
readkubernetes/get-pods
changekubernetes/restart-pod

Your own operations.

Turn your runbooks into operations for your product. One function per operation, published under your name. Same policy and approvals as the built-in ones.

Build custom operations
src/ops.rsone read, one change
// Read-only. Runs on its own under most customer policies.
async fn shard_status() -> PluginResult {
  let shards = indexer::shards().await?;
  PluginResult::success_json(&json!({ "shards": shards }))
}

// Mutating. Waits for the customer's approval.
async fn rebuild_index(shard: &str) -> PluginResult {
  indexer::rebuild(shard).await?;
  PluginResult::success_json(&json!({ "rebuilt": shard }))
}

Every operation is declared read-only or mutating, and each customer’s policy is written in those terms.
Start with the built-in ones, or scaffold your own plugin with alien operations init.

Give your own agents the superpower of fixing customer deployments,
with one customer approval per fix.

Your agent
>_ OpenAI Codex (v0.132.0)
mcp:βœ“ alien
βœ“ alien Β· customer-7/prod Β· 23 tools, one per operation, no shell: kubernetes/events, kubernetes/logs, kubernetes/restart-pod, postgres/activity, postgres/locks, postgres/terminate-query, s3/list-objects, …
β€Ίcustomer-7/prod: every query has been timing out since their Postgres upgrade this morning. find out why and fix it
β€’Working(esc to interrupt)
Your customer’s SlackCustomer 7 Β· your product’s app, white-labeled
opsCustomer 7 workspace
Priya S.

every query is timing out since the upgrade this morning, opened a ticket with the vendor

Over CLI and MCP. One time-boxed access request covers the operations a fix needs, and the customer approves it once, in Slack or with kubectl.
Reads their policy allows run right away. Everything inside the window is recorded.

Or just tag Alien’s agent in Slack.

Follows every install and every release.

It follows every install to healthy and watches every release. When one fails, it reads your repo at that commit.

What it watches
deploymentsyour Slack
AlienAPP

New deployment customer-7/prod registered from your CloudFormation stack. Following the rollout.

Answers when you tag it.

Same operations, same policy, same approvals. It opens a scoped session, traces the failure, and tells you whose side it’s on.

See an investigation
incident-roomThread Β· INC-0042
Dana K.

@Alien what’s going on with Customer 1’s deployment? checkout is down

Alien opened a scoped session Β· customer-1/prod Β· read-only Β· 1h
AlienAPP

Thought for 34s

checkout is in CrashLoopBackOff: AccessDenied: dynamodb:GetItem. Its IAM role lost that permission at 8:52, changed in their account. Nothing on our side changed.

AlienAPP

Sent their DevOps the one-line policy fix in #ext-customer-1. I’ll confirm here once the pods are Ready. πŸ€¦β€β™‚οΈ

Each customer decides which operations run on their own
and which wait for their approval.

Operation classClick a cell to change the policy
Customer 1AWS Β· EKS
Customer 3Azure Β· AKS Β· regulated
Customer 5on-prem cluster
Read-only operationskubernetes/logs Β· postgres/activity Β· s3/list-objects
Mutating operationskubernetes/restart-pod Β· kubernetes/scale
Namespace debug sessionexec into one pod Β· time-boxed Β· recorded
Destructive operationsdelete volume Β· drop index Β· purge queue

Same operations, three answers. Access expires on its own. A bigger action never inherits approval from a smaller one.

Approved where the customer already works.Time-bound and scoped to named operations.

Slack, kubectl, and more.

The request names the operations, the reason, and how long. Approval unlocks exactly those.

How approvals work
ext-customer-1Only Dana can see this message
Your productAPP

6-hour access request

Why: ingestion latency reported this morning
Scope: production Β· namespace app

  • Kubernetes / logs, events, workloads Β· app
  • Kubernetes / restart one pod Β· separate approval required
  • AWS / SQS, CloudWatch Β· read
Diagnostics only by default. No secrets or shell access.

What their security team reviews.

No inbound port, no cross-account role. Credentials never leave the customer’s account.

What they review
Network reviewCustomer 1 Β· security team Approved
  • Inbound ports0
  • VPN, bastion, jump hostnone
  • Cross-account rolenone
  • OutboundHTTPS 443 to your control plane
  • Credentialsstay in the customer’s account
  • Kubernetes accessone ServiceAccount, namespace-scoped

Everything around the operation.

Every deployment, one heartbeat away.

Health, version, and connection per customer. An offline site keeps its queue.

Inventory and health
DeploymentsLast heartbeat
Customer 1prod Β· AWS Β· EKS3f9a2c11s ago
Customer 3prod Β· Azure Β· AKS3f9a2c11s ago
Customer 5prod Β· on-premb47e0d9offline 42:00
Customer 6prod Β· AWS Β· ECS3f9a2c11s ago
Customer 8staging Β· GCP Β· GKE3f9a2c11s ago
Customer 5 lost its WAN link. Two operations are queued and run when it reconnects. Cancel them any time.

A record of every request, approval, and result.

Who asked, who approved, what ran, what it changed, whether it worked.

Audit log
INC-0042 Β· Customer 1 Β· prodclosed
  1. Access requestedengineer Β· kubernetes/restart-pod Β· 6h Β· reason attached
  2. Approved by your teamCustomer 1 / prod confirmed as the target
  3. Approved by the customerSlack Β· expires 15:47
  4. kubernetes/restart-podpod=ingester-p4kwm Β· 18.7s Β· SUCCEEDED
  5. Verifiedreplacement Ready Β· queue age 47m β†’ 4m

White-labeled, end to end.

The release, the image, the CRD, the Slack app. Your customers never see the word Alien.

Branding
What the customer seesCustomer 1 Β· production namespace Your brand
  • Helm releaseacme-operator
  • Container imageregistry.acme.io/operator
  • Access request CRDaccessrequests.acme.io
  • ServiceAccountacme-operator
  • Slack appAcme Support
  • The word β€œAlien”nowhere

When it does not fit an operation.

A time-boxed, recorded session with kubectl, aws, gcloud, or az. Same approval, same record.

Remote debugging
your terminalthe CLIs you already use
$ alien debug customer-1/prod --duration 30m -- kubectl get pods -n app
session dbg_2q8x4v Β· approved by the customer Β· recorded Β· expires in 30m
NAME              READY   STATUS    RESTARTS   AGE
api-7f8c          2/2     Running   0          6d
ingester-p4kwm    1/2     Running   3          6d

$ alien debug customer-1/prod -- aws sqs get-queue-attributes --queue-url $Q
{ "ApproximateNumberOfMessages": "2310842" }

Run the control plane in your cloud.
No new subprocessor for your customers. The operator only ever talks to you.

Your cloud
Your teamEngineers Β· agents Β· Slack
Control planepolicy Β· approvals Β· history
Customer environment
Your Helm chart Β· their cluster
apiworkeringester
operatorone container Β· your name on it

What their security team asks.

What can the vendor run in our environment?

Only the operations you enabled, each one named and declared read-only or mutating. There is no shell by default. Your policy says which operations run on their own and which wait for your approval.

How does it reach us?

It does not. One container in your deployment opens an outbound HTTPS connection and pulls its work. No inbound port, VPN, bastion, or cross-account role. Its permissions are one ServiceAccount and the cloud identity you give it.

Who approves a change?

You do, per operation, with kubectl or in Slack. Approval is time-bound and runs nothing by itself. Each operation in the window is recorded on its own, and the approval lands in your own audit log too.

How do we turn it off?

Delete the release. The container stops, its RBAC is removed, and the connection closes. Nothing else was installed.

Add the operator to one test installation.

Pick one read-only operation, add the container to your chart or task, and watch the installation appear. Then enable it for the customer who asked.

Talk to us Open the quickstart