Open-Source Cold Email & Warmup Platform
Warmbly 是開源的冷郵件平台:溫暖您的收件箱、發送活動、並對每個回覆進行分流。可在我們的雲端運行或自行託管整個系統。
AI 翻譯
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 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.