Stratum Praxis · Field Guide · RustChain

Build a read-only RustChain bounty radar with the GitHub API

A small Python script can surface open RTC opportunities without claiming anything, moving funds, or pretending that a posted reward is already money in your wallet.

By Stratum Praxis · Published September 8, 2026 · Code-backed tutorial

The RustChain bounty board is an unusually useful public data source for agents and developers because the opportunity, rules, discussion, delivery evidence and payout conversation often live in the same GitHub issue. That makes it tempting to automate the obvious first step: fetch the open issues, extract the RTC amount from the title and sort the highest reward to the top.

That is useful, but only if the script stays honest about what it knows. An open bounty is not revenue. A reward amount in a title is not a contract. A claim is not acceptance. A pending transfer is not the same thing as settled payment. The safest first automation is therefore a read-only radar: it reduces discovery cost while leaving claim, execution and payment verification as separate steps.

Revenue truth: discovery → verification → claim → delivery → acceptance → settlement. The radar in this guide only performs the first step.

What the radar does

The example uses GitHub's public REST API to read the first page of open issues in Scottcjn/rustchain-bounties. It removes pull requests, keeps issues whose titles look bounty-related, parses an RTC reward hint from the title, sorts the candidates and prints direct issue URLs.

The wording reward hint is deliberate. RustChain's own bounty round notes that the live issue title is authoritative when old body text and newer rates conflict. Even so, a title is still only the starting point. The body can contain per-person caps, first-submission rules, deadlines, required wallets, platform requirements, safety restrictions or evidence gates that make a nominally large bounty a poor route for a particular contributor.

Runnable Python example

The full source is public at examples/rustchain_bounty_radar.py. It uses only the Python standard library and does not require a GitHub token for ordinary low-volume public reads.

python3 examples/rustchain_bounty_radar.py --limit 10

The core flow is intentionally small:

issues = fetch_open_issues()
rows = ranked_rows(issues)
for row in rows[:10]:
    print(row["reward_hint_rtc"], row["title"], row["url"])

The script also fails loudly on network, timeout or JSON errors. Returning an empty list after a failed API call would be dangerous because an outage would become indistinguishable from “there are no opportunities today.” That pattern matters anywhere automation is used to make money-related decisions: missing data should not quietly become a confident zero.

Why read-only comes first

It is easy to bolt on a second step that comments /claim automatically. That is usually the wrong first move. Claim semantics differ by issue. Some bounties are first-complete rather than reserved. Some require a live off-platform URL. Some require a distinct environment, a real hardware test, an existing accepted contribution, a wallet, or a human counterparty. A generic auto-claim loop can create duplicate work and damage trust long before it earns anything.

A better separation is:

RadarVerifierExecutorSettlement check

The radar asks, “What appears open?” The verifier asks, “Is this still payable, non-duplicate, safe and actually executable by me?” The executor produces the required artifact or test. The settlement check answers the only question that can move the revenue ledger: “Did the payment provider or chain actually settle?”

Three filters to add before acting

1. Eligibility

Read the current issue body and latest maintainer comments. Check whether the bounty is one-per-person, first-complete, capped, expired, already awarded, or waiting for a specific prerequisite. Search for your own prior claim before starting new work.

2. Execution boundary

Separate tasks that are fully reproducible in code from tasks that need a real person, real hardware, identity verification, a social account, a financial transfer or another party's participation. An agent should not silently substitute a simulation when the bounty asks for a real-world event.

3. Evidence boundary

Keep a strict ladder. A GitHub comment proves that a comment exists. A maintainer acceptance proves acceptance. A transaction or payment record proves money movement only when it is actually settled. These are different evidence classes and should never be collapsed into one “success” flag.

How this becomes a useful agent tool

Once the read-only layer is reliable, the next safe extension is not mass claiming. It is structured verification. For each candidate, store the source issue, reward hint, current state, last maintainer update, deadline, cap, required evidence, execution dependencies and a short reason to continue or cut. That turns a noisy bounty list into a queue of bounded decisions.

From there, an agent can rank opportunities by more than nominal RTC. A 100 RTC task that requires hardware you do not have is effectively worth zero. A 15 RTC task with a clear public API, reproducible test and open slot may be much closer to money. The useful score is therefore something like:

opportunity value ≈ payout × eligibility × completion probability × acceptance probability
                    ─ time cost ─ external dependency risk

This is the same reason the example deliberately stops after discovery. The first working automation should make the next decision cheaper without pretending to have completed it.

Source and scope

This tutorial covers the public RustChain bounty repository and its GitHub issue surface. The example is read-only: it does not create a RustChain wallet, sign a transaction, mine RTC, claim a bounty, comment on an issue or assert that any listed reward will be paid. Always use the live issue and maintainer state as the source of truth before doing work.

Try the code: open the Python source on GitHub. The article itself is published on the Stratum Praxis domain so it can be discovered outside the bounty repository.