Mirror-GUI is a web-based interface for managing OpenShift Container Platform (OCP) mirroring operations using oc-mirror v2. It provides a visual configuration builder, operation execution with real-time monitoring, and environment management - without requiring command-line expertise.
The application runs as a containerized service (Podman) and wraps oc-mirror v2 to perform mirror-to-disk workflows. It uses pre-fetched operator catalog metadata to enable offline-capable operator browsing, channel selection, and dependency detection.
- Podman (5.0+)
- oc client (for building) - download from mirror.openshift.com
- jq, Python 3, and PyYAML — required by
sync-catalogs.sh(sudo dnf install -y jq python3 && pip3 install --user PyYAML) - Pull secret from console.redhat.com - save to
pull-secret/pull-secret.jsonbefore building, or runpodman login registry.redhat.io
git clone https://github.com/openshift/mirror-gui.git
cd mirror-gui# Build and run locally (fetches catalogs, builds image, starts container)
./local-build.sh
# Build only, without starting the container
./local-build.sh --build
# Run a previously built image without rebuilding or fetching catalogs
./local-build.sh --runEvery build path runs sync-catalogs.sh to pull the latest Red Hat, Certified, and Community operator catalogs (OCP 4.16–4.22) before building the image. Use --run to skip fetching and building when you already have a local image.
Open the URL printed by the script in your browser. By default it uses http://localhost:3000, but it automatically selects another free host port if 3000 is already in use. The Web UI: line in the script output shows the chosen address.
Manage with: ./local-build.sh --stop, --restart, --status, --logs.
Environment overview (oc-mirror version, environment status, pull secret status), operation statistics, recent operations, and quick action buttons. Shows a warning banner when no pull secret is detected.
Dark theme - Toggle between Light, Dark, and System (auto) themes from the masthead.
Visual configuration builder with tabs for Platform Channels, Operators, Additional Images, YAML Preview, and file upload.
- Adding operators - Select from pre-fetched catalogs (OCP 4.16–4.22) with Red Hat, Certified, and Community operator indexes. Automatic dependency detection with one-click add.
- YAML preview and editing - Preview the generated
ImageSetConfigurationYAML, copy to clipboard, or edit directly. Set an optional archive size limit (in GiB). - Upload existing YAML - Import an existing
ImageSetConfigurationYAML file, review and edit it, then save or load it into the form editor.
Execute mirror operations with real-time monitoring. Select a saved configuration file, optionally specify a destination subdirectory, and start the operation. View operation history with logs, location info, and delete actions.
Filter and review all past operations. Export to CSV.
Configure environment preferences across four tabs:
| Tab | Purpose |
|---|---|
| Pull Secret | View, upload, edit, or remove your pull secret |
| Registry | Auto-detected registries from your pull secret with authentication verification |
| Cache | View cache location and size, clean up cache data |
| Sync Catalogs | Fetch the latest operator catalog metadata from registry.redhat.io for all supported OCP versions |
| Variable | Description | Default |
|---|---|---|
IMAGE_NAME |
Override the container image name | mirror-gui:latest |
WEB_PORT |
Override the host port | 3000 |
CACHE_DIR |
Override the oc-mirror cache directory (absolute host path) | ./data/cache |
| oc-mirror | v2 |
| OpenShift | 4.16 – 4.22 |
| Container runtime | Podman 5.0+ |
| Architecture | AMD64 (x86_64), ARM64 (aarch64) |
See TROUBLESHOOTING.md for common issues and solutions.
Full RESTful API documentation is available in API.md.
Test documentation is available in TESTS.md.
To run tests locally:
npm test # unit and integration tests (Vitest)
npm run test:coverage # tests with coverage
npm run test:e2e # end-to-end tests (Playwright)
npm run test:all # all tests
npm run lint # ESLintMirror-GUI is a TypeScript application with two main layers:
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | React 18, PatternFly 6, Vite | Single-page application with visual config builder |
| Backend | Express (Node.js 22), tsx | REST API server that wraps oc-mirror v2 CLI |
The backend spawns oc-mirror as a child process for mirror operations and streams logs via SSE. Operator catalog metadata is pre-fetched at build time (sync-catalogs.sh) and bundled into the container image for offline browsing.
For a detailed architecture overview, see ARCHITECTURE.md. Additional developer reference docs (catalog pipeline, mirror operations lifecycle, registry auth flow) are available in docs/dev/.
See CONTRIBUTING.md for details on reporting bugs, submitting pull requests, and running tests.
Apache License 2.0 - see LICENSE for details.





