Open-Source Cold Email & Warmup Platform
Warmbly is the open-source platform for cold email: warm your mailboxes, send campaigns, and triage every reply. Run it on our cloud or self-host the whole thing.
Auto-refreshing SEO dashboard for trocglobal.com (Ahrefs API v3 + PageSpeed Insights)
Translation pending
MarketingGitHub @landingsTrocOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Auto-refreshing SEO dashboard for trocglobal.com, built on the Ahrefs API v3 and Google PageSpeed Insights.
GitHub Actions (every 6h) → scripts/fetch-data.mjs → data/latest.json → index.html
▲ ▲
encrypted Secrets server-side only
The page reads a committed JSON file. It never talks to Ahrefs directly.
Because the Ahrefs API is metered and paid, and a browser fetch requires the token to be present in client-side JavaScript — where any visitor can read it and spend your quota. There is no way to hide a key in a static page.
So data refreshes every 6 hours rather than on page load. The dashboard shows its own last-updated timestamp so the freshness is never ambiguous. If you need true on-demand refresh, the fix is a small serverless proxy (Cloudflare Worker or Vercel function) that holds the token — not client-side fetching.
Settings → Secrets and variables → Actions → New repository secret
| Secret | Required | Purpose |
|---|---|---|
AHREFS_API_TOKEN | yes | All Ahrefs metrics. Get one at https://ahrefs.com/api |
GOOGLE_API_KEY | no | Core Web Vitals via PageSpeed Insights |
GOOGLE_SERVICE_ACCOUNT_JSON | no | Search Console clicks, impressions, CTR |
Never put these in a file. They belong only in Secrets.
Search Console gives measured clicks instead of Ahrefs' modeled estimates, and the API is free and unmetered — no quota risk. A plain API key will not work:
401 — API keys are not supported by this API.
Expected OAuth2 access token or other authentication credentials.
You need a service account:
client_email from that file (…@….iam.gserviceaccount.com)GOOGLE_SERVICE_ACCOUNT_JSON secretThe connector auto-detects whether the property is registered as
sc-domain:trocglobal.com or https://trocglobal.com/. If the service account
has no access, the run logs exactly which properties it can see.
Search Console data lags 2–3 days. That is Google's pipeline, not this dashboard — no tool can show real-time GSC data. The connector requests up to three days before today for that reason.
GitHub Pages: Settings → Pages → Source: GitHub Actions.
Vercel: import the repo at https://vercel.com/new. vercel.json is already
configured — Framework Preset: Other, no build command, output directory ..
Auto-refresh still works on Vercel, because the chain is:
GitHub Actions (daily) → fetches APIs → commits data/latest.json
↓
that commit is a push to main
↓
Vercel redeploys automatically
Two things to know:
configure-pages / upload-pages-artifact / deploy-pages steps from the
workflow — the fetch-and-commit steps are what matter.Actions → Refresh SEO data → Run workflow. After it completes, the site
publishes and data/latest.json is committed.
These are properties of the data, not bugs. They are surfaced in the dashboard footer.
offset parameter — every page of results returns the same rows, so
pagination is impossible. That top 100 still covers roughly 90% of traffic, but
the long tail is genuinely unmeasured.is_branded flag is unreliable for this domain — it marks
"walmart wallpaper" as branded and "troc" as non-branded. The split is therefore
computed from an explicit regex in scripts/fetch-data.mjs; update BRAND_RE
if the brand terms change.401 — API keys are not supported by this API) and requires OAuth or a service
account. Adding real click and impression data means creating a service account
and granting it access in Search Console.An earlier dashboard reported "100% non-branded — strong organic discovery" while holding zero click data. This one refuses to render a percentage when the sample is empty, and says so instead. An empty dataset is not evidence of 100% of anything.
AHREFS_API_TOKEN=xxx node scripts/fetch-data.mjs # requires Node 18+
python3 -m http.server 8000 # then open localhost:8000
Serve over HTTP rather than opening index.html directly — fetch() is blocked
on file:// origins.