Documents

TinkerClaw Backlink Audit

Try it

Discover all inbound links (backlinks) to a domain, subdomain, or GitHub repo, then classify each as "ours" (we created/control the source) vs "organic" (someone else). Use when the user asks to find/audit backlinks or inbound links to a site, check who links to a domain or a GitHub repo, separate self-made links from organic ones, or refresh an inbound-links graph. Wraps four sources (GitHub repo referrers, a list of URLs you found, the backlinks.sh Common-Crawl API, and a Google Search Console CSV export) behind one classify-and-report CLI. Two of the four need no account at all; the one optional API key is stored in your OS keychain and cleared by --logout. Built for the TinkerClaw fork — github.com/globalcaos/tinkerclaw. See Permissions, Data Flow & Consent.

What it does

One of dozens of skills and plugins in **TinkerClaw** — a self-improving OpenClaw fork that's been running 24/7 for months.

The skill document

One of dozens of skills and plugins in TinkerClaw — a self-improving OpenClaw fork that's been running 24/7 for months.

Who actually links to you — and how much of that did you build yourself?

Every backlink report you can buy gives you one number. That number is two very different things added together: links strangers made because your work was worth linking, and links you made because you were doing your own marketing. The first is traction. The second is homework. A tool that adds them up is telling you a flattering lie.

This one separates them. You get ours, organic, and an honest ambiguous bucket for the cases a hostname genuinely cannot settle — because a link from github.com might be your comment or a stranger's, and pretending otherwise is how a growth chart starts lying to you.

Two of the four sources need no account and no key. The one that does keeps it in your OS keychain, and hands you a --logout that actually removes it.

Overview

Finding inbound links and telling "ours" from "organic" is two jobs: (1) get a link list from a real index, (2) match each source against surfaces you control. This skill does both via scripts/backlink-audit.mjs and an editable allowlist.

Quick start

S=~/.openclaw/workspace/skills/backlink-audit/scripts/backlink-audit.mjs

# GitHub repo (works now — no extra auth; referrers, not raw backlinks)
node "$S" globalcaos/tinkerclaw --source github

# Discovered links (poor-man's backlink finder, works now): web-search the target
# term yourself, collect referring URLs, classify them — best source at small scale
node "$S" globalcaos/tinkerclaw --source urls --urls "https://a.com/x,https://b.com/y"

# Any owned domain via backlinks.sh (needs a key; 3 free calls, then ~$0.01/call)
BACKLINKS_SH_API_KEY=… node "$S" thetinkerzone.com --source backlinks --json

# Owned site, authoritative + free: export GSC Links→Top linking sites to CSV, then
node "$S" sprintpaper.com --source gsc-csv --csv ./gsc-export.csv

# Feed the Inbound-links pulse graph for one target:
node "$S" globalcaos/tinkerclaw --source github --write-state --target-key tinkerclaw

Storing the one optional credential, and taking it back:

printf %s "$BACKLINKS_SH_API_KEY" | node "$S" --login   # → OS keychain (stdin, never argv)
node "$S" --logout                                      # → clears keychain AND fallback file

Choosing a source

TargetSourceAuthCostNotes
GitHub repogithubnone (gh)freereferrers/traffic proxy, repo-scoped
Anythingurlsnonefreeclassify a list of links you found (e.g. via web search); works now, best at small scale
Owned domain, one-shotbacklinksbacklinks.sh API key3 free calls, then ~$0.01/callCommon-Crawl backlink list
Owned domain, authoritativegsc-csva CSV export (no OAuth)freeGoogle's own link report

Read references/sources.md before picking — it has the auth setup, the backlinks.sh signup/limits, how to export the GSC CSV, and the per-source caveats.

Classify: ours vs organic

