Guidance for coding agents working in this repository. Humans may find it useful too.
npm ciinstalls dependencies,npm run buildbuilds intobuild/(create-react-app via react-app-rewired-esm)npx jest <path>runs a single unit test file,npm run test:unitthe suitenpm run eslintandnpm run typecheckmust pass; CI treats warnings as errors- Node.js version is pinned in
.tool-versions - translations live in
public/localesand are managed on Transifex; seedocs/LOCALIZATION.mdbefore touching them
- follow Conventional Commits; semantic-release derives version bumps and the changelog from commit titles on
main(config inpackage.jsonunderrelease) chore:,docs:, andtest:commits trigger patch releases; use theno-releasescope for commits that should not be released
The release process for humans is described in docs/RELEASING.md. The machinery:
- Every merge to
main(ci.yml, jobpublishPreview): the build is merkleized into a CAR file (viaipfs/ipfs-deploy-action) kept as a run artifact, the dev DNSLink (_dnslink.dev.webui, zoneipfs.tech) is updated, and the build is force-pushed to theipfs/dev.webui.ipfs.iorepo, which GitHub Pages serves as https://dev.webui.ipfs.io. The build is also pinned to the ipfs-websites collab cluster, but that step is best-effort (continue-on-error): a cluster outage never blocks the CAR, dev publishing, or a release. The CAR is the canonical copy; anything can be re-pinned from it. - A maintainer manually dispatches
ci.ymlonmain: if release-worthy commits exist, semantic-release publishes a GitHub Release with the CID in the notes and the CAR file attached. That CAR is the canonical source of truth for the release; everything user-facing deploys from it. - Publishing the release triggers
deploy-release.yml: it downloads the CAR from the release, verifies the root CID, deploys the content to https://webui.ipfs.io (GitHub Pages, this repo) and points the production DNSLink (_dnslink.webui) at the same CID. A failed or skipped release never changes https://webui.ipfs.io. deploy-release.ymlcan be dispatched manually with a release tag to redeploy or roll back https://webui.ipfs.io.
Forks: pinning and publishing steps are gated on github.repository == 'ipfs/ipfs-webui', so CI in forks skips them instead of failing on missing secrets.
- the app is a static, hash-routed build with relative asset paths; it works from GitHub Pages, any IPFS gateway path, and as
ipns://webui.ipfs.iovia IPFS Companion - both hostnames are CNAMEs to
ipfs.github.io(DNS-only) in theipfs.iozone; the_dnslink.*TXT records are load-bearing for IPFS-native access and must never be removed - Kubo and IPFS Desktop bundle release CIDs directly (see
docs/RELEASING.md), independent of the hosted sites