Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 6 additions & 10 deletions .github/workflows/canary.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
name: canary

# One real run a day against opensea.io, and the only workflow in this repo
# One real run a week (Mondays) against opensea.io, and the only workflow in this repo
# that touches the site. tests.yml (deliberately) never does — see its own
# header for why the two are separate.
#
# THIS CANARY NEEDS NO SECRETS, AND THAT IS THE POINT
# ---------------------------------------------------
# A canary that cannot pass must SKIP rather than go red every day,
# A canary that cannot pass must SKIP rather than go red on every run,
# because a check that is always red teaches everyone to ignore checks. The
# other half of that rule: a canary that CAN pass without a
# credential should never be gated on one.
Expand All @@ -15,7 +15,7 @@ name: canary
# (AS24940) on 2026-09-17: every page kind, every mode and every locale
# answered HTTP 200 with no key, no proxy and no account, and OpenSea's own
# GraphQL endpoint — which is where every page after the first comes from —
# answered an anonymous POST. So this runs a real three-mode scrape daily
# answered an anonymous POST. So this runs a real three-mode scrape weekly
# from a bare GitHub runner and is EXPECTED GREEN.
#
# That is not a convenience. It is what keeps the README's central claim
Expand Down Expand Up @@ -48,10 +48,6 @@ on:
schedule:
# 06:20 UTC. Off the hour, because everything else in the world runs on
# it and a queued runner adds nothing but latency.
- cron: "20 6 * * *"
# Mondays: the same jobs, WITH the paid secrets (proxy, Scraping Browser,
# captcha key). On the daily run above those secrets read as empty, so
# it takes the free no-secret route and bills nothing.
- cron: "20 6 * * 1"
workflow_dispatch:

Expand Down Expand Up @@ -82,7 +78,7 @@ jobs:
- name: Walk a collection's items
id: items
env:
OPENSEA_PROXY: ${{ (github.event_name != 'schedule' || github.event.schedule == '20 6 * * 1') && secrets.OPENSEA_PROXY || '' }}
OPENSEA_PROXY: ${{ secrets.OPENSEA_PROXY }}
# `set +e`: GitHub runs `run:` steps under `bash -e`, so a non-zero
# command aborts the step BEFORE the following echo, and
# continue-on-error does not change that — it stops the step failing
Expand Down Expand Up @@ -248,7 +244,7 @@ jobs:
- name: Scrape OpenSea's own ranking
id: ranking
env:
OPENSEA_PROXY: ${{ (github.event_name != 'schedule' || github.event.schedule == '20 6 * * 1') && secrets.OPENSEA_PROXY || '' }}
OPENSEA_PROXY: ${{ secrets.OPENSEA_PROXY }}
run: |
set +e
python3 playwright_scraper.py \
Expand Down Expand Up @@ -328,7 +324,7 @@ jobs:
- name: Scrape a collection's sales feed
id: activity
env:
OPENSEA_PROXY: ${{ (github.event_name != 'schedule' || github.event.schedule == '20 6 * * 1') && secrets.OPENSEA_PROXY || '' }}
OPENSEA_PROXY: ${{ secrets.OPENSEA_PROXY }}
run: |
set +e
python3 playwright_scraper.py \
Expand Down
4 changes: 1 addition & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ was written, because anyone can read it with `git show v0.1.0:CHANGELOG.md`.

### Changed

- CI only: the canary's optional paid secret `OPENSEA_PROXY` now reaches it only on a new weekly
run (Mondays 06:20 UTC) and on a manual dispatch. The daily run keeps its
schedule and takes the free route without them, so it bills nothing.
- CI only: the canary now runs weekly (Mondays 06:20 UTC) and on a manual dispatch, with its optional secret `OPENSEA_PROXY` passed on every run; the daily schedule is removed.

## [0.2.0] - 2026-10-16

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ sales feed of only sales. Two unrelated datacentre networks, one afternoon.
So the paid products here buy **volume from many addresses, a specific
country, browser infrastructure you do not run, and a solver for the day
Cloudflare does issue its managed challenge** — not access. The
[canary](#the-canary) re-runs that scrape every morning, precisely so that
[canary](#the-canary) re-runs that scrape every Monday, precisely so that
this claim is retested without anyone remembering to.

---
Expand Down Expand Up @@ -474,7 +474,7 @@ row one of them lacks would read as `removed`.
## The canary

`.github/workflows/canary.yml` runs a real three-mode scrape against
opensea.io every morning **with no secrets**, and is expected green. It
opensea.io every Monday **with no secrets**, and is expected green. It
asserts pagination reached at least three pages, that the price ladder
ascends and its priced rows match OpenSea's own `listedItemCount`, that ranks
are contiguous across pages, that `--activity sales` returns only sales, and
Expand Down
Loading