Public reference agents for registering provenance records on Numbers Mainnet.
This repository intentionally includes only two public examples:
| Agent | Source | What it proves |
|---|---|---|
| NewsProve | Hacker News + technology RSS feeds | News page provenance with ProofSnap-style screenshot, content hash, excerpt, and source metadata |
| SocialProve | Reddit, with Mastodon and Dev.to fallback | Social post provenance with ProofSnap-style screenshot, source metadata, and content hashes for text posts |
The examples show how agents can preserve public digital records with Numbers Protocol provenance infrastructure for humans and AI. Human Truth. Machine Proof.
Human Truth. Machine Proof.
Fork this repository, build or run a provenance agent, and make at least 1,000 valid captures from the Capture account used by your agent.
- Campaign window: July 3-July 16, 2026.
- Final snapshot: July 16, 2026 at 13:00 UTC.
- Prize pool: 21,000 NUM total for audited qualifying forks: 10,000 NUM for first place (most valid captures), 7,000 NUM for second place, and 4,000 NUM for third place.
- Ranking metric: valid captures created by the submitted Capture account.
- Qualification threshold: at least 1,000 valid captures from the Capture account used by your submitted agent.
- Submission method: no campaign form. Submit only the public fork URL in the official campaign comment thread.
- Repo availability: the fork must stay public through the final audit window.
- Network requirement: only Numbers Mainnet registrations count.
- Trace requirement: each counted capture must be traceable from a Capture asset NID to at least one Numbers Mainnet integrity transaction hash.
- Excluded accounts: Numbers-operated accounts and wallets are not eligible, including
officialnumbers,defiancemedia,halasystem,0x20c90004cbe4445e9ef6740c5d1fa5f61e557bfe, and other official test or operations accounts. - Audit rule: obvious non-agent, duplicate-abuse, or source-mismatched records can be excluded during manual review.
If you are using an AI coding agent, copy this prompt:
Help me join the Numbers Fork & Build campaign.
First ask me whether I want to use NewsProve or SocialProve:
- NewsProve currently covers Hacker News.
- SocialProve currently covers Reddit.
Then ask which news media or social media sources I want my fork to cover.
After I answer, fork https://github.com/numbersprotocol/reference-agents as a public repo, configure my Capture API token privately in .env, update my repo README with the required "Fork & Build Submission" section, run the selected agent continuously, and return my public fork URL plus one sample NID and Verify URL.
-
Fork this repository and make sure your fork stays public:
-
Clone your fork:
git clone https://github.com/YOUR_GITHUB_USERNAME/reference-agents cd reference-agents -
Create your environment file:
cp .env.example .env
-
Add your Capture API token to
.env.CAPTURE_TOKEN=your_capture_token_here
Never commit your
.env, Capture API token, private keys, passwords, or Reddit secrets. -
Choose one campaign path.
SocialProve path
Use
socialprove.pyor a fork of it. The current SocialProve example covers Reddit. In your public repo, clearly list which social media sources you plan to cover, for example Reddit communities or another public social source.NewsProve path
Use
newsprove.pyor a fork of it. The current NewsProve example covers Hacker News. In your public repo, clearly list which news or media sources you plan to cover, for example Hacker News, RSS feeds, publisher sites, blogs, or other public media sources. -
Run your agent. Every successful registration should create a Capture asset/NID with an integrity record traceable on Numbers Mainnet. The on-chain sender may be Numbers infrastructure, so campaign scoring uses the Capture account evidence below rather than direct wallet-sender activity.
-
In your public fork, add a
Fork & Build Submissionsection to your README with all campaign information. Use this format:fork_and_build: agent_path: "socialprove" # or "newsprove" public_repo: "https://github.com/YOUR_GITHUB_USERNAME/reference-agents" capture_account: "YOUR_PUBLIC_CAPTURE_ACCOUNT_OR_PROFILE" capture_owner_name: "YOUR_CAPTURE_OWNER_NAME_IF_PUBLIC" capture_asset_wallet: "0xYOUR_CAPTURE_ASSET_WALLET" capture_vault_wallet: "0xYOUR_CAPTURE_VAULT_WALLET" sample_nid: "baf..." sample_verify_url: "https://verify.numbersprotocol.io/..." target_sources: - "Reddit r/MachineLearning" - "Mastodon public AI posts" run_notes: "How you run the agent and what you changed."
capture_asset_walletis the asset/signature wallet shown in the Capture asset metadata.capture_vault_walletis the managed Capture Vault wallet. We use these fields to confirm the Capture account identity.The valid capture score is counted from Capture assets created by your Capture account that have at least one Numbers Mainnet
integrity_infotransaction hash, not from transactions sent directly by either wallet. Capture may broadcast registrations through Numbers infrastructure, so the direct on-chain sender can be different from your asset wallet or vault wallet. -
Submit only your public fork URL in the official campaign comment thread. We will read the campaign information from your repo.
| Item | Required | Notes |
|---|---|---|
| Python 3.11+ | Yes | Needed for local execution |
| Capture API token | Yes | Used to register records on Numbers Mainnet |
| Docker + Compose | Optional | Recommended for always-on local or VPS runs |
| Reddit app credentials | Optional | Improves SocialProve reliability; fallback sources run without Reddit OAuth |
| Slack webhook | Optional | Used only for alerts and monitor summaries |
cp .env.example .env
nano .env
docker compose up -d
docker compose ps
docker compose logs -f newsproveStop the agents:
docker compose downmake install
make run-all
make statusStop background agents started by make run-all:
make stop-allpython newsprove.py
python socialprove.pyAll configuration lives in .env.
| Variable | Required | Default | Description |
|---|---|---|---|
CAPTURE_TOKEN |
Yes | - | Capture API token used for registrations |
NEWSPROVE_INTERVAL |
No | 290 |
Seconds between NewsProve cycles |
NEWSPROVE_DAILY_CAP |
No | 300 |
Daily registration cap for NewsProve |
NEWSPROVE_SCREENSHOT_TIMEOUT |
No | 15000 |
Browser page-load timeout in milliseconds |
NEWSPROVE_SCREENSHOT_WIDTH |
No | 1280 |
Screenshot viewport width |
NEWSPROVE_SCREENSHOT_HEIGHT |
No | 800 |
Screenshot viewport height |
SOCIALPROVE_INTERVAL |
No | 430 |
Seconds between SocialProve cycles |
SOCIALPROVE_DAILY_CAP |
No | 200 |
Daily registration cap for SocialProve |
SOCIALPROVE_SCREENSHOT_TIMEOUT |
No | 15000 |
Browser page-load timeout in milliseconds |
SOCIALPROVE_SCREENSHOT_WIDTH |
No | 1280 |
Screenshot viewport width |
SOCIALPROVE_SCREENSHOT_HEIGHT |
No | 800 |
Screenshot viewport height |
REDDIT_CLIENT_ID |
No | - | Reddit OAuth client ID for SocialProve |
REDDIT_CLIENT_SECRET |
No | - | Reddit OAuth client secret for SocialProve |
SLACK_WEBHOOK_URL |
No | - | Optional Slack alert destination |
STATE_DIR |
No | ./state |
Deduplication state directory |
LOG_LEVEL |
No | INFO |
Python log level |
NewsProve monitors Hacker News and selected technology RSS feeds. For each new story it attempts to:
- Open the source URL in headless Chromium.
- Capture a screenshot with the same default timestamp and ProofSnap wordmark treatment used by the ProofSnap extension.
- Hash the rendered HTML.
- Extract a short visible-text excerpt.
- Register the screenshot on Numbers Mainnet.
- Attach structured source metadata to the registered asset.
If a page blocks screenshots or times out, NewsProve falls back to registering a JSON metadata record.
SocialProve monitors public AI and machine-learning communities. With Reddit OAuth configured, it reads configured subreddits through Reddit's API. Without Reddit credentials, it falls back to public Mastodon and Dev.to sources.
For each post or article, SocialProve now attempts to capture the source page with the same ProofSnap-style timestamp and wordmark treatment as NewsProve. If the page blocks screenshots or times out, SocialProve falls back to registering a JSON metadata record.
For Reddit self-posts, SocialProve stores a normalized excerpt and SHA-256 hash of the body text so the record can still be verified if the post is later edited or deleted.
Both public agents use proofsnap_capture.py to match the ProofSnap browser extension's default screenshot treatment:
- Timestamp box enabled by default.
- Timestamp format:
HH:MMplusDD/MM/YYYY Tue. - Timestamp position: top-left.
- Timestamp style: semi-transparent white rounded box, dark text.
- ProofSnap wordmark: bottom-right, 70% opacity.
Print a local status report:
python monitor.pyOutput JSON:
python monitor.py --jsonPost to Slack:
python monitor.py --slackCheck process and log-derived status:
python status.pyOn a VPS, after cloning the repo and creating .env:
sudo make deploy-vps
sudo systemctl status numbers-newsprove numbers-socialprove
sudo journalctl -u numbers-newsprove -fThe systemd services are in systemd/.
reference-agents/
├── common.py
├── proofsnap_capture.py
├── newsprove.py
├── socialprove.py
├── assets/
│ └── Word-Logo-Bright-crop.png
├── monitor.py
├── status.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── Makefile
├── scripts/
│ ├── check_dedup.py
│ ├── check_state.py
│ └── check_syntax.py
├── systemd/
│ ├── numbers-newsprove.service
│ └── numbers-socialprove.service
├── test_commit.py
├── test_screenshot.py
└── test_socialprove_selftext.py
Run syntax checks:
python scripts/check_syntax.pyRun import smoke tests:
make testmake test installs dependencies and Chromium for NewsProve screenshots.
- The public repository exposes only NewsProve and SocialProve.
- Deduplication state and logs are local runtime files and are ignored by Git.
.envmust never be committed.- Each registered record is auditable on Numbers Mainnet.
MIT