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 tailmulti-chroot
  • coprctl build watchto completion
machine-readable

Structured output.

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

  • stable exit codes4·8·9·12
  • structured errorscode + hint
declarative

Project state as code.

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

  • coprctl applyreconcile
  • coprctl diffdrift = 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 outputdrives agents
  • generated skillnever drifts
webhooks

Rebuilds on tag, wired up.

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

  • integration enableone command
  • tag-only defaultdeliberate releases
instance-agnostic

Point it at any Copr.

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

  • --profile NAMEswap instance
  • offline catalogcached 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.