Note: Everything in this repository was generated using VS Code and the models GPT-5.2 and Sonnet 4.5.
If you find any bugs or have any requests feel free to raise a github issue.
React + TypeScript frontend for managing Pulp resources via the Pulp REST API.
| Plugin | Repositories | Remotes | Distributions | Publications | Content browsing |
|---|---|---|---|---|---|
| RPM | ✅ | ✅ | ✅ | ✅ | ✅ (packages) |
| File | ✅ | ✅ | ✅ | ✅ | ✅ (files) |
| DEB | ✅ | ✅ | ✅ | ✅ | ✅ (packages) |
| Container | ✅ | ✅ | ✅ | n/a | — |
| Ansible | ✅ | ✅ (collection) | ✅ | n/a | — |
| Gem | ✅ | ✅ | ✅ | ✅ | — |
| Hugging Face | ✅ | ✅ | ✅ | ✅ | — |
| Maven | ✅ | ✅ | ✅ | n/a | — |
| NPM | ✅ | ✅ | ✅ | n/a | — |
| OSTree | ✅ | ✅ | ✅ | n/a | — |
| Python | ✅ | ✅ | ✅ | ✅ | — |
| Rust | ✅ | ✅ | ✅ | n/a | — |
Notes:
- Publications only exist for plugins that use them (Gem, Python, Hugging Face, plus RPM/File/DEB).
- Maven repositories have no sync operation (Maven acts as a pull-through cache via its remote).
- Ansible remotes managed by the UI are collection remotes (
/remotes/ansible/collection/). - The corresponding plugin must be installed on the Pulp backend for its section to work.
The UI talks to the backend at http://localhost:8080/pulp/api/v3/ (by default).
- In dev (
npm run dev), the UI runs onhttp://localhost:3000. - In Docker (see below), the UI is served from the Pulp container at
http://localhost:8080/ai-pulp-ui/.
You can override the backend with the PULP_BACKEND environment variable (default: http://localhost:8080).
- Node.js 18+ and npm
- Docker or Podman (for the Docker image, or
./tests/run_container.sh) - A running Pulp backend on
http://localhost:8080- Option A (recommended for tests): use
./tests/run_container.sh ...to start an ephemeral Pulp container for the duration of a command - Option B: run your own Pulp instance locally and use
npm run dev
- Option A (recommended for tests): use
Install dependencies:
npm installRun the UI with an ephemeral Pulp backend (starts Pulp, then runs Vite):
./tests/run_container.sh npm run dev -- --host 0.0.0.0Use a custom backend:
PULP_BACKEND=http://my-pulp-host:8080 npm run devOpen:
- UI:
http://localhost:3000 - Pulp API:
http://localhost:8080/pulp/api/v3/
- By default, the frontend uses a relative API base of
/pulp/api/v3(see src/services/api.ts). - In dev, Vite proxies
/pulp/*tohttp://localhost:8080by default, or toPULP_BACKENDif set (see vite.config.ts).
- The login form validates credentials against
GET /pulp/api/v3/groups/. - Credentials are used as HTTP Basic auth and stored as a base64 token in
localStorageunderauthToken.
npm run buildPreview the production build (static server only):
npm run previewIf you want the preview build to talk to a live Pulp backend, serve it behind a reverse proxy that forwards /pulp/* to http://localhost:8080 (the Vite dev proxy only applies to npm run dev).
Alternatively, you can build with PULP_BACKEND set to make the UI call the backend by absolute URL (note: this may require CORS to be enabled on the backend):
PULP_BACKEND=http://my-pulp-host:8080 npm run buildThis repo’s Dockerfile builds the React UI and bakes the static assets into the upstream Pulp image (ghcr.io/pulp/pulp:latest).
- Pulp (API + services) is served on port 80 inside the container.
- The UI is served as a SPA under
/ai-pulp-ui/via nginx/ai-pulp-ui.conf.
docker build \
--tag ai-pulp-ui:local \
.Build-time configuration (optional):
VITE_BASE(default:/ai-pulp-ui/) — where the UI is hosted in the containerPULP_BACKEND(default:http://localhost:8080) — backend origin embedded into the UI bundlePULP_EXPOSED_BACKEND(default:http://localhost:8080) — used for “Open” links for distributions (external base URL)
Example (if you will access the container from another machine/hostname):
docker build \
--tag ai-pulp-ui:local \
--build-arg PULP_BACKEND=http://my-host:8080 \
--build-arg PULP_EXPOSED_BACKEND=http://my-host:8080 \
.Note: these are build-time values (Vite embeds them into the bundle). If they change, rebuild the image.
docker run --rm \
--name ai-pulp-ui \
--publish 8080:80 \
ai-pulp-ui:localOpen:
- UI:
http://localhost:8080/ai-pulp-ui/ - Pulp API:
http://localhost:8080/pulp/api/v3/
If you need to set/reset the admin password inside the running container:
docker exec -it ai-pulp-ui pulpcore-manager reset-admin-password --password passwordUnit/integration tests (Vitest):
npm testE2E tests (Playwright) against an ephemeral Pulp backend:
./tests/run_container.sh npm run test:e2eOpen the Playwright HTML report:
npx playwright show-reportNotes:
- Playwright tracing is enabled for all E2E tests via playwright.config.ts.
- For more E2E details, see e2e/README.md.
src/React UI (components, services, contexts)e2e/Playwright teststests/run_container.shhelper to start an ephemeral Pulp container and run a command with that backend available
- Pulp user docs: https://pulpproject.org/user/
- REST APIs:
- Pulpcore: https://pulpproject.org/pulpcore/restapi/
- RPM: https://pulpproject.org/pulp_rpm/restapi/
- File: https://pulpproject.org/pulp_file/restapi/
- DEB: https://pulpproject.org/pulp_deb/restapi/
- Container: https://pulpproject.org/pulp_container/restapi/
- Ansible: https://pulpproject.org/pulp_ansible/restapi/
- Gem: https://pulpproject.org/pulp_gem/restapi/
- Hugging Face: https://pulpproject.org/pulp_hugging_face/restapi/
- Maven: https://pulpproject.org/pulp_maven/restapi/
- NPM: https://pulpproject.org/pulp_npm/restapi/
- OSTree: https://pulpproject.org/pulp_ostree/restapi/
- Python: https://pulpproject.org/pulp_python/restapi/
- Rust: https://pulpproject.org/pulp_rust/restapi/


