RepoPilot

monero-project/monero

Monero: the secure, private, untraceable cryptocurrency

Mixed

Mixed signals — read the receipts

ConcernsDependency

non-standard license (Other)

HealthyFork & modify

Has a license, tests, and CI — clean foundation to fork and modify.

HealthyLearn from

Documented and popular — useful reference codebase to read through.

HealthyDeploy as-is

No critical CVEs, sane security posture — runnable as-is.

  • Concentrated ownership — top contributor handles 72% of recent commits
  • Non-standard license (Other) — review terms
  • Last commit 1d ago
  • 12 active contributors
  • Other licensed
  • CI configured
  • Tests present

What would improve this?

  • Use as dependency ConcernsMixed if: clarify license terms

Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Want this for your own repo?

Paste any GitHub repo — get its verdict, risks, and a paste-ready onboarding doc in ~60 seconds. Free, no sign-up.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/monero-project/monero?axis=fork)](https://repopilot.app/r/monero-project/monero)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/monero-project/monero on X, Slack, or LinkedIn.

Ask AI about monero-project/monero

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question →

Onboarding doc

Onboarding: monero-project/monero

Generated by RepoPilot · 2026-06-27 · Source

🎯Verdict

WAIT — Mixed signals — read the receipts

  • Last commit 1d ago
  • 12 active contributors
  • Other licensed
  • CI configured
  • Tests present
  • ⚠ Concentrated ownership — top contributor handles 72% of recent commits
  • ⚠ Non-standard license (Other) — review terms

<sub>Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests</sub>

TL;DR

Monero is a privacy-focused cryptocurrency that implements ring signatures, stealth addresses, and RingCT to ensure transactions are secure, private, and untraceable. Unlike Bitcoin, Monero hides sender, receiver, and transaction amounts by default at the protocol level, making it the leading fungible cryptocurrency. Monolithic C++ daemon with modular subsystems: src/cryptonote_core/ contains consensus and ledger logic, src/wallet/ wraps user-facing wallet functionality, src/p2p/ handles peer-to-peer networking, and src/rpc/ exposes JSON-RPC APIs. Tests live in tests/. Build system uses CMake (CMakeLists.txt) with reproducible cross-platform builds via contrib/depends/ for Darwin/Linux/MinGW32/Android/FreeBSD. Hardware wallet support via cmake/CheckTrezor.cmake and FindHIDAPI.cmake.

👥Who it's for

Cryptocurrency developers and privacy researchers building on the Monero protocol, node operators running the network, wallet developers integrating Monero payment processing, and security researchers studying privacy-preserving consensus mechanisms.

🌱Maturity & risk

Highly mature and production-ready. The project is 10+ years old (since 2014 as Monero, with CryptoNote ancestry to 2012), has extensive CI/CD via GitHub Actions (.github/workflows/build.yml, depends.yml, guix.yml), active development across C++ core and support languages, and is actively maintained with regular scheduled network upgrades. This is battle-tested cryptocurrency infrastructure.

Standard open source risks apply.

Active areas of work

Active protocol development with scheduled network upgrades documented in the README. CI/CD matrices in .github/workflows/build.yml test multiple compilers and platforms. Guix builds (guix.yml) ensure reproducible builds for security. Recent focus is on Trezor hardware wallet integration (cmake/CheckTrezor.cmake) and cross-platform compilation (contrib/depends/hosts/). The repo maintains separate iOS build config (CMakeLists_IOS.txt) suggesting mobile wallet work.

🚀Get running

git clone https://github.com/monero-project/monero.git
cd monero
git submodule update --init --recursive
# Install dependencies (Debian/Ubuntu example):
sudo apt install build-essential cmake pkg-config libssl-dev libunbound-dev libsodium-dev libhidapi-dev libusb-1.0-0-dev
# Build:
make -j$(nproc)
# Or use CMake directly:
mkdir build && cd build && cmake .. && make -j$(nproc)

Daily commands:

# Start local daemon (mainnet):
./src/daemon/monerod
# Or testnet:
./src/daemon/monerod --testnet
# Start wallet (connects to local daemon):
./src/wallet/monero-wallet-cli
# RPC endpoint listens on localhost:18081 (mainnet) / 28081 (testnet)
curl http://localhost:18081/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"get_info"}'

🗺️Map of the codebase

  • CMakeLists.txt — Primary build configuration for the entire Monero project; all contributors must understand the build system structure and dependency management.
  • contrib/epee/include/net/abstract_tcp_server2.h — Core networking abstraction layer used throughout Monero for peer-to-peer communication; essential for understanding how nodes communicate.
  • contrib/epee/include/misc_log_ex.h — Logging framework used across the codebase; critical for debugging and understanding execution flow.
  • contrib/epee/include/memwipe.h — Security-critical memory wiping utilities to prevent sensitive data leaks; essential for understanding Monero's privacy guarantees.
  • contrib/depends/Makefile — Dependency build system that manages cross-platform compilation; required for setting up development environment.
  • .github/workflows/build.yml — CI/CD pipeline defining how builds are tested and validated; shows integration points and test expectations.
  • README.md — Project documentation covering development resources, compilation instructions, and architectural overview; the starting point for all new contributors.

🛠️How to make changes

Add a new RPC endpoint

  1. Define the RPC handler in your module (typically inherits from abstract_http_server_impl_base.h) (contrib/epee/include/net/http_server_impl_base.h)
  2. Register the endpoint in the HTTP handler map with MAP_JON_RPC_WM or similar macro (contrib/epee/include/net/http_server_handlers_map2.h)
  3. Implement request/response serialization using the byte_stream and serialization utilities (contrib/epee/include/byte_stream.h)
  4. Add logging for the new endpoint using misc_log_ex macros for debugging (contrib/epee/include/misc_log_ex.h)
  5. Test the endpoint by adding it to the CI/CD build workflow (.github/workflows/build.yml)

Add support for a new platform/architecture

  1. Create a new host platform definition file in contrib/depends/hosts/ (contrib/depends/hosts/default.mk)
  2. Define cross-compilation toolchain using CMake template system (contrib/depends/toolchain.cmake.in)
  3. Add platform-specific dependency packages in contrib/depends/packages/ (contrib/depends/packages/packages.mk)
  4. Update CMakeLists.txt with platform-specific compiler flags and feature detection (CMakeLists.txt)
  5. Add build matrix entry to GitHub Actions workflow (.github/workflows/build.yml)

Add a new networking feature to P2P protocol

  1. Define message structures compatible with Levin protocol serialization (contrib/epee/include/net/levin_base.h)
  2. Extend abstract_tcp_server2 connection handler with new protocol method (contrib/epee/include/net/abstract_tcp_server2.h)
  3. Implement send/receive logic in the .inl template implementation file (contrib/epee/include/net/abstract_tcp_server2.inl)
  4. Add secure memory handling for sensitive protocol data (contrib/epee/include/memwipe.h)
  5. Log all protocol interactions using the logging framework for peer debugging (contrib/epee/include/misc_log_ex.h)

🔧Why these technologies

  • CMake + contrib/depends — Enables reproducible cross-platform builds (Android, iOS, Linux, macOS, Windows) with deterministic dependency versions; critical for cryptocurrency security
  • Epee network library — Provides template-based async TCP/HTTP abstraction, reducing boilerplate for P2P and RPC layers; zero-copy byte handling for performance
  • Libsodium (FindSodium.cmake) — Standardized, audited cryptographic library for all signing and verification operations; prevents custom crypto implementations
  • Levin protocol (net/levin_base.h) — Binary protocol optimized for P2P messaging with minimal overhead; compatible with Monero's peer-to-peer network requirements
  • Memory wiping (memwipe.h, mlocker.h) — Prevents sensitive key/nonce material from leaking via core dumps, swap, or side-channel attacks; foundational for privacy guarantees

⚖️Trade-offs already made

  • Template-heavy C++ (abstract_tcp_server2.h/inl) over virtual inheritance

    • Why: Compile-time code generation reduces runtime polymorphism overhead and enables aggressive inlining; critical for P2P throughput
    • Consequence: Longer compile times and larger binary sizes; templates can be harder to debug
  • Synchronous RPC handlers over async/await

    • Why: Simpler to reason about, matches legacy blockchain node patterns, avoids callback hell
    • Consequence: Thread pools must be sized correctly; no native backpressure from async drivers
  • Immutable byte_slice over std::vector<uint8_t>

    • Why: Zero-copy semantics for high-throughput networking; prevents accidental modifications to serialized data
    • Consequence: More complex ownership semantics; developers must understand slice lifetimes
  • Monolithic CMake configuration over microservices

    • Why: Single-binary daemon simplifies deployment, network security, and state consistency
    • Consequence: All subsystems tightly coupled; cannot scale individual components horizontally

🚫Non-goals (don't propose these)

  • Not a hardware wallet implementation (though supports hardware wallets via HID/USB APIs)
  • Not a web-based wallet (command-line and RPC-only interfaces)
  • Not portable to Windows natively (MinGW cross-compilation

🪤Traps & gotchas

  1. Ring signatures and RingCT are complex; changes to src/ringct/ or src/crypto/ can silently break privacy without obvious symptoms. 2. Network protocol is strict—bumping protocol version requires coordinated hard fork via scheduled upgrades; breaking changes need IRC consensus first. 3. Hardware wallet support requires libusb/HIDAPI which vary by OS; testing on actual Trezor/Ledger hardware is essential (not all devs have them). 4. Daemon and wallet use separate repositories in some setups (monero-core vs monero-gui); changes here don't auto-propagate. 5. contrib/depends/ builds its own openssl/libsodium to ensure reproducibility; modifying dependency versions breaks deterministic builds. 6. Memory access patterns matter for side-channel resistance in crypto code—careless refactoring can leak timing information. 7. testnet/stagenet/mainnet use different magic bytes and genesis blocks (hardcoded); running wrong binary on wrong network is silent and causes fork.

🏗️Architecture

💡Concepts to learn

  • Ring Signatures — Core privacy mechanism in Monero that hides transaction sender by mixing their signature with decoys; without understanding this, you cannot reason about privacy guarantees
  • Stealth Addresses — Every Monero transaction generates a unique one-time public key so observers cannot link multiple payments to the same recipient; essential to understand for wallet security
  • RingCT (Ring Confidential Transactions) — Hides transaction amounts using range proofs and commitments (implemented in src/ringct/); breaking this breaks amount privacy for the entire network
  • UTXO Model — Monero uses unspent transaction outputs like Bitcoin; wallet logic in src/wallet/wallet2.cpp tracks UTXOs, select sets for ring mixing, and manages change
  • Proof-of-Work (CryptoNight Algorithm) — Monero's consensus mechanism using CPU-hard hashing; resistant to ASIC/GPU mining by design; changes require protocol upgrade coordination
  • Reproducible Builds — contrib/depends/ and guix.yml ensure binaries are bit-for-bit identical across builds; critical for security audits and detecting supply-chain tampering
  • BIP44 Hierarchical Deterministic Wallet — Monero wallets derive keys from a master seed using BIP44 paths; hardware wallet support (Trezor) relies on this standard; see src/device/device_trezor.cpp
  • monero-project/monero-gui — Official Qt-based GUI wallet for Monero; integrates with this daemon via RPC
  • monero-project/kovri — Monero's privacy-focused I2P router implementation; bundles with daemon for network-level anonymity
  • zcash/zcash — Alternative privacy coin using zk-SNARKs instead of ring signatures; competitive approach to privacy
  • bitcoinj/bitcoinj — Bitcoin library with similar architecture (daemon, wallet, RPC layers) for comparison of non-private UTXO implementation
  • monero-project/meta — Monero project governance, vulnerability response process, and meeting notes; referenced in README for contribution guidelines

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add macOS ARM64 (Apple Silicon) cross-compilation CI workflow

The repo has CMakeLists_IOS.txt and contrib/depends/hosts/darwin.mk for macOS builds, but .github/workflows/build.yml likely lacks explicit ARM64 testing. With Monero's cryptocurrency use case requiring broad hardware support and macOS's shift to Apple Silicon, adding a dedicated CI job for ARM64 macOS compilation would catch architecture-specific bugs early and ensure release binaries work on modern Apple hardware.

  • [ ] Review .github/workflows/build.yml to confirm ARM64 macOS is not tested
  • [ ] Check contrib/depends/hosts/darwin.mk for ARM64 target configuration
  • [ ] Add a new GitHub Actions job in build.yml that: runs on macos-latest (ARM64), builds with appropriate CMake flags for ARM64, runs any existing ARM64-compatible tests
  • [ ] Document the new workflow in README.md's compilation section

Add integration tests for contrib/depends build system across platforms

The contrib/depends directory contains complex cross-platform dependency management (android.mk, darwin.mk, linux.mk, mingw32.mk, freebsd.mk) but there's no visible test suite validating that the depends build succeeds for all supported platforms. Adding tests would prevent regressions when package versions are bumped or builders are modified, which is critical for a project supporting 5+ target platforms.

  • [ ] Create tests/depends/ directory structure
  • [ ] Write shell/CMake test scripts that invoke 'make -C contrib/depends' for each host target (android, darwin, linux, mingw32, freebsd)
  • [ ] Add a GitHub Actions workflow (e.g., .github/workflows/depends-test.yml) that runs these tests in matrix across platforms, or at minimum validates Linux/FreeBSD in containers
  • [ ] Document test execution in README.md's Compiling section

Add missing CMake find-module for HIDAPI version validation

The repo has cmake/FindHIDAPI.cmake and cmake/FindLibUSB.cmake (for hardware wallet support via Trezor), but cmake/test-libusb-version.c exists while no equivalent version check exists for HIDAPI. Given that contrib/depends/packages/hidapi.mk manages HIDAPI as a dependency and cmake/CheckTrezor.cmake likely depends on HIDAPI, adding robust version detection would prevent subtle hardware wallet integration failures when system-installed HIDAPI versions are incompatible.

  • [ ] Review cmake/FindHIDAPI.cmake for current version detection logic (or lack thereof)
  • [ ] Create cmake/test-hidapi-version.c following the pattern of cmake/test-libusb-version.c
  • [ ] Enhance cmake/FindHIDAPI.cmake to include version checking and MIN_VERSION support
  • [ ] Update cmake/CheckTrezor.cmake to enforce HIDAPI version requirements
  • [ ] Add a comment in cmake/test-libusb-version.c referencing the new HIDAPI test for maintainability

🌿Good first issues

  • Add unit tests for edge cases in src/wallet/wallet2.cpp payment ID handling (payment IDs are deprecated but still in codebase; test coverage is sparse). This improves safety and teaches wallet state machine logic.
  • Document the Trezor hardware wallet integration flow: add comments to cmake/CheckTrezor.cmake and src/device/device_trezor.cpp explaining the USB communication protocol and key derivation path (BIP44 m/44'/128'/0'/0/i for Monero). New contributors struggle here.
  • Write reproducibility verification script: add a shell script under contrib/ that verifies Guix-built binaries match the expected SHA256 hash (currently manual step in guix.yml). This helps onboard security researchers.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 539012f — Merge pull request #9741 (luigi1111)
  • 50554ad — Merge pull request #9745 (luigi1111)
  • 61d5560 — Merge pull request #9747 (luigi1111)
  • 86a2e6c — Merge pull request #9753 (luigi1111)
  • e852957 — Merge pull request #9754 (luigi1111)
  • 380b8ce — Merge pull request #10301 (luigi1111)
  • cabeafa — Merge pull request #10509 (tobtoht)
  • 49ea802 — Merge pull request #9899 (tobtoht)
  • 5d8e1cc — Merge pull request #10508 (tobtoht)
  • d01a03e — Merge pull request #10507 (tobtoht)

🔒Security observations

The Monero codebase shows moderate security posture with some concerns. The most critical issue is the incomplete Docker runtime configuration which compromises the security hardening strategy. Key concerns include: incomplete container setup, lack of git submodule verification (critical for a cryptocurrency project), unpinned base images, and missing cryptographic validation for dependencies. The project demonstrates good structure with dependency management, but static analysis reveals gaps in the build infrastructure security. The cryptographic

  • High · Incomplete Docker Runtime Stage - Missing Security Hardening — Dockerfile (runtime stage). The Dockerfile runtime stage is incomplete (truncated at 'mkdir -p /wallet /hom'). The monero user creation and file permission setup appear unfinished, which could lead to incorrect privilege separation or insecure file permissions in the container. Additionally, the runtime stage doesn't specify a non-root default user for running the monero daemon. Fix: Complete the Docker runtime stage configuration. Ensure proper permissions are set for wallet/home directories, add 'USER monero' directive to run as non-root, and verify all security-related configurations are in place.
  • Medium · Build Stage Uses Latest Ubuntu Tag Without Pin — Dockerfile (FROM ubuntu:26.04). The Dockerfile uses 'ubuntu:26.04' which may receive security updates that could change the build environment between builds. While Ubuntu 26.04 is relatively future-proofed, unpinned base images can introduce non-deterministic builds and unexpected dependency changes. Fix: Pin the Ubuntu base image to a specific digest hash (e.g., 'ubuntu:26.04@sha256:...' format) to ensure reproducible and deterministic builds. This prevents unexpected security patches or dependency changes between builds.
  • Medium · Git Submodule Initialization Without Verification — Dockerfile (builder stage - git submodule commands). The Dockerfile performs 'git submodule init && git submodule update' without any signature verification or checksum validation. This could potentially allow man-in-the-middle attacks or loading of compromised submodule versions, which is critical for a cryptocurrency project. Fix: Implement submodule signature verification using 'git config --global gpg.program' and verify GPG signatures. Consider using 'git clone --recurse-submodules' with verified commits or implementing additional integrity checks for all dependencies.
  • Medium · Build Arguments Without Validation — Dockerfile (ARG NPROC and RUN make -j$NPROC). The NPROC build argument is used directly in shell arithmetic without validation, which could lead to injection vulnerabilities if the argument is not properly sanitized. Fix: Validate the NPROC argument using shell parameter expansion or numeric validation. For example: 'RUN NPROC=${NPROC:-$(nproc)} && if ! [[ $NPROC =~ ^[0-9]+$ ]]; then exit 1; fi'
  • Low · Incomplete Container Setup — Dockerfile (runtime stage user setup). The Dockerfile runtime stage appears truncated with incomplete user and directory setup ('/wallet /hom' is incomplete). This could affect the security posture and functionality of the container. Fix: Complete the Docker configuration ensuring proper directory creation, permission settings, volume mount points, and default working directory are configured. Also add HEALTHCHECK, EXPOSE, and ENTRYPOINT directives as appropriate.
  • Low · Missing Security Headers and Best Practices in Build — Dockerfile (builder stage). The Dockerfile doesn't include common Docker security best practices such as: setting a read-only root filesystem, disabling unnecessary capabilities, or using a non-root user explicitly in the base build stage. Fix: Add security directives: use SECURITY_OPT flags in compose files, add 'RUN chmod -R 755 /src' for proper permissions, and consider using a minimal base image. Implement Docker security scanning in CI/CD pipeline.
  • Low · No Hash Verification for Downloaded Dependencies — Dockerfile (make depends command) and contrib/depends/packages/. The build process relies on the depends system without visible hash or signature verification in the provided Dockerfile snippet. Package managers should verify checksums. Fix: Verify that all dependency packages in contrib/depends/packages/*.mk files include SHA256 hash verification. Implement package signing where possible and validate checksums before extraction.

LLM-derived; treat as a starting point, not a security audit.

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/monero-project/monero shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live monero-project/monero repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/monero-project/monero.

What it runs against: a local clone of monero-project/monero — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in monero-project/monero | Confirms the artifact applies here, not a fork | | 2 | License is still Other | Catches relicense before you depend on it | | 3 | Default branch master exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 31 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>monero-project/monero</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of monero-project/monero. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/monero-project/monero.git
#   cd monero
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of monero-project/monero and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "monero-project/monero(\\.git)?\\b" \\
  && ok "origin remote is monero-project/monero" \\
  || miss "origin remote is not monero-project/monero (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
  && ok "license is Other" \\
  || miss "license drift — was Other at generation time"

# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
  && ok "default branch master exists" \\
  || miss "default branch master no longer exists"

# 4. Critical files exist
test -f "CMakeLists.txt" \\
  && ok "CMakeLists.txt" \\
  || miss "missing critical file: CMakeLists.txt"
test -f "contrib/epee/include/net/abstract_tcp_server2.h" \\
  && ok "contrib/epee/include/net/abstract_tcp_server2.h" \\
  || miss "missing critical file: contrib/epee/include/net/abstract_tcp_server2.h"
test -f "contrib/epee/include/misc_log_ex.h" \\
  && ok "contrib/epee/include/misc_log_ex.h" \\
  || miss "missing critical file: contrib/epee/include/misc_log_ex.h"
test -f "contrib/epee/include/memwipe.h" \\
  && ok "contrib/epee/include/memwipe.h" \\
  || miss "missing critical file: contrib/epee/include/memwipe.h"
test -f "contrib/depends/Makefile" \\
  && ok "contrib/depends/Makefile" \\
  || miss "missing critical file: contrib/depends/Makefile"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 31 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~1d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/monero-project/monero"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README →

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/monero-project/monero"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>