coprctl: a helper for the Fedora Copr build service
Description: A command-line and agent interface for the Fedora Copr build service. Copr does the building; coprctl makes it easier to drive, in a terminal or from an agent.

Fedora Copr · one binary · no runtime

# A friendlier front end
to Fedora Copr.

coprctl is a command-line and agent interface for the Fedora Copr build service. Copr does the heavy lifting: it turns your sources into signed RPM repositories. coprctl makes that easier to drive, in a terminal or from an agent.

# the project's own Copr repo $ dnf copr enable abn/coprctl $ dnf install coprctl
The simplest path on Fedora. The Copr repo installs the binary and keeps it updated with your distro.
# a single static binary, from source $ go install github.com/abn/coprctl/cmd/coprctl@latest
Works anywhere with the Go toolchain. One binary, no runtime.
# existing Copr credentials are picked up automatically $ coprctl auth status # fresh, or to add another instance $ coprctl auth login
If you already use Copr, coprctl reads `~/.config/copr` with no import. `auth login` sets up a fresh token or an extra instance.
coprctl — a first build
/01

## One grammar, everywhere.

Every command is `coprctl <resource> <verb> [ref]`. A new source type is a flag value, never a new command. Learn it once, drive it by hand or by machine.

binary
coprctl
the single static tool
→
resource · the noun
project, build, log
what you are acting on
→
verb
list, watch, tail
what you want done
→
ref
owner/project[:dir]
the one reference syntax
$ coprctl build watch me/hello # tail a build to completion $ coprctl log tail me/hello --chroot fedora-rawhide-x86_64 $ coprctl project list --output json # pipes → json by default
/02

## Built for people and agents.

live logs

### Tail builds without polling.

Watch the logs Copr already produces, across chroots, with one command.

- `coprctl log tail`multi-chroot
- `coprctl build watch`to completion

machine-readable

### Structured output.

`--output json|jsonl|yaml` on every command. Human output is a rendering of the same structs.

- `stable exit codes`4·8·9·12
- `structured errors`code + hint

declarative

### Project state as code.

A `copr.yaml` manifest describes the project; `apply`, `diff`, and `export` reconcile it against Copr.

- `coprctl apply`reconcile
- `coprctl diff`drift = exit 12

agent-first

### Agents get the same surface.

The agent skill is generated from the command registry, so it cannot drift from the CLI. MCP, schema, and completions all come from one source.

- `schema output`drives agents
- `generated skill`never drifts

webhooks

### Rebuilds on tag, wired up.

GitHub integrations configured in one call, defaulting to tag-only triggers.

- `integration enable`one command
- `tag-only default`deliberate releases

instance-agnostic

### Point it at any Copr.

Production, staging, openEuler, or self-hosted. Profiles are first-class and swap in one flag.

- `--profile NAME`swap instance
- `offline catalog`cached chroots

/03

## Why a wrapper at all.

### Copr works, the CLI lags it.

coprctl keeps Copr's vocabulary and API, and fixes the ergonomics around them: one grammar, live logs, declarative state.

### Nothing else to install.

A single static binary. Copr does the building; coprctl just talks to it. No runtime, no dependencies.

### Read without configuring.

Browsing, monitoring, and log reading fall back to anonymous access when no profile is set. Writes still ask for credentials.

### Text first, TUI only where it helps.

A dashboard appears only when it beats text and never blocks automation. Default output stays a clean stream.