Edit assets/ours-allowlist.json. A link is ours if its source host (+ optional path_prefix) matches a rule; hosts listed in ambiguous_domains with no resolving path-rule are reported ambiguous (e.g. a github.com link could be a comment you wrote or a stranger's — resolve it by hand, then pin the resolved URL in ours_urls); everything else is organic. Keep the allowlist current as new owned surfaces appear.

The shipped allowlist is the author's, kept as a worked example of the rule shapes. Replace the domains with yours.

Feed the pulse graph

--write-state --target-key writes inbound_targets..{external,ours} into inbound-campaign-state.json; the control-panel pollers render it (solid=external, dashed=ours, one hue per target). Ambiguous links are excluded from the written counts. Without --write-state the tool writes nothing at all — it just prints.

At small scale, crawl indexes (backlinks.sh/Common Crawl) return ~0 for new sites, so the search strategy is the workhorse. To count inbound links to a target:

  1. Web-search the target term several ways: "github.com/globalcaos/tinkerclaw", tinkerclaw, "thetinkerzone.com", plus site: excluded variants to find third-party mentions.
  2. Collect the distinct referring URLs (one page = one backlink; dedupe).
  3. node scripts/backlink-audit.mjs --source urls --urls "u1,u2,…" → ours/organic/ambiguous counts.
  4. --write-state --target-key to push the count to the graph.

scripts/build-history.mjs writes dated cumulative ours observations so the graph shows real growth, not just today. Its dataset is derived (not invented) from:

  • Authored GitHub comments: gh api repos//issues//comments, filter by your login, body contains your URL → dated by each thread's first backlink-bearing comment (one thread = one linking page).
  • git log -S "" in the linking repo → when an outbound link to your site (e.g. README→yourdomain.com) first went live.

Re-derive by re-running those two mines, updating SERIES in the script, and re-running it.

Two things to know before you run it. The SERIES in the file is the author's dataset, shipped as a worked example of the shape and the provenance discipline — replace it with yours or your graph will show someone else's history. And it is opt-in: bare (or with --dry-run) it prints exactly what it would write and writes nothing; --yes is what actually sends the points to your control-panel store.

Short version: this reads public link data, classifies it against a list you edit, and prints the result. Two of its four sources never touch the network. The one credential it can use is optional, keychain-first, and revocable. Longer version, because you should not have to take that on trust:

What data it touches. Referring URLs — from the GitHub traffic API, from a list you paste, from a CSV you exported, or from backlinks.sh. Plus the allowlist you edit. That is the whole input surface. It does not read your repos, your mail, your browser, your shell history or your source tree.

What leaves your machine. Only what the source you picked requires:

  • --source urls and --source gsc-csv: nothing. Fully offline; the CSV is parsed locally.
  • --source github: the gh CLI you already authenticated calls api.github.com for your repo's referrer list.
  • --source backlinks: one HTTPS GET to https://api.backlinks.sh/v1/backlinks?target= with your API key in an x-api-key header. The URL is a constant in the script, not something the target string can redirect.

There is no telemetry, no analytics, no "phone home", and no other endpoint anywhere in the code.

What it costs. Nothing, except --source backlinks: backlinks.sh gives 3 free calls, then charges roughly $0.01 per call. Every other source is free. Nothing subscribes you to anything.

What credentials it reads. One, optional: your backlinks.sh API key, and only for --source backlinks. Resolution order is most-private-first — BACKLINKS_SH_API_KEY (transient, nothing on disk) → your OS keychain (secret-tool on Linux, security on macOS; service backlinks-sh, account api-key) → ~/.config/backlinks-sh/credentials.json, a mode-0600 fallback that prints a warning every single time it is used, and warns again if its permissions are looser than 0600. --login reads the key from stdin, never from argv, because argv is visible in ps. One honest caveat: on macOS, security only accepts the secret as an argument, so during that one call it is briefly visible to your own other processes. Linux does not have this problem.

The off switch. node scripts/backlink-audit.mjs --logout clears the keychain entry and deletes the fallback file, tells you which of the two actually existed, and reminds you if BACKLINKS_SH_API_KEY is still set in your environment (it cannot reach into your shell to unset it). Local removal does not revoke the key server-side — rotate or delete it in your backlinks.sh account at https://backlinks.sh.

What it needs, and why.

CapabilityWhyScope
NetworkFetch the link listapi.backlinks.sh (constant URL) and api.github.com via gh — only for those two sources
Local shell execgh, secret-tool/security, openclawargv arrays, no shell interpreter, no string interpolation
Env readBACKLINKS_SH_API_KEYthat one variable; no env file is sourced
Credential readbacklinks.sh API keykeychain first, warned 0600 file as fallback; sent only to api.backlinks.sh
File readAllowlist, your --csv / --urls-file, the credentials file, the state filethe paths you name, plus those two fixed ones
File write--write-state state file; --login fallback credentials file; build-history.mjs --yesall three are opt-in; nothing is written on a plain run
File delete--logout removes the credentials filethat single path — no recursive or glob delete exists in the skill

The consent steps, and what each is protecting you from:

node "$S"  --source urls --urls "…"              # reads nothing, writes nothing, sends nothing
node "$S"  --source backlinks                    # spends a paid API call, sends your key
node "$S"  --source github --write-state --target-key k   # writes one JSON file under ~/.openclaw
node scripts/build-history.mjs                           # DRY RUN — prints what it would write
node scripts/build-history.mjs --yes                     # actually writes to your control-panel store
node "$S" --logout                                       # removes the stored key

Read it before you run it. scripts/backlink-audit.mjs is ~250 lines of plain Node and scripts/build-history.mjs about 90. Every claim above is visible in them. That is the whole security model: short enough to audit over a coffee.

Honest limits

  • No SEO tool isolates a path on github.com → repos only get referrer data, not raw backlinks.
  • Free backlink web UIs (OpenLinkProfiler, Semrush, Majestic) are JS-rendered with no free API; not scriptable here.
  • New/small sites have thin coverage in any crawl index — expect sparse results until they accrue links.
  • The ambiguous bucket is a real answer, not a failure. A hostname alone cannot tell your comment from a stranger's; resolving it takes a human, and the tool refuses to guess in your favour.

Part of TinkerClaw — real-time token tracking, self-improving crons, persistent cognitive memory. This is one piece of that stack; the repo has dozens more.

👉 https://github.com/globalcaos/tinkerclaw

Clone it. Fork it. Break it. Make it yours.

Related skills

Post videos, photos, text, and documents to 10 social platforms through a single REST API call.

by victorcavero14375 installs50 stars

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván555 installs18 stars

Query Twitter/X profiles, tweets, follower events, and KOL data through the 6551 REST API.

by infra403840 installs27 stars

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants4.3k installs296 stars

More from globalcaos

Browse all skills

Give your OpenClaw agent a JARVIS-style British voice with matching dry humor, audio plus a purple chat bubble in one call.

by globalcaos190 installs4 stars

Native WhatsApp channel for OpenClaw with 22 messaging/group actions plus Protocol v2 multi-agent coordination.

by globalcaos116 installs3 stars

One dashboard tracking Anthropic, Gemini, OpenAI, and Manus token usage with budget alerts and a local REST API.

by globalcaos59 installs

Stop sending 'format this JSON' to Opus. Stop sending 'cron job' to GPT. Billing-aware routing guide for choosing among the models already configured in your OpenClaw setup when assigning an agent, sub-agent or cron task — flat-rate first, metered only when justified, budget pressure respected. Not for picking models outside your configuration, and not a runtime proxy.

by globalcaos16 installs

Your agent says 'done' — but did it check? Superpowers turns any OpenClaw agent into a disciplined engineer. Verification iron law (evidence before claims), three-agent code review (build → verify spec → verify quality), systematic debugging (4-phase root cause, three-strike rule), brainstorming gates (design before code), and anti-over-engineering rules. Use when: (1) coding tasks of any complexity, (2) debugging failures, (3) about to claim work is complete, (4) spawning sub-agents, (5) planning features, (6) reviewing code. Inspired by top coding agent methodologies, adapted for OpenClaw multi-agent architecture.

by globalcaos14 installs

Read and search Outlook, inspect attachments, and create or edit drafts without any send endpoint. Uses one short-lived Microsoft Graph access token supplied on stdin for one run; it never stores credentials. Bulk mailbox export is opt-in.

by globalcaos23 installs