Skip to content

feat(crawlproof): what the fleet costs and what it returns, as a command - #53

Merged
ralyodio merged 1 commit into
masterfrom
crawlproof-command
Sep 6, 2026
Merged

feat(crawlproof): what the fleet costs and what it returns, as a command#53
ralyodio merged 1 commit into
masterfrom
crawlproof-command

Conversation

@ralyodio

@ralyodio ralyodio commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

crawlproof joins the other commands on every box.

crawlproof                     # the live dashboard, last day, humans
crawlproof dashboard --range=1m
crawlproof stats [site]        # who arrived and from where, as text
crawlproof dashboard --json    # the same snapshot, for a script

Five screens over three feeds that are not otherwise in the same place: the tracker for who arrived, the ad network for what was delivered, and CoinPay for what the bank actually did. ROI is monthly burn against revenue, cost per reader and break-even; Traffic ranks every site with its share of the cost; Ads is delivery on both sides; Money is earnings, bank position and invoices; Spend is who you pay, largest first.

Bare crawlproof opens the dashboard rather than printing usage — the reason to type it on a box is to look at it.

The private prefix matters more here than for hqtui

hqtui wraps a package whose executable is hqtui-demo, so the names differ. Here upstream's executable is called crawlproof and so is this wrapper. A global install would put two of them on PATH, whichever came first would win, and there is a real chance of the command exec'ing itself.

So it installs into ~/.local/share/cli-tools/vendor/crawlproof, and resolveRunner refuses to follow a PATH entry that resolves back into this repo's bin/. That refusal is load-bearing rather than defensive, and has its own test.

Credentials are reported, not enforced

A missing API token is named before handing over, because the failure it prevents is a 401 from inside a TUI — where there is nowhere good to explain anything. The CoinPay session is probed separately and never required: four of the five screens work without it, and the money panels say what is missing rather than showing zero.

Verified

Ran the wrapper end to end against production with CRAWLPROOF_BIN pointed at the built package: crawlproof stats crawlproof.com returned real numbers, reading the token from ~/.crawlproof.json with nothing exported. Bare invocation correctly refuses without a TTY and points at --json.

bin/*.ts is auto-discovered by install-links.mjs, so nothing else needs wiring.

Tests: 719 passing (17 new). npm run typecheck reports 2 errors in src/free-names.ts and src/generate-names.ts — both pre-existing, identical on master, untouched here.

Depends on

@profullstack/crawlproof being published — profullstack/crawlproof.com#241, which is stacked on #240. Until it is on npm the first run has nothing to install, so this should land alongside that publish.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HvWJ4336pxTFRdRbvsTQeD

The dashboard is @profullstack/crawlproof, published from crawlproof.com.
Nothing here reimplements it; this is the part that has to exist so
`crawlproof` is a command on a server like every other one in this repo.

Five screens over three feeds that are not otherwise in the same place: the
tracker for who arrived, the ad network for what was delivered, and CoinPay
for what the bank actually did. Bare `crawlproof` opens the dashboard, because
the reason to type it on a box is to look at it.

Installed into a private prefix on first use, and here that matters more than
it does for hqtui: upstream's executable is called `crawlproof` and so is this
wrapper. A global install would put two of them on PATH, and whichever came
first would win — with a real chance of the command exec'ing itself. The
private prefix means the name exists exactly once, and resolveRunner refuses
to follow a PATH entry that resolves back into this repository's bin/ for the
same reason. That refusal is load-bearing rather than defensive, so it has its
own test.

A missing API token is reported before handing over rather than after, because
the failure it prevents is a 401 from inside a TUI, where there is nowhere good
to explain anything. The CoinPay session is probed separately and never
required: four of the five screens work without it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvWJ4336pxTFRdRbvsTQeD
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown

ThreatCrush Security Scan

10 finding(s)

HIGH/CRITICAL: 2 | MEDIUM: 4 | LOW: 4

Severity Rule Location
HIGH sh-remote-script-execution root-ubuntu.sh:3004
HIGH sh-remote-script-execution root-ubuntu.sh:3008
MEDIUM sh-remote-script-execution root-ubuntu.sh:3157
MEDIUM sh-remote-script-execution root-ubuntu.sh:4186
MEDIUM redos-nested-quantifier src/domain-free.ts:56
MEDIUM redos-nested-quantifier src/mail.ts:1042
LOW secret-generic-credential src/credentials.ts:36
LOW secret-generic-api-key test/credentials.test.ts:208
LOW secret-generic-credential test/mail.test.ts:135
LOW secret-generic-credential test/shorten.test.ts:36

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio ralyodio mentioned this pull request Sep 6, 2026
@ralyodio
ralyodio merged commit 848c78e into master Sep 6, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant