[01]
Stack
what ships
┌─ runtime ──────────────────────────────────────────────────────────────┐
│ front end static HTML + CSS (IBM Plex Mono) │
│ charts/tables Unicode box-drawing + ASCII bars (baked at build time) │
│ JS optional snapshot re-check only (board works without it) │
│ frameworks none │
│ bundler none │
└────────────────────────────────────────────────────────────────────────┘
┌─ build / fetch ────────────────────────────────────────────────────────┐
│ language Python 3.12 (stdlib only) │
│ script scripts/snapshot.py │
│ libs urllib · json · html · pathlib · math · collections │
│ pip packages none │
│ output data/latest.json + index.html │
└────────────────────────────────────────────────────────────────────────┘
┌─ schedule / host ──────────────────────────────────────────────────────┐
│ CI GitHub Actions (ubuntu-latest, cron every 6h UTC) │
│ workflow workflows/daily-tape.yml → .github/workflows/ when live │
│ host GitHub Pages · main branch root · .nojekyll │
│ live URL https://avalidurl.github.io/clank-tape/ │
│ chain focus Base mainnet (8453) │
└────────────────────────────────────────────────────────────────────────┘
[02]
Pipeline
snapshot → board
clanker.world/api
│
├─ GET /tokens?sortBy=deployed-at&sort=desc (+ cursor pages)
├─ GET /tokens?sortBy=market-cap&sort=desc
└─ GET /tokens/trending
│
v
scripts/snapshot.py
│
├─ normalize fees (v4_lp / v4_dyn / tax_v0 → bps)
├─ aggregate creators + UTC cohorts
├─ write data/latest.json
└─ bake ASCII panels → index.html
│
v
GitHub Pages (static)
repo layout
───────────
clank-tape/
├── index.html baked board (regenerated)
├── style.css terminal CRT theme
├── data/latest.json last snapshot
├── docs/index.html this page
├── scripts/snapshot.py fetch + render
└── workflows/daily-tape.yml Actions recipe
[03]
Clanker API notes
quirks we encode
• User-Agent required (ClankTape/0.1)
• Do not pass limit= — use default page size (~10) + cursor=
• sortBy that work: deployed-at · market-cap
• Fee encodings differ by regime:
tax_v0 buyTaxRate/sellTaxRate in 1e-4 bps (1_000_000 = 100 bps = 1%)
split shares in 1e8 (100_000_000 = 100%)
v4_* clankerFee/pairedFee (and baseFee/maxFee) in 1e-2 bps
(10_000 = 100 bps); recipients[].bps sum to 10_000
• Trending token map keys may differ in checksum case → lowercase lookup
• Source of truth for fields: live payloads, not assumed SDK shapes
[04]
Hosting
Pages + Actions
GitHub Pages
source: Deploy from a branch → main / (root)
artifact: committed index.html + style.css + data/ + docs/
GitHub Actions (when workflow scope is enabled)
trigger: cron '17 */6 * * *' + workflow_dispatch
steps: checkout → python 3.12 → snapshot.py → commit data+index
Until .github/workflows/daily-tape.yml is active, refresh manually:
python3 scripts/snapshot.py && git add data index.html && git commit && git push
[05]
Local run
reproduce a tape
git clone https://github.com/avalidurl/clank-tape.git
cd clank-tape
python3 scripts/snapshot.py
# open index.html locally, or push and wait for Pages
[06]
Aeon?
agent runtime vs this board
Do we use Aeon here?
NO — not for the Daily Tape refresh.
Clank Tape refresh = deterministic Python snapshot on GitHub Actions.
Aeon (aeon.fun) = LLM agent runtime that also uses GitHub Actions, with
skills/, model secrets, and cron that *thinks*.
Use Aeon later only if you want agentic briefs/alerts on top of the tape.
Do not wrap snapshot.py in Aeon just to republish static HTML.
[07]
LLM skill
for coding agents
Stable skill URL (same pattern as Clanker):
https://avalidurl.github.io/clank-tape/skill/skill.md
Repo path: skill/skill.md
Agents: fetch that URL (or clone the repo) when working on Clank Tape,
refreshing the board, or explaining Fee Reality / cohorts / creators.