Development
Docker, Make, and a shell are all you need on the host. Every target runs in the development image.
make help # every target
make build # static binary in build/
make lint # shfmt, shellcheck, go fix -diff, golangci-lint
make test # unit tests with -race
make test-api # the production image on regtest, through testcontainers
make test-coverage # unit and integration tests, coverage gate (90%)
make sec # govulncheck and semgrep, writes sec.sarif
make generate # regenerate code from api/api.yml
make audit-compose # docker-compose.yml against the hardened floor
make docs # build this documentation site into .testing/docs-site
Tests
Unit tests never start Monero. The wallet pool and the core services run against an in-memory monero-wallet-rpc (internal/pkg/monero/walletrpc/walletrpctest) started by a fake process launcher (internal/pkg/process/processtest).
make test-api builds the production image and runs it on regtest with real monerod and monero-wallet-rpc: it creates wallets, mines and matures funds, sends a transaction, watches it confirm and arrive, and checks read-only mode, the transfer switches, and that a restart keeps the chain and the wallets. The first run downloads the Monero release while building the image. It needs the Docker socket, which the target provides.
make test-coverage builds an instrumented image for the same suite, so the service’s own code counts toward the coverage gate.
Documentation
This site is the docs/ directory, built by GitHub Pages from main with Jekyll and the just-the-docs theme. make docs runs the same build image GitHub uses and writes the result to .testing/docs-site. Every page needs front matter with a title and a description. Link another page by its relative .md path, and a file outside docs/ by its full GitHub URL, because a relative ../ link breaks on the published site.
Changing the API
The contract is api/api.yml. Edit it, run make generate, and implement the new methods the generated StrictServerInterface asks for in internal/pkg/http/server. Never edit a *.gen.go file.
Framework
The project is built on servicepack. make servicepack-update replaces the framework-owned files (internal/app/, internal/pkg/service-manager/, pkg/runner/, cmd/main.go, Makefile.servicepack, scripts/make/servicepack/, Dockerfile.servicepack*). Customize through cmd/init.go, cmd/commands.go, Makefile, and scripts/make/ instead.
Upgrading Monero
Dockerfile pins the release version and the SHA-256 of each tarball. Download the new hashes.txt from getmonero.org, verify its signature against binaryFate’s key, then update MONERO_VERSION and the two hashes together.