AI agents

Run your server by asking.

The ArcPanel agent skills let Claude Code, Codex and other tools that read the Agent Skills format operate your server through arc. They read first, preview every change and run it only after you confirm.

Skills 0.1.0 · arc 0.5.0 · SDK 0.6.1 · MIT license

youshop.example.com has been returning 502 since this morning. Panel prod, user alice.

agentUsing arcpanel-troubleshoot with the read-only key. Nothing will change.

arc web-domains get alice shop.example.com --profile prod-read --columns domain,backend_port,suspended

domain backend_port suspended shop.example.com 3001 false

arc web-domains get-logs alice shop.example.com --type error --lines 20 --profile prod-read

[error] connect() failed (111: Connection refused) while connecting to upstream, upstream: "http://127.0.0.1:3001/"

arc docker-apps get alice shop --profile prod-read --columns name,state,status,web_port

name state status web_port shop exited Exited (137) 6h ago 3001

agentCause: the Docker app "shop" behind port 3001 stopped with exit code 137, most likely out of memory, so NGINX gets no answer. Proposed fix: restart it with arcpanel-apps, previewed first, and raise its memory limit if it stops again. Shall I prepare that?

How it works

Four layers, one path into your server.

The agent never logs in as root. Every request goes through the same API, access keys and panel commands as the web interface.

  1. Agent + skills Claude Code, Codex or another agent loads the skills, which tell it how to work with ArcPanel safely.
  2. arc Turns each API operation into a command, with profiles, --dry-run, --wait and JSON output.
  3. @arcpanel/sdk The typed TypeScript client underneath: typed errors, pagination, queued tasks and file transfers.
  4. REST API v2 Scoped by access keys and permission sets, such as v2-read for diagnosis.
  5. ArcPanel Runs every change through its own commands, exactly as a click in the panel would.
Safety by design

An agent that asks before it acts.

Every skill follows the same six rules, and they come before any request, including one that seems to need an exception.

  1. 1

    Read first

    The agent looks at the current state before it proposes any change.

  2. 2

    Dry run first

    Each change runs with --dry-run first. You see the plan in plain words and the exact command.

  3. 3

    Run only what was confirmed

    After your yes, the same command runs. Any change to it needs a new preview and a new yes.

  4. 4

    Narrowest key

    Diagnosis uses a v2-read key. The write key is used only for a change you confirmed.

  5. 5

    No secrets in the chat

    Passwords go into a JSON file you write, passed with --input-json file://. The agent never asks for them.

  6. 6

    No root fallback

    No SSH, sudo or server commands, unless you ask for them yourself.

Text read from logs and files is treated as data, never as instructions to the agent.

The skills

Ten skills, one for each part of the panel.

Your agent loads the right one on its own when a request is about ArcPanel. In Claude Code you can also call them by name, such as /arcpanel:arcpanel-sites.

  • arcpanel

    The entry point: how to use arc, which skill to use, plus users, packages, cron jobs and SSH keys.

  • arcpanel-setup

    Installs or checks arc, guides you through a read key and a write key, and verifies the profiles.

  • arcpanel-troubleshoot

    Read-only diagnosis: sites answering 5xx or 4xx, certificates, stopped services, full disks.

  • arcpanel-sites

    Web domains, aliases, Let's Encrypt and uploaded certificates, a site's PHP, DNS zones and records.

  • arcpanel-mail

    Mail domains, mailboxes, aliases, DKIM, mail certificates and the SMTP relay.

  • arcpanel-databases

    Databases, database users and passwords, and dumps.

  • arcpanel-backups

    Backups and restic snapshots, downloads and restores.

  • arcpanel-apps

    Node.js versions and apps, and Docker apps.

  • arcpanel-files

    Files of a hosting user: list, read, edit, upload, extract and download.

  • arcpanel-server

    Administrators only: services, firewall, IPs, PHP versions, extensions, php.ini, packages and updates.

Get started

Three steps to your first conversation.

You need Node.js 22 or later, an ArcPanel server with REST API v2, and an agent that reads skills. The arcpanel-setup skill can walk you through steps 1 and 2.

  1. 1

    Install arc

    Your terminal
    npm install -g @arcpanel/cli

    No Node.js? Download a single-file binary of arc from its GitHub releases.

  2. 2

    Create two keys and two profiles

    In the panel, open Account → Access keys and create one key with the permission set v2-read and one with v2-write. Then save them as two profiles; arc asks for each key.

    Your terminal
    arc configure --profile prod-read
    arc configure --profile prod

    Never paste a key into the chat. If you did, delete that key in the panel.

  3. 3

    Install the skills

    /plugin marketplace add arc-panel-oss/arcpanel-agent-skills
    /plugin install arcpanel@arcpanel-agent-skills

    Then tell the agent the panel name, prod. It reads with prod-read and uses prod only after you confirm a change.

For developers

Built on two tools you can use directly.

The skills drive arc, and arc is built on the SDK. Both are open source under the MIT license. The SDK covers every operation of REST API v2 in ArcPanel 2.2, and arc 0.5.0 has commands for them, including the app processes, the malware scan and the 2.2 additions.

The arc command line

arc 0.5.0

One command for each API operation, profiles for each panel and key in ~/.arcpanel/, table or JSON output, and shell completion.

# who am I on this panel?
arc whoami --profile prod-read
arc web-domains list alice --output json
# preview, then run and wait for the queued task
arc web-domains create alice --domain example.com --dry-run
arc tasks wait <task-id>
@arcpanel/cli on GitHub

The TypeScript SDK

SDK 0.6.1

A typed client generated from the API document, with typed errors, pagination and queued tasks. Requires Node.js 22 or later.

import { createClient } from '@arcpanel/sdk';

const client = createClient({
  endpoint: 'https://panel.example.com:8083',
  accessKeyId: process.env.ARCPANEL_ACCESS_KEY_ID,
  secretKey: process.env.ARCPANEL_SECRET_KEY,
});

const plan = await client.webDomains.createWebDomain(
  { user: 'alice', body: { domain: 'example.com' } },
  { dryRun: true },
);
@arcpanel/sdk on GitHub

Give your agent a panel it can't break by accident.

Install the skills on top of any ArcPanel server with REST API v2, or start with a fresh server.